集成学习:提升模型鲁棒性

机器学习领域,集成学习是一种通过结合多个模型的预测来提高整体性能的技术。这种方法的核心思想是“整体大于部分之和”,即当各个独立的部分组合成一个整体时,其价值大于各部分单独存在时的价值。这种思想在堆叠(stacking)技术中得到了很好的体现,堆叠技术通过结合不同模型的预测来获得更好的性能。

什么是堆叠?

堆叠是一种集成学习方法,它将不同模型的技能结合起来,对给定数据进行预测。利用这种方法结合多个算法的优势,以获得比单一回归器更稳定、方差更小的预测结果。

在堆叠的模型中,可以看到两个层次:

  • Level 0 - 在同一数据集上训练不同的模型,然后进行预测。
  • Level 1 - 将不同模型的预测结果泛化,得到最终输出。最常见的泛化方式是取所有Level 0模型预测的平均值作为最终输出。

如何创建自己的堆叠回归器

将以Kaggle上著名的房价预测数据集为例,目标是根据数据集中的多个特征来预测房价。将训练不同的基础模型,并使用k折交叉验证来评估所有模型在给定数据集上的性能(RMSE)。

以下是一个名为rmse_cv的函数,用于在数据的5个折叠中训练所有单独的模型,并根据折叠外的预测与实际预测比较,返回模型的RMSE分数。

将使用k折交叉验证来训练不同的基础模型,并查看它们在给定数据集上的性能(RMSE)。

以下是一些基础模型的性能评估结果:

  • Lasso模型的RMSE分数为0.1115。
  • ElasticNet模型的RMSE分数为0.1116。
  • Kernel Ridge回归模型的RMSE分数为0.1153。
  • Gradient Boosting模型的RMSE分数为0.1177。
  • XGBoost模型的RMSE分数为0.1161。
  • LightGBM模型的RMSE分数为0.1157。

从这种简单的平均基础模型方法开始。构建一个新的类来扩展scikit-learn,并利用封装和代码重用。

class AveragingModels(BaseEstimator, RegressorMixin, TransformerMixin): def __init__(self, models): self.models = models def fit(self, X, y): self.models_ = [clone(x) for x in self.models] for model in self.models_: model.fit(X, y) return self def predict(self, X): predictions = np.column_stack([ model.predict(X) for model in self.models_ ]) return np.mean(predictions, axis=1)

这个方法克隆了所有作为参数传递的基础模型,然后在完整数据集上训练克隆的模型。

在这种方法中,将训练所有的基础模型,并使用基础模型的预测(折叠外预测)作为元模型的训练特征。元模型用于发现基础模型预测作为特征与实际预测作为目标变量之间的模式。

步骤如下:

  1. 将数据分为训练集和保留集。
  2. 在训练数据上训练所有的基础模型。
  3. 在保留集上测试基础模型并存储预测(折叠外预测)。
  4. 使用基础模型的折叠外预测作为输入特征,正确的输出作为目标变量来训练元模型。

前三个步骤将根据k的值进行迭代。如果k=5,那么将在4个折叠上训练模型,并在保留集(第5个折叠)上进行预测。重复这个步骤k次(这里,k=5)将为整个数据集提供折叠外预测。这将为所有基础模型完成。然后,元模型将使用所有模型的折叠外预测作为X,原始目标变量作为y进行训练。元模型的预测将被视为最终预测。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485