金融风控训练营-Task05
本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr
一、学习知识点概要
- 模型融合方式
- 平均法
- 投票法
- Stacking
- Blending
- 两者区别
二、学习内容
2.1模型融合方式
- 平均
- 简单平均法
- 加权平均法
- 投票
- 简单投票法
- 加权投票法
- 综合
- 排序融合
- log融合
- stacking
- 构建多层模型,并利用预测结果再拟合预测。
- blending
- 选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。
- boosting/bagging
2.2 平均
2.2.1简单加权平均法
结果直接融合,求多个预测结果的平均值。
pre1-pren分别是n组模型预测出来的结果,将其进行加权融
pre = (pre1 + pre2 + pre3 +…+pren )/n
2.2.2加权平均法
一般根据之前预测模型的准确率,进行加权融合,将准确性高的模型赋予更高的权重。
pre = 0.3pre1 + 0.3pre2 + 0.4pre3
2.3 投票
2.3.1简单投票
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))
2.3.2加权投票
#在VotingClassifier中加入参数 voting='soft', weights=[2, 1, 1],weights用于调节基模型的权重
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)], voting='soft', weights=[2, 1, 1])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))
2.4 Stacking
Stacking模型的本质是一种分层的结构,用了大量的基分类器,将其预测的结果作为下一层输入的特征,这样的结构使得它比相互独立训练模型能够获得更多的特征。
stacking 将若干基学习器获得的预测结果,将预测结果作为新的训练集来训练一个学习器。
假设有五个基学习器,将数据带入五基学习器中得到预测结果,再带入模型六中进行训练预测。但是由于直接由五个基学习器获得结果直接带入模型六中,容易导致过拟合。所以在使用五个及模型进行预测的时候,可以考虑使用K折验证,防止过拟合。
以5折交叉验证为例:
- 将训练集分成5份(5折交叉验证)。 对于每一个基模型i来说, 我们用其中的四份进行训练
- 用另一份训练集作为验证集进行预测得到Pi的一部分
- 再用测试集进行预测得到Ti的一部分,这样当五轮下来之后,验证集的预测值就会拼接成一个完整的Pi
- 测试集的label值取个平均就会得到一个Ti(看下面的预测示意图)。 这些Pi进行合并就会得到下一层的训练集train2
- Ti进行合并就得到了下一层的测试集test2。 利用train2训练第二层的模型, 然后再test2上得到预测结果,就是最终的结果。
博主用下面的图表示Stacking的整理过程原理:
2.5 Bending
与Stacking的区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集(留出集),例如30%的训练数据(类似于把原始的训练集先分成两部分, 比如70%的数据作为新的训练集, 剩下的30%的数据作为测试集)
2.5.1 单纯的Holdout
一个版本就是单纯的Holdout集,就是直接把训练集分成两部分,70%作为新的训练集, 30%作为测试集,然后用这70%的训练集分别训练第一层的模型,然后在30%的测试集上进行预测, 把预测的结果作为第二层模型的训练集特征,这是训练部分。
预测部分就是把真正的测试集先用第一层的模型预测,把预测结过作为第二层测试集的特征进行第二层的预测。 过程图长下面这个样子:
2.5.2 Holdout交叉
第二个版本的话依然是有一个Holdout集合,但是引入了交叉验证的思想,每个模型看到的Holdout集合并不一样。即每个模型会看到这个30%的数据会不一样,说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。第二阶段的stacker模型就基于第一阶段模型对这30%训练数据的预测值进行拟合。
我们在第一层中, 用70%的训练集训练多个模型, 然后去预测那30%的数据得到预测值Pi, 同时也预测test集得到预测值Ti。
这里注意,那30%的数据每个模型并不是一样,也是类似于交叉验证的划分方式,只不过stacking那里是每个模型都会经历K折交叉验证,也就是有多少模型,就会有多少次K折交叉验证,而blending这里是所有模型合起来只经历了一次K折交叉验证
第二层中,直接用30%数据在第一层预测的结果Pi进行合并, 作为新的训练集train2, test集的预测值Ti合并作为新的测试集test2, 然后训练第二层的模型。
Blending的过程训练和预测过程可以使用下图来表示:
2.6 Blending与Stacking相比
-
优势
- Blending比较简单,而Stacking相对比较复杂
- 能够防止信息泄露:generalizers和stackers使用不同的数据
-
缺点
- 只用了整体数据的一部分
- 最终模型可能对留出集(holdout set)过拟合
- Stacking多次交叉验证要更加稳健。
三、学习问题与解答
imshow() 函数负责对图像进行处理,并显示其格式,但是不能显示。
show() 才能显示出来。
四、学习思考与总结
Stacking 相对Blending慢很多,但是相对会稳健些。模型融合是比赛后期上分的重要手段,特别是多人组队学习的比赛中,将队友的模型进行融合,结果会有大幅提升!
参考:
CSDN博主「Miracle8070」的原创文章《零基础数据挖掘入门系列(六) - 模型的融合技术大总结与结果部署》,原文链接:https://blog.csdn.net/wuzhongqiang/article/details/105012739