sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)

Posted iostreamzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)相关的知识,希望对你有一定的参考价值。

概述

集成算法

集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个横型,集成所有模型的建模结果,基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。在现在的各种算法竞赛中,随机森林(入门级别容易上手),梯度提升树(GBDT) , Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广.

多个模型集成后的模型叫做集成评估器,集成评估器中的每一个模型叫做基评估器,通常来说有三类集成算法:Bagging、Boosting、Stacking
随机森林是Bagging的代表模型, 他所有的基评估器都是决策树。Bagging法中每一个基评估器是平行的,最后的结果采用平均值或者少数服从多数的原则

集成算法的目标

集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合结果,以此来获取比单个模型更好的回归或分类表现

随机森林再sklearn中的位置

随机森林在sklearn中ensemble模块下

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor

控制基评估器的参数,与决策树参数一样

参数作用
criterion不纯度的衡量指标,有基尼系数和信息增益两种
max_depth树的最大深度
min_samples_leaf一个节点分支后,子节点必须最少包含的样本数,如果不能满足条件将不能发生分支
min_samples_split一个节点如果要发生分支操作,必须要包含的最小样本数,不满足则不能分支
max_features限制分支时考虑的特征个数
min_impurity_decrease限制信息增益的减小,信息增益小于限定值时不发生分支

随机森林模型参数

  • n_estimators : 推荐0-200之间的数值
    这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
  • random_state :控制生成随机森林的模式。并不能控制森林中的树的样式。随机性越大,模型效果越好,当然这样可能就不是很稳定,不便于调试。想要模型稳定,可以设置random_state参数
  • bootstrap :控制抽样技术的参数,默认为True。采用有放回的随机抽样数据来形成训练数据。
    对我们传入随机森林模型的数据集,对每一个基评估器采用有放回的随机抽样从原始数据集中抽取n个样本来组成自助集,并将自助集作为基评估器的训练数据。这样的作法大大增加了随机性,提高了模型的效果。
    由于有放回,所以有一些样本可能在某些自助集中出现多次,而其他的一些样本可能被忽略。一般来说,自助集一般会包含63%的原始数据。那些被浪费掉的数据被称为袋外数据(out of bag data 简称oob)。除了我们最开始就划分好训练测试集外,这些被忽略的数据也可以用来作为测试集,也就是说在使用随机森林模型的时候可以不用划分数据集,只需要用袋外数据来测试我们的模型即可。当样本数量,和随机森林中树的数量不大的情况下,可能没有数据在袋外,也就不能用oob来测试模型了。
  • oob_score :默认为False,True表示用袋外数据来测试模型。可以通过oob_score_来查看模型的准取度。

随机森林分类器示例

通过红酒数据集来测试随机森林模型,并比较随机森林和决策树在这个数据集下的表现。

导包

from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score # 交叉检验
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

加载数据集并分割训练集测试集

# 加载数据集
wine = load_wine()
X = wine['data']
y = wine['target']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

建立随机森林分类器模型和分类决策树,比较两个模型在的表现

# 训练随机森林,决策树模型,比较两种模型

# 建立随机森林分类器模型,并获得得分
rfc = RandomForestClassifier(random_state=1)
rfc.fit(X_train, y_train)
r_score = rfc.score(X_test, y_test)

# 建立分类决策树模型,并获得得分
dtc = DecisionTreeClassifier(random_state=1)
dtc.fit(X_train, y_train)
d_score = dtc.score(X_test, y_test)

print("Decision Tree:{}\\nRandom Forest: {}".format(d_score, r_score))
# Decision Tree:0.8703703703703703
# Random Forest: 0.9259259259259259

通过多次交叉检验蓝比较两个模型

# 多次交叉检验比较两个模型

r_scores = []
d_scores = []

for i in range(10) :
    rfc = RandomForestClassifier(n_estimators=25)
    # 每一次交叉检验取平均值
    r_scores.append(cross_val_score(rfc, X, y, cv=10).mean())
    
    dtc = DecisionTreeClassifier()
    d_scores.append(cross_val_score(dtc, X, y, cv=10).mean())

plt.plot(range(1, 11), r_scores, label='Random Forest')
plt.plot(range(1, 11), d_scores, label='Decision Tree')
plt.legend(loc='best')
plt.show()
# 很明显的看到随机森林得分一直保持在0.96以上,比决策树优秀很多

在这里插入图片描述

画出随机森林随着扽林中树的棵树变换的学习曲线(耗时操作)

# 随机森林学习曲线

scores = []

for i in range(1, 201) :
    rfc = RandomForestClassifier(n_estimators=i, n_jobs=-1)
    scores.append(cross_val_score(rfc, X, y, cv=10).mean())

plt.plot(range(1, 201), scores)
plt.show()

print(max(scores), scores.index(max(scores)))
# 当森林中有17课树的时候,取得的结果最好
# 0.9888888888888889 17

在这里插入图片描述

随机森林效果好于单个分类器的原因

随机森林的本质是一种装袋集成算法----Bagging,装袋集成算法是对基评估器的结果进行取平均或这多数表决的原则来决定最终模型的结果的。在上面的例子中,我们的模型中有25棵决策树。在平均或多数表决的原则下,只有13棵以上的决策树预测错误,最终结果才会显示错误。假设单一棵决策树准确率80%,则失误率为0.2.在刚才的模型中有13棵树判错的概率为:
e r r _ p r o b i l i t y = ∑ i = 13 25 C 25 i 0. 2 i ( 1 − 0.2 ) 25 − i = 0.000369 err\\_probility = \\sum _{i=13} ^{25} C_{25} ^i 0.2 ^i (1-0.2) ^{25-i} = 0.000369 err_probility=i=1325C25i0.2i(10.2)25i=0.000369
可以很明显的看出,随机森林的错误率远低于决策树。

随机森林重要属性

  • estimators :查看随机森林中每一棵树的情况
    返回一棵树的参数情况
# 建立随机森林分类器模型
rfc = RandomForestClassifier(random_state=1)
rfc.fit(X_train, y_train)
rfc.estimators_[0]
# DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
#                        max_features='auto', max_leaf_nodes=None,
#                        min_impurity_decrease=0.0, min_impurity_split=None,
#                        min_samples_leaf=1, min_samples_split=2,
#                        min_weight_fraction_leaf=0.0, presort=False,
#                        random_state=1791095845, splitter='best')
rfc.estimators_[0].random_state # 查看单个参数的取值
# 1791095845
  • oob_score_:用袋外数据来测试模型的得分
# 建立随机森林分类器模型,通过袋外数据来测试模型,测试的数据集不需要分割
rfc = RandomForestClassifier(random_state=1, oob_score=True)
rfc.fit(X, y)

rfc.oob_score_
# 0.9325842696629213

随机森林回归器

基本上参数与随机森林分类器一致,不同的是criterion的取值,回归器的取值与回归决策树一致,criterion参数取值看(决策树)。

boston数据集测试随机森林回归器

rom sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score # 交叉检验
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 导入数据集并划分训练测试集
boston = load_boston()
X = boston['data']
y = boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 训练随机森林模型
rfr = RandomForestRegressor(n_estimators=25)
rfr.fit(X_train, y_train)
r_score = rfr.score(X_test, y_test)
print("Random Forest : ", r_score)

# 训练决策树模型
dtr = DecisionTreeRegressor()
dtr.fit(X_train, y_train)
d_score = dtr.score(X_test, y_test)
print("Decision Tree : ", d_score)
# Random Forest :  0.815438704699724
# Decision Tree :  0.7151073089920836
# 明显随机森林比决策树优秀

通过交叉验证比较随机森林,和决策树在Boston数据集上的表现

r_scores = []
d_scores = []
for i in range(10) :
    rfr = RandomForestRegressor(n_estimators=25)
    r_scores.append(cross_val_score(rfr, X, y, cv=10).mean())
    
    dtr = DecisionTreeRegressor()
    d_scores.append(cross_val_score(dtr, X, y, cv=10).mean())
    
plt.plot(range(1, 11), r_scores, label='Random Forest')
plt.plot(range(1, 11), d_scores, label='Decision Tree')
plt.xticks(range(1, 11))
plt.legend(loc='best')
plt.show()

在这里插入图片描述
可以明显看出随机森林表现比决策树好很多

以上是关于sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)的主要内容,如果未能解决你的问题,请参考以下文章

如何在sklearn的随机森林中获得决策函数

随机森林

面试笔试题集:集成学习,树模型,Random Forests,GBDT,XGBoost

随机森林(Random Forest)

机器学习技法-随机森林(Random Forest)

3. 集成学习(Ensemble Learning)随机森林(Random Forest)