7 种模型加权集成方法

# 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

你可能感兴趣的:(导,模型加权集成)