sklearn学习(集成算法:随机森林)

随机森林树

  • 一.概述
    • 【1】集成算法概述
      • 1.概念与应用
      • 2.集成算法的目标
      • 3.其他定义
    • 【2】sklearn中的集成算法
      • 1.sklearn中的集成算法模块ensemble
        • (1)类与类的功能
      • 2.复习:sklearn中的决策树
      • 3.sklearn的基本建模流程
  • 二.RandomForestClassifier
    • 【1】重要参数
      • 1.控制基评估器的参数
      • 2.n_estimators
    • 【2】建立一片森林
      • 1. 导入我们需要的包
      • 2. 导入需要的数据集
      • 3. 复习:sklearn建模的基本流程
        • (1)实例化
        • (2)训练集带入实例化的模型去进行训练使用的接口是fit
        • (3)使用其他接口将测试机导入我们训练好的模型中,去获取我们需要的结果(score,Y_test)
      • 4. 画出随机森林和决策树在十组交叉验证下的效果对比
      • 5. n_estimators的学习曲线
      • 6.random_state
    • 【3】重要属性和接口

一.概述

【1】集成算法概述

1.概念与应用

集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性

2.集成算法的目标

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

3.其他定义

多个模型集成成为的模型叫做集成评估器(ensemble estimator)
组成集成评估器的每个模型都叫做基评估器
(base estimator)

通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。
sklearn学习(集成算法:随机森林)_第1张图片

【2】sklearn中的集成算法

1.sklearn中的集成算法模块ensemble

(1)类与类的功能
类的功能
ensemble.AdaBoostClassifier AdaBoost 分类
ensemble.AdaBoostClassifier AdaBoost 分类
ensemble.AdaBoostRegressor Adaboost 回归
ensemble.BaggingClassifier 装袋分类器
ensemble.BaggingRegressor 装袋回归器
ensemble.ExtraTreesClassifier Extra-trees分类(超树,极端随机树)
ensemble.ExtraTreesRegressor Extra-trees回归
ensemble.GradientBoostingClassifier 梯度提升分类
ensemble.GradientBoostingRegressor 梯度提升回归
ensemble.IsolationForest 隔离森林
ensemble.RandomForestClassifier 随机森林分类
ensemble.RandomForestRegressor 随机森林回归
ensemble.RandomTreesEmbedding 完全随机树的集成
ensemble.VotingClassifier 用于不合适估算器的软投票/多数规则分类器

2.复习:sklearn中的决策树

决策树是一种原理简单,应用广泛的模型,它可以同时被用于分类和回归问题。决策树的主要功能是从一张有特征和标签的表格中,通过对特定特征进行提问,为我们总结出一系列决策规则,并用树状图来呈现这些决策规则
sklearn学习(集成算法:随机森林)_第2张图片
决策树的核心问题有两个,一个是如何找出正确的特征来进行提问,即如何分枝,二是树生长到什么时候应该停
下。
对于第一个问题,我们定义了用来衡量分枝质量的指标不纯度,分类树的不纯度用基尼系数或信息熵来衡量,回归
树的不纯度用MSE均方误差来衡量。每次分枝时,决策树对所有的特征进行不纯度计算,选取不纯度最低的特征进行分枝,分枝后,又再对被分枝的不同取值下,计算每个特征的不纯度,继续选取不纯度最低的特征进行分枝。
每分枝一层,树整体的不纯度会越来越小,决策树追求的是最小不纯度。因此,决策树会一致分枝,直到没有更多
的特征可用,或整体的不纯度指标已经最优,决策树就会停止生长。
决策树非常容易过拟合,这是说,它很容易在训练集上表现优秀,却在测试集上表现很糟糕。为了防止决策树的过
拟合,我们要对决策树进行剪枝,
sklearn学习(集成算法:随机森林)_第3张图片

3.sklearn的基本建模流程

sklearn学习(集成算法:随机森林)_第4张图片


from sklearn.tree import RandomForestClassifier #导入需要的模块
rfc = RandomForestClassifier()     #实例化
rfc = rfc.fit(X_train,y_train) #用训练集数据训练模型
result = rfc.score(X_test,y_test) #导入测试集,从接口中调用需要的信息

二.RandomForestClassifier

class sklearn.ensemble.RandomForestClassifier (n_estimators=10, criterion=’gini’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’,
max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森
林分类器,回归树所集成的森林就叫做随机森林回归器。

【1】重要参数

1.控制基评估器的参数

参数 含义
criterion 不纯度的衡量指标,有基尼系数和信息熵两种选择
max_depth 树的最大深度,超过最大深度的树枝都会被剪掉
min_samples_leaf 一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
min_samples_split 一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
max_features 限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整
min_impurity_decrease 限制信息增益的大小,信息增益小于设定数值的分枝不会发生

2.n_estimators

这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
n_estimators的默认值在现有版本的sklearn中是10,但是在即将更新的0.22版本中,这个默认值会被修正为100。这个修正显示出了使用者的调参倾向:要更大的n_estimators。

【2】建立一片森林

树模型的优点是简单易懂,可视化之后的树人人都能够看懂,可惜随机森林是无法被可视化的。所以为了更加直观
地让大家体会随机森林的效果,我们来进行一个随机森林和单个决策树效益的对比。我们依然使用红酒数据集

1. 导入我们需要的包

%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine

sklearn学习(集成算法:随机森林)_第5张图片

2. 导入需要的数据集

wine = load_wine()
wine.data
wine.target

sklearn学习(集成算法:随机森林)_第6张图片

3. 复习:sklearn建模的基本流程

(1)实例化
(2)训练集带入实例化的模型去进行训练使用的接口是fit
(3)使用其他接口将测试机导入我们训练好的模型中,去获取我们需要的结果(score,Y_test)

sklearn学习(集成算法:随机森林)_第7张图片

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)
     )

4. 画出随机森林和决策树在十组交叉验证下的效果对比

#交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-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()
#是否有注意到,单个决策树的波动轨迹和随机森林一致?
#再次验证了我们之前提到的,单个决策树的准确率越高,随机森林的准确率也会越高

sklearn学习(集成算法:随机森林)_第8张图片
sklearn学习(集成算法:随机森林)_第9张图片
为循环十次后的结果

5. n_estimators的学习曲线

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)))
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()

sklearn学习(集成算法:随机森林)_第10张图片

6.random_state

随机森林的本质是一种袋装集成算法,袋装集成算法是对其评估器的预测结果进行平均或多数表决原则来决集成评估器的结果
在刚才的红酒例子中建立了25棵树,对于任何一个样本而言,平均或多数表示原则下,当且仅当13棵以上的树判断错误的时候,随机森林才会判断错误,单独一棵决策树对红酒数据的分类标准准确率在0.85上下波动,建设一棵树,判断错误的可能性为0.2那20棵树以上的判断错误可能为

e = ∑ i = 13 25 C 25 i ε i ( 1 − ε ) 25 − i {e}=\sum _{i=13}^{25}C_{25}^{i}\varepsilon ^{i}\left( 1-\varepsilon \right) ^{25-i} e=i=1325C25iεi(1ε)25i=0.000369

其中,i=判断错误的次数,也是判断的树的数量, ε \varepsilon ε是一棵树判断错误的概率。(1- ε \varepsilon ε )是判断正确的概率,共判断对23- i i i次,采用组合,是因为25棵树中,任何 i i i棵树都判断错误。

import numpy as np 
from scipy.special import comb
np.array([comb(25,i)*(0.2**i)*((1-0.2)**(25-i)) for i in range(13,26)]).sum()

在这里插入图片描述
0.00036904803455582827

【3】重要属性和接口

随机森林中有三个非常重要的属性:.estimators_,.oob_score_以及.feature_importances_。
.estimators_是用来查看随机森林中所有树的列表的。
oob_score_指的是袋外得分。随机森林为了确保林中的每棵树都不尽相同,所以采用了对训练集进行有放回抽样的方式来不断组成信的训练集,在这个过程中,会有一些数据从来没有被随机挑选到,他们就被叫做“袋外数据”。这
些袋外数据,没有被模型用来进行训练,sklearn可以帮助我们用他们来测试模型,测试的结果就由这个属性
oob_score_来导出,本质还是模型的精确度。
而.feature_importances_和决策树中的.feature_importances_用法和含义都一致,是返回特征的重要性。
随机森林的接口与决策树完全一致,因此依然有四个常用接口:apply, fit, predict和score。除此之外,还需要注
意随机森林的predict_proba接口,这个接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类
就返回几个概率。如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于0.5的,被分为0。
传统的随机森林是利用袋装法中的规则,平均或少数服从多数来决定集成的结果,而sklearn中的随机森林是平均
每个样本对应的predict_proba返回的概率,得到一个平均概率,从而决定测试样本的分类。

rfc = RandomForestClassifier(n_estimators=25)
rfc = rfc.fit(Xtrain, Ytrain)
rfc.score(Xtest,Ytest)
rfc.feature_importances_
rfc.apply(Xtest)
rfc.predict(Xtest)
rfc.predict_proba(Xtest)

你可能感兴趣的:(sklearn学习,决策树,算法,机器学习)