模型融合是在将各种模型结合在一起,将他们各自的长处发挥出来
其中有投票法、平均法、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
这个学习器可叫做次级学习器
但这样会出现过拟合的问题,解决方法:
- 次级模型尽量选择简单的线性模型
- 利用 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