# 7 种模型加权集成方法
不同任务 -> 不同加权方法
分类
- 类别投票
- 概率值加权
回归
- 预测值加权
排序
- 排序次序加权
目标检测
- 预测结果NMS
语义分割
- 像素类别投票
- 加权
集成学习
考虑
-
模型的多样性
- 多样性不足 -> 最终预测结果和单个模型类似。
-
模型的精度差异
- 精度差异很大 -> 最终集成的效果也不会很好
Out of fold
中文:袋外预测
就是交叉验证
Blend操作
最常见的分类 & 回归任务的结果加权方法
方法1:均值加权
-
原理
- 对所有模型的预测结果计算均值;
-
优点
- 简单,过拟合可能性低;
-
缺点
- 会受到模型原始精度差异的影响;
-
代码
oof_preds = []
for col in oofCols:
oof_preds.append(oof_df[col])
y_avg = np.mean(np.array(oof_preds), axis=0)
方法2:权重加权
-
原理
- 对所有模型的预测结果加权求和;
-
优点
- 比均值更加可控;
-
缺点
- 权重需人工设置,更容易过拟合;
-
代码
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)
方法3:排序加权
-
原理
-
预测结果进行排序
- 使用次序代替原始取值
-
-
优点
- 适合分类任务
- 对概率进行集成
-
缺点
- 会受到模型原始精度差异的影响
-
代码
rankPreds = []
for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values)
y_rankavg = np.mean(np.array(rankPreds), axis=0)
方法4:排序权重加权
-
原理
-
预测结果进行排序
- 使用次序代替原始取值
-
-
优点
- 比均值更加可控;
-
缺点
- 权重需人工设置
- 更容易过拟合
-
代码
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)
y_rankavg = np.mean(np.array(rankPreds), axis=0)
方法5:爬山法加权
-
原理
- 权重进行搜索
- 保留最优的权重
-
优点
- 可以自动权重权重大小
-
缺点
- 更容易过拟合
-
代码
for w1 in np.linspace(0, 1, 100):
for w2 in np.linspace(0, w2, 100):
w3 = 1 - w1 - w3
如果 w1, w2, w3取得更好的精度,保留权重
否则尝试下一组权重组合
方法6:线性回归加权
-
原理
- 使用线性回归确定权重
-
优点
- 可以自动权重权重大小
-
缺点
- 需要额外训练
- 容易过拟合
-
代码
from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=False)
lr.fit(
三个模型对训练集预测结果,
训练集标签
)
lr.coef_ # 线性回归的权重
方法7:参数优化加权
-
原理
- 使用优化方法搜索权重
-
优点
- 可以自动权重权重大小;
-
缺点
- 需要额外训练,容易过拟合;
-
代码
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])
参考文献
[1] https://mp.weixin.qq.com/s/a77kNwNCAsHCvnfpKUvQYQ