随机森林分类、回归算法原理及调参实战

集成算法 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-rGA在这里插入图片描述G65xY-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)**
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值