模型融合

模型融合是在将各种模型结合在一起,将他们各自的长处发挥出来
其中有投票法、平均法、stacking、boosting/bagging

1 简单加权

对每个模型一个权值,然后输出

def Weighted_method(test_pre1,test_pre2,test_pre3,w=[1/3,1/3,1/3]):
    Weighted_result = w[0]*pd.Series(test_pre1)
    				+ w[1]*pd.Series(test_pre2)
    				+ w[2]*pd.Series(test_pre3)
    return Weighted_result

特殊形式

平均

def Mean_method(test_pre1,test_pre2,test_pre3):
    Mean_result = pd.concat([pd.Series(test_pre1), 
    						 pd.Series(test_pre2),
    						 pd.Series(test_pre3)], axis=1).mean(axis=1)
    return Mean_result

中间值

def Median_method(test_pre1,test_pre2,test_pre3):
    Median_result = pd.concat([pd.Series(test_pre1),
    						   pd.Series(test_pre2),
    						   pd.Series(test_pre3)], axis=1).median(axis=1)
    return Median_result

2 Voting

Voting 其实也属于加权类型

硬投票

少数服从多数

from sklearn.ensemble import VotingClassifier

eclf = VotingClassifier(estimators=[('xgb', clf1), ('rf', clf2), ('svc', clf3)], voting='hard')
for clf, label in zip([clf1, clf2, clf3, eclf], ['XGBBoosting', 'Random Forest', 'SVM', 'Ensemble']):
    scores = cross_val_score(clf, x, y, cv=5, scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))

软投票

为不同模型一个权重

eclf = VotingClassifier(estimators=[('xgb', clf1), ('rf', clf2), ('svc', clf3)], voting='soft', 
						weights=[2, 1, 1])
for clf, label in zip([clf1, clf2, clf3, eclf], ['XGBBoosting', 'Random Forest', 'SVM', 'Ensemble']):
    scores = cross_val_score(clf, x, y, cv=5, scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))

3 Stacking

将各个模型结合在一起有不同的结合策略
对于分类问题,可以使用投票法选择输出最多的类
对于回归问题,可以采用将各个输出的结果求平均

还有就是将这些模型的输出送到另一个学习器,这就是 stacking
这个学习器可叫做次级学习器

但这样会出现过拟合的问题,解决方法:

  1. 次级模型尽量选择简单的线性模型
  2. 利用 K 折交叉验证
def Stacking_method(train_reg1, train_reg2, train_reg3, y_train_true,
					test_pre1, test_pre2, test_pre3,
					model_L2 = linear_model.LinearRegression()):
    model_L2.fit(pd.concat([pd.Series(train_reg1), pd.Series(train_reg2), 
    						pd.Series(train_reg3)], axis=1).values, y_train_true)
    Stacking_result = model_L2.predict(pd.concat([pd.Series(test_pre1), 
    											  pd.Series(test_pre2), 
    											  pd.Series(test_pre3)], axis=1).values)
    return Stacking_result

4 Blending

和 Stacking 相似,不过再把训练集划分为两部分,如 70% 训练和 30% 验证

第一层,在 70% 上训练多个模型,预测 30% 验证和 test
第二层,用 30% 验证的预测作为新特征继续训练。然后一样把 test 第一层的预测作为特征,真实标签继续作为标签

其优点在于:
1.比 stacking 简单(因为不用进行k次的交叉验证来获得 stacker feature)
2.避开了一个信息泄露问题:generlizers 和 stacker 使用了不一样的数据集

缺点在于:
1.使用了很少的数据(第二阶段的 blender 只使用 training set10% 的量)
2.blender 可能会过拟合
3.stacking 使用多次的交叉验证会比较稳健

参考:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12586969.1002.21.1cd8593a4zdn0v&postId=95535

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值