5.1 模型融合目标

  • 对于多种调参完成的模型进行模型融合。

5.2 内容

模型融合是比赛后期一个重要的环节,大体来说有如下的类型方式。

1. 简单加权融合:

  • 回归(分类概率):算术平均融合(Arithmetic mean),几何平均融合(Geometric mean);
  • 分类:投票(Voting)
  • 综合:排序融合(Rank averaging),log融合
  1. stacking/blending:
  • 构建多层模型,并利用预测结果再拟合预测。
  1. boosting/bagging(在xgboost,Adaboost,GBDT中已经用到):
    多树的提升方法

5.3 Stacking相关理论

1) 什么是 stacking

简单来说 stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。
二手车交易价格预测-task5-模型融合

结合策略:

将个体学习器结合在一起的时候使用的方法
投票法
平均法

对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值
有一种结合策略是使用另外一个机器学习算法来将个体机器学习器的结果结合在一起,这个方法就是Stacking

2) 如何进行 stacking

算法示意图如下:二手车交易价格预测-task5-模型融合

  • 过程1-3 是训练出来个体学习器,也就是初级学习器。
  • 过程5-9是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。
  • 过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。

3)Stacking的方法讲解

首先,我们先从一种“不那么正确”但是容易懂的Stacking方法讲起。

Stacking模型本质上是一种分层的结构,这里简单起见,只分析二级Stacking.假设我们有2个基模型 Model1_1、Model1_2 和 一个次级模型Model2

Step 1. 基模型 Model1_1,对训练集train训练,然后用于预测 train 和 test 的标签列,分别是P1,T1

Model1_1 模型训练:
(Xtrain) Model 1,1[YTrue) \left(\begin{array}{c} \vdots \\ X_{\text {train}} \\ \vdots \end{array}\right) \stackrel{\text { Model } 1,1}{\Longrightarrow}\left[\begin{array}{c} \vdots \\ Y_{\text {True}} \\ \vdots \end{array}\right)
训练后的模型 Model1_1 分别在 train 和 test 上预测,得到预测标签分别是P1,T1
(Xtrain) Model 1 1 Predict (P1)(Xtest) Modell 1 Predict (T1) \begin{aligned} &\left(\begin{array}{c} \vdots \\ X_{\text {train}} \\ \vdots \end{array}\right) \stackrel{\text { Model } 1 \text { 1 Predict }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ P_{1} \\ \vdots \end{array}\right)\\ &\left(\begin{array}{c} \vdots \\ X_{\text {test}} \\ \vdots \end{array}\right) \stackrel{\text { Modell } 1 \text { Predict }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ T_{1} \\ \vdots \end{array}\right) \end{aligned}

Step 2. 基模型 Model1_2 ,对训练集train训练,然后用于预测train和test的标签列,分别是P2,T2

Model1_2 模型训练:
(Xtrain) Model 1 - Train (YTrue) \left(\begin{array}{c} \vdots \\ X_{\text {train}} \\ \vdots \end{array}\right) \stackrel{\text { Model } 1 \text { - Train }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ Y_{\text {True}} \\ \vdots \end{array}\right)

训练后的模型 Model1_2 分别在 train 和 test 上预测,得到预测标签分别是P2,T2
(Xtrain) Model 1 2Predict (P2)(Xtest) Modell 2 Predict (T2) \begin{aligned} &\left(\begin{array}{c} \vdots \\ X_{\text {train}} \\ \vdots \end{array}\right) \stackrel{\text { Model } 1 \text { 2Predict }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ P_{2} \\ \vdots \end{array}\right)\\ &\left(\begin{array}{c} \vdots \\ X_{\text {test}} \\ \vdots \end{array}\right) \stackrel{\text { Modell } 2 \text { Predict }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ T_{2} \\ \vdots \end{array}\right) \end{aligned}
Step 3. 分别把P1,P2以及T1,T2合并,得到一个新的训练集和测试集train2,test2.

(P1P2)and( Train 2 Test 2T1T2) \overbrace{\left(\begin{array}{cc} \vdots & \vdots \\ P_{1} & P_{2} \\ \vdots & \vdots \end{array}\right)} \operatorname{and}\left(\begin{array}{cc} \text { Train } 2 & \text { Test } 2 \\ \hline & \vdots \\ T_{1} & T_{2} \\ \vdots & \vdots \end{array}\right)
再用 次级模型 Model2 以真实训练集标签为标签训练,以train2为特征进行训练,预测test2,得到最终的测试集预测的标签列 YPreY_{P r e}

(P1P2)Train 2Model2 Train (YTrue)(T1T2) Todell 2 Predict (YPre) \begin{aligned} &\overbrace{\left(\begin{array}{cc} \vdots & \vdots \\ P_{1} & P_{2} \\ \vdots & \vdots \end{array}\right)}^{\text {Train } 2} \overbrace{\Longrightarrow}^{\text {Model2 Train }}\left(\begin{array}{c} \vdots \\ Y_{T r u e} \\ \vdots \end{array}\right)\\ &\overbrace{\left(\begin{array}{cc} \vdots & \vdots \\ T_{1} & T_{2} \\ \vdots & \vdots \end{array}\right)} \stackrel{\text { Todell } 2 \text { Predict }}{\Longrightarrow}\left(\begin{array}{c} \vdots \\ Y_{P r e} \\ \vdots \end{array}\right) \end{aligned}
这就是我们两层堆叠的一种基本的原始思路想法。在不同模型预测的结果基础上再加一层模型,进行再训练,从而得到模型最终的预测。

Stacking本质上就是这么直接的思路,但是直接这样有时对于如果训练集和测试集分布不那么一致的情况下是有一点问题的,其问题在于用初始模型训练的标签再利用真实标签进行再训练,毫无疑问会导致一定的模型过拟合训练集,这样或许模型在测试集上的泛化能力或者说效果会有一定的下降,因此现在的问题变成了如何降低再训练的过拟合性,这里我们一般有两种方法。

  • 次级模型尽量选择简单的线性模型
  • 利用K折交叉验证

K-折交叉验证:
训练:
二手车交易价格预测-task5-模型融合
预测:
二手车交易价格预测-task5-模型融合

5.3 经验总结

比赛的融合这个问题,个人的看法来说其实涉及多个层面,也是提分和提升模型鲁棒性的一种重要方法:

  • 1)结果层面的融合,这种是最常见的融合方法,其可行的融合方法也有很多,比如根据结果的得分进行加权融合,还可以做Log,exp处理等。在做结果融合的时候,有一个很重要的条件是模型结果的得分要比较近似,然后结果的差异要比较大,这样的结果融合往往有比较好的效果提升。

  • 2)特征层面的融合,这个层面其实感觉不叫融合,准确说可以叫分割,很多时候如果我们用同种模型训练,可以把特征进行切分给不同的模型,然后在后面进行模型或者结果融合有时也能产生比较好的效果。

  • 3)模型层面的融合,模型层面的融合可能就涉及模型的堆叠和设计,比如加Staking层,部分模型的结果作为特征输入等,这些就需要多实验和思考了,基于模型层面的融合最好不同模型类型要有一定的差异,用同种模型不同的参数的收益一般是比较小的。

相关文章:

  • 2022-01-03
  • 2021-12-17
  • 2021-12-07
  • 2021-10-01
  • 2021-12-01
猜你喜欢
  • 2021-11-24
  • 2021-07-15
  • 2021-07-12
  • 2022-01-04
  • 2021-06-23
  • 2021-09-02
  • 2021-10-08
相关资源
相似解决方案