<font color="#9a9a9a">来源:数据studio 机器学习杂货店</font>
<hr>
在竞赛中如果对多个预测结果进行集成,最方便的做法是直接对预测结果进行加权求和。
此时不同任务,加权方法不同:
<ul><li>分类任务:类别投票 & 概率值加权</li>
<li>回归任务:预测值加权</li>
<li>排序任务:排序次序加权</li>
<li>目标检测任务:预测结果NMS</li>
<li>语义分割任务:像素类别投票 & 加权</li></ul>
在本文中我们将介绍最常见的分类 & 回归任务的结果加权方法,也就是Blend操作。
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>多样性 & 精度差异</strong></font>
在对结果进行集成时需要考虑如下两点:
<ul><li>模型的多样性;</li>
<li>模型的精度差异;</li></ul>
集成学习的精度收益是需要模型&预测结果的多样性,如果多样性不足,则最终预测结果和单个模型类似。
精度差异是指模型之间的精度差异,如果精度差异很大最终集成的效果也不会很好。如下情况2的模型精度差异就较大。
<pre>三个模型精度:[0.9, 0.92, 0.92]
三个模型精度:[0.9, 0.8, 0.7]</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>Out of fold</strong></font>
Out of fold又名袋外预测,是一个模型在交叉验证的过程中使用训练部分进行训练,然后对验证集进行预测,交替得到训练集和测试集预测结果。
如果我们拥有三个模型,通过交叉验证可以得到3个训练集预测结果和3个验证集预测结果。
<strong>如下展示的几种方法,都需要训练集标签 与 训练集预测结果搜索得到参数,然后将参数在测试集上进行使用。</strong>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法1:均值加权</strong></font>
原理:对所有模型的预测结果计算均值;
优点:简单,过拟合可能性低;
缺点:会受到模型原始精度差异的影响;
<pre>oof_preds = []
for col in oofCols:
oof_preds.append(oof_df[col])
y_avg = np.mean(np.array(oof_preds), axis=0)</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法2:权重加权</strong></font>
原理:对所有模型的预测结果加权求和;
优点:比均值更加可控;
缺点:权重需人工设置,更容易过拟合;
<pre>weights = [1,2,3]
y_wtavg = np.zeros(len(oof_df))
for wt, col in zip(weights, oofCols):
y_wtavg += (wt*oof_df[col])
y_wtavg = y_wtavg / sum(weights)</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法3:排序加权</strong></font>
原理:对预测结果进行排序,使用次序代替原始取值;
优点:适合分类任务,对概率进行集成;
缺点:会受到模型原始精度差异的影响;
<pre>rankPreds = []
for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values)
y_rankavg = np.mean(np.array(rankPreds), axis=0)</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法4:排序权重加权</strong></font>
原理:对预测结果进行排序,使用次序进行加权求和;
优点:比均值更加可控;
缺点:权重需人工设置,更容易过拟合;
<pre>rankPreds = []
weights = [1,2,3]
for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values * weights[i])
y_rankavg = np.mean(np.array(rankPreds), axis=0)</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法5:爬山法加权</strong></font>
原理:权重进行搜索,保留最优的权重;
优点:可以自动权重权重大小;
缺点:更容易过拟合;
<pre>for w1 in np.linspace(0, 1, 100):
for w2 in np.linspace(0, w2, 100):
w3 = 1 - w1 - w3
如果 w1, w2, w3取得更好的精度,保留权重
否则尝试下一组权重组合</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法6:线性回归加权</strong></font>
原理:使用线性回归确定权重
优点:可以自动权重权重大小;
缺点:需要额外训练,容易过拟合;
<pre>from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=False)
lr.fit(
三个模型对训练集预测结果,
训练集标签
)
lr.coef_ # 线性回归的权重</pre>
<hr>
<font style="line-height: 40px;" color="#c200ff"><strong>方法7:参数优化加权</strong></font>
原理:使用优化方法搜索权重
优点:可以自动权重权重大小;
缺点:需要额外训练,容易过拟合;
<pre>def f(x):
return x[0]**2 + x[1]**2 + (5 - x[0] - x[1])
from scipy import optimize
minimum = optimize.fmin(f, [1, 1])</pre>
<hr>
<font color="#9a9a9a">本文直接来源:<a href="https://mp.weixin.qq.com/s/pbBqGHE05cyBi8tQX7BeAQ"><font color="#9a9a9a">数据派THU</font></a>,转载此文目的在于传递更多信息,版权归原作者所有。如不支持转载,请联系小编demi@eetrend.com删除。</font>
<br>