- 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通 过在数据上构建多个模型,集成所有模型的建模结果。
目录
前言
一、集成学习是什么?
二、装袋法Bagging
1.随机森林-代表集成学习技术水平的算法(有放回的抽样bagging)
1.1 简介
1.2 什么是随机
1.3 优秀之处
1.4 唯一缺点
1.5 拥有森林(如何构建随机森林)
1.6 sklearn建立森林
1.7 分类实例(基于红酒数据集)
1.8 oob_score_(红酒集)
1.9 回归实例(基于乳腺癌预测模型)
2.0 调参
总结
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
集成学习本身不是一个单独的机器学习算法,而是通过再数据上构建多个模型,集成所有模型的建模结果。
目标:集成学习算法本身是考虑多个建模器的建模结果,汇总得到一个综合的结果,总的来说就是比单个模型获得更好的分类和回归效果表现。或者说在机器学习的众多算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型(弱评估器,基评估器),在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型一起得到一个更好更全面的强监督模型。
通俗理解:有一道判断题,一群学习不好的人怎么去做能让题目的成功率比较高呢。
在这里就有两种方法:
第一种是序列集成方法(提升法Boosting):
先让学渣A做一遍,然后再让学渣B做,且让B重点关注A做错的那些题,再让C做,同样重点关注B做错的,依次循环,直到所有的学渣都把题目做了一遍为止
第二种就是并行集成方法(装袋法Bagging):
多个学渣一起做, 每个人随机挑选一部分题目来做,最后将所有人的结果进行汇总,然后根据将票多者作为最后的结果
图:
全称为bootstrap aggregating。它是一种有放回的抽样方法,其算法过程如下:
- 从原始样本集中抽取训练集。每轮从原始样本集中使用有放回的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
- 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
- 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
随机森林是一种有监督学习算法,是以CART决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代表集成学习技术水平的方法”。
数据集的随机选择:从原始数据集中采取《有放回的抽样bagging》,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复
待选特征的随机选取:随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再随机选取的特征中选取最优的特征。
当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大
建立森林的时候会有分类和预测两种实现(sklearn.ensemble)
- RandomForestClassifier 分类
- RandomForestRegression 回归
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.model_selection import
import matplotlib.pyplot as plt
%matplotlib inline
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print(score_c,score_r)
在这里得到
决策树的得分:0.9259259259259259
随机森林的得分:0.9814814814814815
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10)
plt.plot(range(1,11),rfc_s,label = "RandomForest")
plt.plot(range(1,11),clf_s,label = "Decision Tree")
plt.legend()
plt.show()
十折交叉验证:将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。
rfc_l = []
clf_l = []
for i in range(10):
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
rfc_l.append(rfc_s)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
clf_l.append(clf_s)
plt.plot(range(1,11),rfc_l,label = "Random Forest")
plt.plot(range(1,11),clf_l,label = "Decision Tree")
plt.legend()
plt.show()
以上可以看出在不考虑时间空间的影响下随机森林的效果优于决策树算法。
随机森林的又放回抽样也有一些问题,由于是有放回,一些样本可能会被采集多次,而其他一些样本却可能被忽略,一次都未被采集到。那么这些被忽略或者一次都没被采集到的样本叫做oob袋外数据。因此我们可以采用一种不同划分测试集和训练集,相当于将袋外数据作为测试集,这样只需要将RandomForestClassifier(oob_score=True)设置为True,就可以查看oob_score_的成绩了。
以下是基于红酒集的代码实现
rfc = RandomForestClassifier(n_estimators=25,oob_score=True)
rfc = rfc.fit(wine.data,wine.target)
#重要属性oob_score_
rfc.oob_score_
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline
data = load_breast_cancer()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
rfr = RandomForestRegressor()
LR = LinearRegression()
rfr.fit(Xtrain,Ytrain)
R.fit(Xtrain,Ytrain)
rfr.score(Xtest,Ytest)
LR.score(Xtest,Ytest)
训练成绩为
随机森林 0.9446334928229665
线性回归 0.8944412211446326
rfr_s = cross_val_score(rfr,data.data,data.target,cv=10)
LR_s = cross_val_score(LR,data.data,data.target,cv=10)
plt.plot(range(1,11),rfr_s,label = "RandomForest")
plt.plot(range(1,11),LR_s,label = "linearRegression")
plt.legend()
plt.show()
由以上两个实例可以看出集成算法中装袋法代表随机森林明显优于传统的回归模型和分类模型,影响随机森林重要的一部分还有参数的设置,下面基于网格搜索对于随机森林进行调参。
调参顺序
本文着重说明了集成学习的两种方法的区别,以及装袋法的代表算法随机森林的原理以及调参技巧等。