在机器学习领域,集成学习是一种强大的技术,它通过组合多个模型来提高预测的准确性和稳定性。本文将分享一个关键技巧,教如何选择适合集成过程的模型。
设想正在处理一个分类问题,已经构建了1000个机器学习模型,每个模型的AUC值在0.7到0.75之间。任务是通过简单地将这些模型组合起来,构建一个更稳定、更具预测性的模型。
目标是结合一组高性能且多样化的模型,以获得一个具有更高稳定性和性能的模型。这里有两个关键点需要注意:
可以通过多种性能指标来衡量模型的表现,例如KS统计量、AUC-ROC、提升度等。选择哪种性能指标取决于具体的业务问题。无论选择哪种指标,都应该用于跟踪集成过程。
至于模型的多样性,虽然没有完美的解决方案,但可以通过多种方法引入多样性。常用的方法包括相关系数(皮尔逊或斯皮尔曼)、预测类别的百分比重叠、二进制的卡方值等。在本文中,将选择KS统计量作为性能指标,皮尔逊系数作为多样性指标。
虽然没有完美的算法来选择正确的模型集合,但本文提供了一种非常有效的寻找合适模型集合的方法。以下是逐步方法及相关代码:
首先计算单个模型的性能。可以使用以下代码:
# 假设train是一个包含1002列的表格:第1列是行ID,2:1001列是各个模型的预测结果,1002列是目标分类变量。
train_ks <- 1:1000
for (i in 2:1001) {
train_ks[i-1] <- max(ks_compute(train[,i],train[,1002])[10])} # ks_compute是一个本地编写的函数,可以用R内置的AUC ROC替换。
让有效地引用模型。以下是实现这一点的强大方法:
sno <- 2:1001
train_ks_table <- cbind(sno,train_ks)
train_ks_table <- train_ks_table[order(-train_ks_table[,2]),]
train_order <- c(1,train_ks_table[,1],1002)
train_sorted <- train[,train_order]
从最强大的模型开始,然后:
models_selected <- colnames(train_sorted)[2:3]
limit_corr <- 0.75
在这里,使用性能和多样性因素(皮尔逊系数)进行最终比较:
for (i in 3:1000) {
choose = 1
for (j in 1:length(models_selected)) {
correlation <- cor(train_sorted[,i],train_sorted[,models_selected[j]])
choose <- ifelse(correlation > limit_corr,0,1*choose)
}
if(choose == 1) {
models_selected <- c(models_selected,colnames(train_sorted)[i])
}
}
选择了模型序列后,现在是时候添加每个组合并检查它们的性能了。
train_ks_choose <- rep(1,length(models_selected))
predictions_train <- apply(train_sorted[,2:3],1,mean)
model_considered = 0
for (j in 1:length(models_selected)){
predictions_train <- (model_considered*predictions_train + train_sorted[,models_selected[j]])/(model_considered + 1)
train_ks_choose[j] <- max(ks_compute(predictions_train,train[,462])[10]) #38.49%
model_considered = model_considered + 1
}
ks_table <- cbind(train_ks_choose,itv1_ks_choose,itv2_ks_choose)
write.csv(ks_table,"ks_table.csv")