模型融合简单来说就是通过对一组的基分类器以某种方式进行组合,以提升模型整体性能的方法。当然,模型融合不能起到决定性作用,在影响模型结果的因素中,一般来说是数据>特征>模型>模型融合。在业界流传着这么一句话,数据和特征决定了机器学习的上限,而模型和算法只是在逼近这个上限而已。所以,无论是在比赛中还是在处理实际问题的时候特征工程无疑是非常重要的,在数据和特征都无法提升比赛成绩的时候,模型融合或许就能派上用场了。
模型融合的三种信条:
1.群众的力量是伟大的 — 集体智慧
- Voting投票器
Voting可以说是一种最为简单的模型融合方式。假如对于一个二分类模型,有3个基础模型,那么就采取投票的方式,投票多者为最终的分类。在sklearn实现如下:
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)])
eclf = eclf.fit(x_train,y_train)
print(eclf.predict(x_test))
- Bagging
Bagging的思想是利用抽样生成不同的训练集,进而训练不同的模型,将这些模型的输出结果综合(投票或平均的方式)得到最终的结果。Bagging本质上是利用了模型的多样性,改善算法整体的效果。Bagging的重点在于不同训练集的生成,这里使用了一种名为Bootstrap的方法,即有放回的重复随机抽样,从而生成不同的数据集。具体流程如下图所示:
在sklearn实现如下:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
model1=DecisionTreeClassifier(max_depth=5)
model2=BaggingClassifier(model1,n_estimators=100,max_samples=0.3)
model2.fit(x_train,y_train)
print (model2.predict(x_test))
- 随机森林(Random forest)
随机森林实际上就是Bagging算法的进化版,不同于Bagging算法的是,
Bagging产生不同数据集的方式只是对行利用有放回的随机抽样,而随机森林产生不同数据集的方式不仅对行随机抽样也对列进行随机抽样。在sklearn实现如下:
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(x_train, y_train)
print(clf.feature_importances_)
print(clf.predict(x_test))
2.站在巨人的肩膀上 — 层叠式递进
- Blending
Blending主要是用不相交的数据训练不同的基础模型,将他们的输出取(加权)平均。Blending分为Uniform blending和Linear blending,前者在分类时使用一人一票的投票方式,回归时采用多个模型的平均值。后者是二次学习,使用线性模型将第一步中学习到的学习器的输出结果组合起来。相当于简化版的Stacking。
- Stacking
Stacking背后的基本思想是使用大量基分类器,然后使用另一种分类器来融合它们的预测结果,旨在降低泛化误差。Stacking算法分为2层,第一层是用不同的算法形成T个基础分类器,同时产生一个与原数据集大小相同的新数据集,利用这个新数据集和一个新算法构成第二层的分类器。在训练第二层分类器时采用各基础分类器的输出作为输入,第二层分类器的作用就是对基础分类器的输出进行集成。但是由于Stacking模型复杂度过高,比较容易造成过拟合。流程图如下所示:
3.一万个小时定律 — 熟能生巧
- Boosting
Boosting是一种提升算法,其思想是在算法迭代过程中,每次迭代构建新的分类器,重点关注被之前分类器分类错误的样本,如此迭代,最终加权平均所有分类器的结果,从而提升分类精度。Boosting与Bagging相比来说最大的区别就是Boosting是串行的,而Bagging中所有的分类器是可以同时生成的(分类器之间无关系),而Boosting中则必须先生成第一个分类器,然后依次往后进行。核心思想是通过改变训练集进行有针对性的学习,通过每次更新迭代,增加错误样本的权重,减小正确样本的权重。知错就改,逐渐变好。典型应用为:Adaboost、GBDT和Xgboost。流程图如下所示:
我们发现,在比赛中获得名次较高的队伍都不同程度的使用了模型融合方法。尤其是在kaggle或天池这样的比赛中,排名靠前的队伍大都使用了像Xgboost、Lightgbm这样的Boosting算法,进而对这些模型的输出结果进行Bagging、Blending或Stacking,最终取得不错的成绩。因此,如果想要在kaggle或天池这样的平台比赛中胜出,在做好特征工程的同时也要用好模型融合这个杀手锏。