sklearn快速入门教程–(五)集成学习
一、集成学习简述

集成学习是目前各类竞赛和工程中应用最广泛的模型提升方法。比如在kaggle中就有关于集成学习的介绍。这里所谓的模型融合实际上主要就是集成学习方法。

常见的集成学习有以下几种:

  • Boosting
  • Bagging
  • Stacking

其中boosting和bagging应用最多。比如目前流行的xgboost就是(gradient)boosting的一种,而random forest则是bagging的一种。

二、集成学习的两种主要思路

各种集成学习的思路不尽相同,尤其对于初学者通常一看到集成学习的理论都会很头疼。那么要快速学会集成学习的使用,就先要对其关键的思路有所了解。

顾名思义,集成学习是将多个模型放在一起,通过某种方式将其组合起来,从而得到一个统一的预测模型。自然地,在集成之前就要有基本的模型用于集成。目前所用的集成学习模式主要分为两种:

  • 采用同一基模型,在样本的不同子集上进行训练,从而得到对应的多个不同的具体模型。这类学习方法的代表就是boosting, bagging。
  • 采用多种基模型,在同一样本上进行训练,将多个模型组合起来得到具体模型。voting和stacking都是采用这类方式。

明白这一点之后其实就很容易分析sklearn中的对应方法了,对单一模型对应的方法,它的语法通常是这样:

ensemble_method(estimator,**args)

这里estimator是指sklearn中的基模型,比如TreeLinearRegression等都属于这一类型,而**args则表示其它参数。结合上一教程中的内容不难想到,这个estimator实际上就是一种通用模式,也就是说它只要属于这一类型,其它的方面就可以完全自由设定。比如我想用一个SVC来进行集成,同时又想指定它的核函数,那么就可以直接将SVC(kernel='rbf')传入函数。这种灵活的操作方式会给我们各类改进和提升提供便利。

而对于多个模型通常是这样:

ensemble_method(estimators,**args)

注意这里是estimators,也就是多个模型。那么很自然地想到多个模型肯定是以集合的形式输入。事实上在sklearn中,这里是用列表表示多个模型,而每个模型则由其名称和实体类型来表示。比如:

estimators = [
				('lr', RidgeCV()),
				('svr', LinearSVR(random_state=42))
				]

可想而知,如果有更多的模型,则直接在列表中继续加入即可。

三、单一模型集成 - - 以Adaboost为例

这里我们以iris数据集作为样本,将100个Logistic Regression模型用Adaboost集成起来。

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
from sklearn.linear_model import LogisticRegression

X, y = load_iris(return_X_y=True)
clf = AdaBoostClassifier(LogisticRegression(), n_estimators=100)
clf.fit(X,y)
clf.predict(X)

运行结果:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2,
       2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2])

可以看到,在sklearn中实现这样的集成学习是非常简单的,只需要一句代码即可。训练和预测和直接使用机器学习模型是完全一样的语法。这一点也是sklearn中一个亮点,它尽最大可能减小了程序员去背工具模式的工作,从而可以将更多精力集中在问题本身。

四、多模型集成 - - 以Voting例

Voting是一种多模型集成的常用方法,它先将多个模型进行投票,再按照投票结果对模型进行组合。这里我们以iris数据集为基础,将Logistic Regression, 高斯朴素贝叶斯和随机森林进行集成。

from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier

iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target

clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(n_estimators=50, random_state=1)
clf3 = GaussianNB()

eclf = VotingClassifier(
    estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)],
    voting='hard')

for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Random Forest', 'naive Bayes', 'Ensemble']):
    scores = cross_val_score(clf, X, y, scoring='accuracy', cv=5)
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))

运行结果:

Accuracy: 0.95 (+/- 0.04) [Logistic Regression]
Accuracy: 0.94 (+/- 0.04) [Random Forest]
Accuracy: 0.91 (+/- 0.04) [naive Bayes]
Accuracy: 0.95 (+/- 0.04) [Ensemble]

如上文所述,在sklearn中对多个模型进行集成时是将多个模型实例传给集成方法,源码中的第16行即是如此。

五、小结

本文简要介绍了sklearn中集成学习的使用方法,从基模型的角度上可以简单地将方法分为两类,从而快速掌握两类方法的基本使用。以下小结了sklearn中对应的方法和模型类型:

方法名称

基模型

Adaboost

单个模型

Bagging

单个模型

Gradient boost

决策树

Voting

多个模型

Staking

多个模型

在本文的基础上,强烈建议再去学习Kaggle模型融合原文 ,此时在文中提到的各类集成方法其实都可以用sklearn中的方法进行实现了。而仔细学完这篇文章,参加各类竞赛的入门级标准也就基本达到了。

sklearn的快速入门到此就结束。当然这个系列只是一个简单的入门教程,涉及的模型和方法都非常有限,要想掌握更多的方法,更有效地解决自己的问题,则需要耐心地长期积累。