模型整合之模型堆叠——详细理解Stacking model

Stacking是一种有效的集成学习方法,通过结合多个模型的预测来创建更准确的预测。本文详细介绍了Stacking的概念,包括无Cross-Validation Stacking和Cross-Validation Stacking的工作流程,以及如何选择和评估Meta-Classifier。Stacking通过减少过拟合风险,提升了模型的泛化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细理解Stacking model

如果你得到了10个不一样的model,并且每个model都各有千秋,这个时候你该怎么选?想必你一定是很为难吧,但通过集成方法,你可以轻松的将10个model合成为1个预测更精确的model。今天要介绍的就是众多集成方法里面的"Stacking"

什么是Stacking?

Leo Breiman 以他在分类和回归树以及随机森林方面的工作而闻名,他在 1996 年关于堆叠回归的论文 (Breiman 1996 b )中将堆叠形式化。尽管这个想法起源于(Wolpert 1992),名为“Stacked Generalizations”,但使用内部 k-fold CV 的现代堆叠形式是 Breiman 的贡献。

(Wolpert的文章获取:https://www.researchgate.net/publication/222467943_Stacked_Generalization)

然而,直到 2007 年,堆叠的理论背景才被开发出来,并且当算法采用了更酷的名称Super Learner (Van der Laan、Polley 和 Hubbard 2007)。此外,作者说明超级学习者将学习基础学习者预测的最佳组合,并且通常表现得与构成堆叠集成的任何单个模型一样好或更好。直到此时,堆叠工作的数学原因尚不清楚,堆叠被认为是一门黑色艺术。

**模型堆叠(Stacking)**是一种有效的集成方法,其中使用各种机器学习算法生成的预测被用作第二层学习算法的输入。该第二层算法经过训练,可以优化组合模型预测以形成一组新的预测。例如,当线性回归用作第二层建模时,它通过最小化最小二乘误差来估计这些权重。但是,第二层建模不仅限于线性模型;预测变量之间的关系可能更复杂,从而为采用其他机器学习算法打开了大门。

在这里插入图片描述

在这里插入图片描述

一般来说,Stacking由两层组成就够了。但完全可以由多层组成,其中一些层可以用作噪声的处理等等。其实不难发现,多层的Stacking与Deep learning是有点相似的。

All in all ,Stacking一般由两层组成。第一层:表现出色的基本模型;第二层:将第一层模型们的输出作为训练集得到的模型。第二层模型又被称作”meta-model

“,关键作用在于将第一层的所有模型的结果整合起来,进行输出。也就是说,第二层模型将第一层模型的输出作为特征进行训练。

在这里插入图片描述

不同种类的Stacking

在Stacking的实际应用中&

### Layer Stacking 的概念与实现 Layer stacking 是一种模型集成技术,在机器学习和深度学习框架中被广泛应用。它通过构建多层的子模型来逐步提升预测性能,每一层都基于前一层的结果进行训练并改进最终输出。 #### 基本原理 Stacking 方法的核心在于利用多个基础模型(base models)的预测结果作为输入特征,传递给更高层次的元模型(meta-model)。这种分层结构允许更复杂的模式识别以及更高的泛化能力[^1]。 #### 实现步骤概述 以下是使用 Python 和常见库如 Scikit-Learn 或 TensorFlow/Keras 来实现 layer stacking 的方法: 1. **定义基础模型** 首先创建一组不同的基础分类器或回归器。这些可以是线性模型、树状模型或其他任何适合任务需求的选择。 2. **生成交叉验证数据集** 使用 k-fold 交叉验证机制运行每一个基础模型,并保存它们对于测试折上的预测值。这一步骤确保了无偏估计并且防止过拟合现象的发生。 3. **训练元模型** 将上一阶段得到的基础模型预测结果组合成新的特征矩阵,以此为基础训练一个或者多个高级别的元模型。 4. **评估整体堆叠架构的表现** 对整个 stack 进行最后的整体评价,确认其相对于单一最佳基底模型是否有显著改善。 下面给出一段具体的代码示例展示如何在 scikit-learn 中完成上述过程: ```python from sklearn.model_selection import KFold, cross_val_predict from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC import numpy as np def get_stacked_data(X_train, y_train, base_models): """Generate stacked features.""" kf = KFold(n_splits=5) meta_features = None for model in base_models: oof_pred = [] for train_index, val_index in kf.split(X_train): X_trn, X_val = X_train[train_index], X_train[val_index] y_trn = y_train[train_index] mdl = clone(model) mdl.fit(X_trn, y_trn) pred = mdl.predict_proba(X_val)[:,1].reshape(-1,1) oof_pred.append(pred) full_oof_preds = np.vstack(oof_pred) if meta_features is not None: meta_features = np.hstack([meta_features,full_oof_preds]) else: meta_features = full_oof_preds return meta_features # Example usage of function above. if __name__ == "__main__": # Define some simple classifiers that will act as our 'level-0' estimators. lr_clf = LogisticRegression() dtree_clf = DecisionTreeClassifier(max_depth=7) svm_clf = SVC(probability=True,C=1,kernel='linear') level_0_estimators=[lr_clf,dtree_clf,svm_clf] # Assume we already have `X` and `y`. X_meta = get_stacked_data(X,y,level_0_estimators) # Now fit a final estimator using these new transformed features. logreg_final_estimator = LogisticRegression().fit(X_meta, y) ``` 此脚本展示了如何建立简单的两层 stacking 架构——其中第一层由三种不同类型的算法组成;第二层则是一个逻辑回归分析仪负责整合来自底层的信息做出最终决策。 #### 注意事项 尽管 stacking 能够带来更好的表现效果,但也需要注意几个方面: - 数据泄露风险:如果处理不当可能会引入泄漏问题从而影响真实世界应用中的可靠性; - 计算成本增加:由于涉及多次迭代计算所以耗时较长尤其当样本量较大时更为明显; - 参数调优复杂度上升:随着层数增多调整超参数变得更加困难。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值