1.前言
Kaglle比赛中使用Stacking模型是非常常见的大杀器,这是为什么呢?
【机器学习大杀器】Stacking堆叠模型
1.前言
2.Model 3: Stacking model
2.1 description of the algorithms:
2.2 interpretation of the estimated models:
3. Extend
3.1 code sample
3.2 the coefficient of last mode
2.Model 3: Stacking model
===============================================
Include three models:
=================
- Lasso;
- Random Forest;
- Gradient Boost.
==============================================================
2.1 description of the algorithms:
当我们得到了3个鲁棒性相当但各自不同的模型时,这个时候我们该选择哪个模型?我想这是一件非常为难的事情,但通过集成学习的方法,我们可以轻松的将这3个模型合成为1个汲取了各个模型优点的更好的模型。Stacking正是这样一种策略,用于融合模型。
2007 年,堆叠的理论背景被开发出来,并且当算法采用了更酷的名称Super Learner (Van der Laan、Polley 和 Hubbard 2007)。此外,作者说明Super Learner将学习Basic Learner预测的最佳组合,并且通常表现得与构成堆叠集成的任何单个模型一样好或更好。直到此时,堆叠工作的数学原因尚不清楚,堆叠被认为是一门黑色艺术。
但毫无疑问,**模型堆叠(Stacking)**是一种有效的集成方法,其中使用各种机器学习算法生成的预测被用作第二层学习算法的输入。该第二层算法经过训练,可以优化组合模型预测以形成一组新的预测。例如,当线性回归用作第二层建模时,它通过最小化最小二乘误差来估计这些权重。但是,第二层建模不仅限于线性模型;预测变量之间的关系可能更复杂,从而为采用其他机器学习算法打开了大门。
本实验中,我们正是使用了这样一个堆叠策略,使得我们模型的效果大幅度提升,我们在模型的第一层堆叠的模型有三个:{1.Lasso, 2.Random Forest, 3.Gradient Boost}, 且使用Linear Regression作为第二层模型。
2.2 interpretation of the estimated models:
Stacking一般由两层组成。第一层:表现出色的基本模型(可以有多个);第二层:将第一层模型们的输出作为训练集得到的模型。第二层模型又被称作”meta-model“关键作用在于将第一层的所有模型的结果整合起来,进行输出。也就是说,第二层模型将第一层模型的输出作为特征进行训练。
Stacking的整体步骤如下:
- 把原始数据切分成两部分:训练集D-train与测试集D-test,训练集部分用来训练整体的Stacking集成模型,测试集部分用来测试集成模型。
- 该步骤有训练和测试:
- 训练 Stacking是基于交叉验证的,以五折交叉验证为例子,把训练集D-train分成五部分,训练五次,每一次选取一个没有选取过的部分作为验证集,如下图所示。其中,Learn对应Training folds,用来训练初级学习器;下图中的Predict对应Validation fold,用来通过初级训练器得到五个预测结果Predictions_Train={p1,p2,p3,p4,p5},这些预测结果将合并在一起又变成一个新的训练集将用来训练次级学习器Model2。
-
测试 训练五次也要测试五次,每次训练完一次模型后,也对测试集的数据进行测试, 最后得到了五个预测测试集结果,将五个预测结果取平均值作为该层模型的最终预测结果 Predictions_Test={p1,p2,p3,p4,p5},下一层的模型将把在新的测试集Predictions_Train上测试。
3. 如果第一层堆叠了n个模型,那么将每个模型都进行步骤3的操作,最终得到了n个Predictions_Train 和Predictions_Test ,将n个Predictions_Train作为特征值投入第二层模型进行训练,训练完毕后,再使用第二层模型对测试集进行预测,最后把n+1个Predictions_Test合并结果当做最终预测结果。
3. Extend
3.1 code sample
from sklearn.ensemble import StackingRegressor
models = [('Lasso', lo), ('Random Forest', rf), ('Gradient Boost', gb_boost)]
stack = StackingRegressor(models, final_estimator=LinearRegression(positive=True), cv=5, n_jobs=4)
stack.fit(x_train, y_train)
stack_log_pred = stack.predict(x_test)
print(stack_log_pred)
stack_pred = np.exp(stack_log_pred)
plt.barh(np.arange(len(models)), stack.final_estimator_.coef_)
plt.yticks(np.arange(len(models)), ['Linear Regression', 'Random Forest', 'Gradient Boost']);
plt.xlabel('Model coefficient')
plt.title('Figure 4. Model coefficients for our stacked model');
3.2 the coefficient of last model
为了更加深入了解Stacking干了什么,我们打印了我们使用skleran训练完成后的Stacking模型最后一层也就是第二层Linear Regression模型系数,如下图所示:
高和正的Linear Regression模型的系数的值coef_意味着更强的关系,通过上图得知我们合并的三个模型在Stacking中各自发挥作用重要性的比例是8:2:0,可见Gradient Boost对模型整体的预测结果影响是最大的。