sklearn快速入门教程–(五)集成学习
一、集成学习简述
集成学习是目前各类竞赛和工程中应用最广泛的模型提升方法。比如在kaggle中就有关于集成学习的介绍。这里所谓的模型融合实际上主要就是集成学习方法。
常见的集成学习有以下几种:
- Boosting
- Bagging
- Stacking
其中boosting和bagging应用最多。比如目前流行的xgboost就是(gradient)boosting的一种,而random forest则是bagging的一种。
二、集成学习的两种主要思路
各种集成学习的思路不尽相同,尤其对于初学者通常一看到集成学习的理论都会很头疼。那么要快速学会集成学习的使用,就先要对其关键的思路有所了解。
顾名思义,集成学习是将多个模型放在一起,通过某种方式将其组合起来,从而得到一个统一的预测模型。自然地,在集成之前就要有基本的模型用于集成。目前所用的集成学习模式主要分为两种:
- 采用同一基模型,在样本的不同子集上进行训练,从而得到对应的多个不同的具体模型。这类学习方法的代表就是boosting, bagging。
- 采用多种基模型,在同一样本上进行训练,将多个模型组合起来得到具体模型。voting和stacking都是采用这类方式。
明白这一点之后其实就很容易分析sklearn中的对应方法了,对单一模型对应的方法,它的语法通常是这样:
ensemble_method(estimator,**args)
这里estimator
是指sklearn中的基模型,比如Tree
,LinearRegression
等都属于这一类型,而**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的快速入门到此就结束。当然这个系列只是一个简单的入门教程,涉及的模型和方法都非常有限,要想掌握更多的方法,更有效地解决自己的问题,则需要耐心地长期积累。