集成算法 ensemble
通过在数据集上构建多个模型,集成所有模型的建模结果,得到一个综合的结果,以此来获得比单个
模型更好的分类或回归表现
装袋法bagging:
构建多个相互独立的基评估器(base estimator),然后对其预测进行平均或多数表决原则来决定
集成评估器的结果。装袋法的代表模型就是随机森林
提升法boosting:
基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本
进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树GBDT。
装袋法和提升法对比
装袋法bagging | 提升法boosting | |
---|---|---|
评估器 | 相互独立,同时运行 | 相互关联,按顺序依次构建,后建模型会在先建模型的预测失败的样本上有更多权重 |
抽样数集 | 有放回随机抽样 | 有放回抽样,但每次抽样时,会给预测失败的样本更多的权重 |
决定集成的结果 | 平均或多数表决 | 加权平均,训练集上表现更好的模型会得到更多的权重 |
目标 | 降低方差,提高模型整体稳定性 | 降低偏差,提高模型整体精确度 |
单个评估器过拟合问题 | 能一定程度上避免过拟合 | 可能会加剧过拟合 |
单个评估器的效力比较弱时 | 不是非常有帮助 | 可能会提升模型表现 |
代表算法 | RF | GBDT和adabooost |
随机森林参数
控制基评估器参数:
与决策树类似
n_estimators:
决策树的数量,越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到
一定的程度之后,随机森林的精确性往往不再上升或开始波动
%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
wine = load_wine()
决策树与随机深林的对比
from sklearn.model_selection import train_test_split
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("Single Tree:{}".format(score_c)
,"Random Forest:{}".format(score_r)
)
Single Tree:0.9444444444444444 Random Forest:1.0
#交叉验证情况下
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1SsirVY-1587530490929)(output_12_0.png)]
# 多次交叉验证
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()
#是否有注意到,单个决策树的波动轨迹和随机森林一致?
#再次验证了我们之前提到的,单个决策树的准确率越高,随机森林的准确率也会越高
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGAG65xY-1587530490936)(output_14_0.png)]
n_estimator 参数曲线
#####【TIME WARNING: 2mins 30 seconds】#####
superpa = []
for i in range(200):
rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa))+1)#打印出:最高精确度取值,max(superpa))+1指的是森林数目的数量n_estimators
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()
0.9888888888888889 32
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ATU1OOh-1587530490942)(output_16_1.png)]
随机森林为什么准确率高?
随机森林的本质是一种装袋集成算法(bagging),装袋集成算法是对基评估器的预测结果进行平均
或用多数表决原则来决定集成评估器的结果。
在刚才的红酒例子中,我们建立了25棵树,对任何一个样本而言,平均或多数表决原则下,当且仅当
有13棵以上的树判断错误的时候,随机森林才会判断错误。单独一棵决策树对红酒数据集的分类准确
率在0.85上下浮动,假设一棵树判断错误的可能性为0.2,那13棵树以上都判断错误的可能性是
import numpy as np
from scipy.special import comb
np.array([comb(25,i)*(0.2**i)*((1-0.2)**