随机森林与调参

学习地址

决策树
随机森林与调参课件
菜菜的机器学习Sklearn课堂


集成算法

集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。在各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成算法的身影随处可见,效果之好,应用之广。

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

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

通常来说,有三类集成算法:装袋法(Bagging), 提升法(Boosting)以及Stacking
集成算法

sklearn中的集成算法

  • sklearn中的集成算法模块ensemble
    各种集成算法

随机森林建模

1
2
3
4
5
from sklearn.tree import RandomForestClassifier #导入需要的模块

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

随机森林分类器

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

重要参数
  1. n_estimators=: 森林中树的数量,即基评估器的数量,数量越大模型效果往往越好,默认为10,但是在即将更新的0.22版本中,这个默认值会被修正为100
  2. 其他基本和决策树一样

单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或者少数服从多数原则来决定集成的结果的。

实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sklearn.tree import DecisionTreeClassifier # 导入分类树
from sklearn.ensemble import RandomForestClassifier # 导入集成随机森林
from sklearn.datasets import load_wine # 数据集
from sklearn.model_selection import train_test_split # 区分训练集和测试集
import pandas as pd
import matplotlib.pyplot as plt

wine=load_wine()

X_train,X_test,Y_train,Y_test=train_test_split(wine.data,wine.target,test_size=0.3) # 30%作为测试集

clf=DecisionTreeClassifier(random_state=0) # 确定随机性
rfc=RandomForestClassifier(random_state=0) # 固定随机森林

clf=clf.fit(X_train,Y_train)
rfc=rfc.fit(X_train,Y_train)

score_c=clf.score(X_test,Y_test)
score_r=rfc.score(X_test,Y_test)
print(score_c,score_r) # 0.8518518518518519 0.9814814814814815
随机森林与决策树对比
  • 交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-1份做训练集,多次训练模型以观测模型稳定性的方法,这样就会有n个结果,取均值即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    from sklearn.tree import DecisionTreeClassifier # 导入分类树
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.datasets import load_wine # 数据集
    from sklearn.model_selection import train_test_split # 区分训练集和测试集
    from sklearn.model_selection import cross_val_score
    import pandas as pd
    import matplotlib.pyplot as plt

    wine=load_wine()

    X_train,X_test,Y_train,Y_test=train_test_split(wine.data,wine.target,test_size=0.3) # 30%作为测试集

    score_r=[]
    score_c=[]
    for i in range(10):
    clf=DecisionTreeClassifier()
    clf_s=cross_val_score(clf,wine.data,wine.target,cv=10).mean() # Evaluate a score by cross-validation
    score_c.append(clf_s)
    rfc=RandomForestClassifier(n_estimators=25)
    rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    score_r.append(rfc_s)

    plt.plot(range(1,11),score_r,label = "Random Forest")
    plt.plot(range(1,11),score_c,label = "Decision Tree")
    plt.legend()
    plt.show()

交叉验证

重要属性和接口

随机森林中有三个非常重要的属性:.estimators_.oob_score_以及.feature_importances_

  1. .estimators_是用来查看随机森林中所有树的列表的
  2. .oob_score_指的是袋外得分。随机森林为了确保林中的每棵树都不尽相同,所以采用了对训练集进行有放回抽样的方式来不断组成信的训练集,在这个过程中,会有一些数据从来没有被随机挑选到,他们就被叫做“袋外数据”。这些袋外数据,没有被模型用来进行训练,sklearn可以帮助我们用他们来测试模型,测试的结果就由这个属性oob_score_来导出,本质还是模型的精确度
  3. .feature_importances_和决策树中的.feature_importances_用法和含义都一致,是返回特征的重要性

随机森林的接口与决策树完全一致,因此依然有四个常用接口:apply, fit, predictscore。除此之外,还需要注意随机森林的predict_proba接口,这个接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类就返回几个概率。

机器学习中调参的基本思想

通过画学习曲线,或者网格搜索,我们能够探索到调参边缘(代价可能是训练一次模型要跑三天三夜)
但是在现实中,高手调参恐怕还是多依赖于经验,而这些经验,来源于:
1)非常正确的调参思路和方法
2)对模型评估指标的理解
3)对数据的感觉和经验
4)用洪荒之力去不断地尝试

泛化误差

用来衡量模型在未知数据上的准确率的指标
当模型在未知数据上(训练集或袋外数据)表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型效果不好。泛化误差与模型复杂度关系:
泛化误差
对于本文的树模型来说,树越茂盛,深度越深,模型也就越复杂,所以树模型是天生趋于复杂的模型,随机森林以树模型为基础。所以,随机森林的参数都是向着一个目标去的:减少模型的复杂度,防止过拟合。但是,调参没有绝对的,再调参之前需要判断模型处于过拟合还是欠拟合。
泛化误差实际上是偏差-方差困境

参数对模型的影响程度
参数 对模型在未知数据上的评估性能的影响 影响程度
n_estimators 提升至平稳,n_estimators↑,不影响单个模型的复杂度 ⭐⭐⭐⭐
max_depth 有增有减,默认最大深度,即最高复杂度,向复杂度降低的方向调参max_depth↓,模型更简单,且向图像的左边移动 ⭐⭐⭐
min_samples_leaf 有增有减,默认最小限制1,即最高复杂度,向复杂度降低的方向调参min_samples_leaf↑,模型更简单,且向图像的左边移动 ⭐⭐
min_samples_split 有增有减,默认最小限制2,即最高复杂度,向复杂度降低的方向调参min_samples_split↑,模型更简单,且向图像的左边移动 ⭐⭐
max_features 有增有减,默认auto,是特征总数的开平方,位于中间复杂度,既可以向复杂度升高的方向,也可以向复杂度降低的方向调参max_features↓,模型更简单,图像左移max_features↑,模型更复杂,图像右移max_features是唯一的,能够让模型更简单,也能够让模型更复杂的参数,所以在调整这个参数的时候,需要考虑我们调参的方向
criterion 有增有减,一般使用gini 看具体情况

关于偏差与方差

一个集成模型(f)在未知数据集(D)上的泛化误差E(f;D),由方差(var),偏差(bais)和噪声(ε)共同决定:
泛化误差

偏差:模型的预测值与真实值之间的差异。在集成算法中,每个基评估器都会有自己的偏差,集成评估器的偏差是所有基评估器偏差的均值。模型越精确,偏差越低。

方差:反映的是模型每一次输出结果与模型预测值的平均水平之间的误差,衡量模型的稳定性。模型越稳定,方差越低。

随着模型越来越复杂,偏差会越来越小,而方差可能就越来越大了。调参的目的就是为了找到偏差曲线与方差曲线的交叉点