集成学习模型与R语言实现

随着机器学习领域的不断发展,计算能力的提升和数据量的增加,面临着一个挑战:如何通过单一框架来提高预测能力。在这种情况下,集成学习模型应运而生,它遵循“团结就是力量”的原则,即通过组合多样化的基础模型来强化弱模型。集成技术的成功案例遍布多个领域,如推荐系统、异常检测、流媒体挖掘和网络应用等,这些领域都需要结合竞争模型的需求。

如果想体验集成学习的强大之处,可以尝试将有监督和无监督模型用于单一任务,并将它们的结果合并。会发现,合并后的结果性能更佳。上周,讨论了通过神经网络集成多个学习器的简单方法。本文将采用另一种方法(使用R语言)来解决相同的问题,同时在集成过程中提供更高的控制力。利用了康奈尔大学论文中讨论的技术“从模型库中选择集成”,其基本原理是:多样化且高性能模型的集成优于单个模型。

集成过程中涉及的原则

前向选择学习器:想象一下,有1000个学习器的输出。从一个空集合开始,然后在每次迭代中添加一个新的学习器,以提高集合的性能指标。

有放回选择:在选择新的集合成员时,从1000个学习器中随机抽取最佳者。即使一个学习器被认定为合适的,仍然会在下一次迭代中使用这个学习器。

集成模型的装袋:集成学习器容易过拟合。为了避免这种情况,采用样本来尝试集成。完成后,再次使用另一个样本。最后,使用简单平均预测值或最大投票数将这些模型装袋在一起。

理解R代码

# 第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) }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485