随着机器学习领域的不断发展,计算能力的提升和数据量的增加,面临着一个挑战:如何通过单一框架来提高预测能力。在这种情况下,集成学习模型应运而生,它遵循“团结就是力量”的原则,即通过组合多样化的基础模型来强化弱模型。集成技术的成功案例遍布多个领域,如推荐系统、异常检测、流媒体挖掘和网络应用等,这些领域都需要结合竞争模型的需求。
如果想体验集成学习的强大之处,可以尝试将有监督和无监督模型用于单一任务,并将它们的结果合并。会发现,合并后的结果性能更佳。上周,讨论了通过神经网络集成多个学习器的简单方法。本文将采用另一种方法(使用R语言)来解决相同的问题,同时在集成过程中提供更高的控制力。利用了康奈尔大学论文中讨论的技术“从模型库中选择集成”,其基本原理是:多样化且高性能模型的集成优于单个模型。
前向选择学习器:想象一下,有1000个学习器的输出。从一个空集合开始,然后在每次迭代中添加一个新的学习器,以提高集合的性能指标。
有放回选择:在选择新的集合成员时,从1000个学习器中随机抽取最佳者。即使一个学习器被认定为合适的,仍然会在下一次迭代中使用这个学习器。
集成模型的装袋:集成学习器容易过拟合。为了避免这种情况,采用样本来尝试集成。完成后,再次使用另一个样本。最后,使用简单平均预测值或最大投票数将这些模型装袋在一起。
# 第1步:加载训练和测试文件
train <- read.csv("train_combined.csv")
test <- read.csv("test_combined.csv")
# 第2步:指定基本指标,如袋子/迭代次数,学习器/模型数量
num_models <- 24
itertions <- 1000
# 第3步:加载性能指标所需的库(可选)
library(Metrics)
# 第4步:计算模型的个体性能,以建立基准
rmsle_mat <- matrix(0, num_models, 2)
rmsle_mat[, 2] <- 1:num_models
for (i in 1:num_models) {
rmsle_mat[i, 1] <- rmsle(train[, i], train[, num_models + 1])
print(rmsle(train[, i], train[, num_models + 1]))
}
best_model_no <- rmsle_mat[rmsle_mat[, 1] == min(rmsle_mat[, 1]), 2]
rmsle(train[, best_model_no], train[, num_models + 1])
# 第5步:使用所有指定的指标,在1000个袋子中应用前向选择和有放回
x <- matrix(0, 1000, itertions)
prediction_test <- matrix(0, nrow(test), 1)
prediction_train <- matrix(0, nrow(train), 1)
for (j in 1:itertions) {
rmsle_in <- 1
rmsle_new <- matrix(0, num_models, 2)
rmsle_new[, 2] <- 1:num_models
print(j)
t = 1
set.seed(j * 121)
train1 <- train[sample(1:nrow(train), 10000, replace = FALSE), ]
for (i in 1:num_models) {
rmsle_mat[i, 1] <- rmsle(train1[, i], train1[, num_models + 1])
}
best_model_no <- rmsle_mat[rmsle_mat[, 1] == min(rmsle_mat[, 1]), 2]
prediction <- train1[, best_model_no]
prediction_1 <- test[, best_model_no]
prediction_2 <- train[, best_model_no]
x[t, j] <- best_model_no
while (-1 < 0) {
t <- t + 1
prediction1 <- prediction
for (i in 1:num_models) {
prediction1 <- ((t * prediction) + train1[, i]) / (t + 1)
rmsle_new[i, 1] <- rmsle(prediction1, train1[, num_models + 1])
}
rmsle_min <- min(rmsle_new[, 1])
model_no <- rmsle_new[rmsle_new[, 1] == min(rmsle_new[, 1]), 2]
if (rmsle_in < rmsle_min) { break } else {
rmsle_in <- rmsle_min
prediction <- (((t - 1) * prediction) + train1[, model_no]) / t
prediction_1 <- (((t - 1) * prediction_1) + test[, model_no]) / t
prediction_2 <- (((t - 1) * prediction_2) + train[, model_no]) / t
x[t, j] <- model_no
print(rmsle_in)
}
}
prediction_test <- cbind(prediction_test, prediction_1)
prediction_train <- cbind(prediction_train, prediction_2)
}