数据竞赛入门-金融风控(贷款违约预测)5、模型融合

前言

本次活动为datawhale与天池联合举办,为金融风控之贷款违约预测挑战赛(入门)
比赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introductionhtml

为何要进行模型融合

这里得谈到集成学习
集成学习能够分为两类,一种是把强分类器进行强强联合,使得融合后的模型效果更强,称为模型融合。另外一种是将弱分类器经过学习算法集成起来变为很强的分类器,称为机器学习元算法。python

这里咱们把用来进行融合的学习器称为个体学习器。web

模型融合的表明有:投票法(Voting)、线性混合(Linear Blending)、Stacking。算法

而机器学习元算法又能够根据个体学习器之间是否存在依赖关系分为两类,称为Bagging和Boosting:dom

  • Bagging: 个体学习器不存在依赖关系,可同时对样本随机采样并行化生成个体学习器。表明做为随机森林(Random Forest)
  • Boosting: 个体学习器存在依赖关系,基于前面模型的训练结果偏差生成新的模型,必须串行化生成。表明的算法有:Adaboost、GBDT、XGBoost

模型融合
在进行模型融合的时候,也不是说随意的融合就能达到好的效果。进行融合时,所需的集成个体(就是用来集成的模型)应该好而不一样。好指的是个体学习器的性能要好,不一样指的是个体模型的类别不一样。机器学习

在这里举个西瓜书的例子,在介绍例子以前,首先提早介绍简单投票法,以分类问题为例,就是每一个分类器对样例进行投票,哪一个类别获得的票数最多的就是融合后模型的结果。
在这里插入图片描述
在上面的例子中,采用的就是简单的投票法。中间的图b各个模型输出都同样,所以没有什么效果。第三个图c每一个分类器的精度只有33%,融合后反而更糟。也就是说,想要模型融合有效果,个体学习器要有必定的准确率,而且要有多样性,学习器之间具备差别,即”好而不一样“。svg

如何作到好而不一样呢?能够由下面几个方面:性能

  • 针对输入数据:使用采样的方法获得不一样的样本(好比bagging方法采用自助法进行抽样)
  • 针对特征:对特征进行抽样
  • 针对算法自己:
    • 个体学习器 h t h_{t} ht来自不一样的模型集合
    • 个体学习器 h t h_{t} ht来自于同一个模型集合的不一样超参数,例如学习率η不一样
    • 算法自己具备随机性,例如用不一样的随机种子来获得不一样的模型
  • 针对输出:对输出表示进行操纵以加强多样性
    • 如将多分类转化为多个二分类任务来训练单模型
    • 将分类输出转化为回归输出等

那么进行模型融合为何比较好呢?虽然有俗话说:三个臭皮匠胜过诸葛亮,可是咱们仍是想知道,到底是如何“胜过诸葛亮”的。这里摘录西瓜书以下:学习

学习器的结合可能会从三个方面带来好处:spa

  • 首先,从统计的方面来看,因为学习任务的假设空间每每很大,可能有多个假设在训练集上达到相同的性能,此时若使用单学习器,可能因误选而致使泛化性能不佳,结合多个学习器则会减小这一风险;

  • 第二,从计算的方面来看,学习算法每每会陷入局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而经过屡次运行以后进行结合,可下降陷入糟糕局部极小点的风险;

  • 第三,从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则确定无效,而经过结合多个学习器,因为相应的假设空间有所扩大,有可能学得更好的近似。

在这里插入图片描述

模型融合方法:

平均

简单平均法

  • 简单加权平均,结果直接融合 求多个预测结果的平均值。pre1-pren分别是n组模型预测出来的结果,将其进行加权融

    pre = (pre1 + pre2 + pre3 +...+pren )/n

加权平均法

  • 加权平均法 通常根据以前预测模型的准确率,进行加权融合,将准确性高的模型赋予更高的权重。

    pre = 0.3pre1 + 0.3pre2 + 0.4pre3

投票

简单投票

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))

加权投票

在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))

综合:

排序融合

log融合

stacking:

构建多层模型,并利用预测结果再拟合预测。

blending:

选取部分数据预测训练获得预测结果做为新特征,带入剩下的数据中预测。

boosting/bagging

参考:
细语呢喃