随机森林(random forest)

随机森林(random forest)

写在前面:本博客为周志华《机器学习》随机森林部分的读书笔记,虽有自己微小的理解补充,但理论部分大部分内容依然来自西瓜书。

集成学习系列博客:

  • 集成学习(ensemble learning)基础知识
  • 随机森林(random forest)

在前面一篇博客里(集成学习(ensemble learning)基础知识)梳理了集成学习中的基础知识,今天这篇博客就来介绍被誉为 “代表集成学习技术水平的方法”随机森林(random forest)

随机森林可以看做是bagging的一种,只是在以决策树为基学习器构建bagging集成的基础上,进一步在决策树训练过程中加入了属性随机选择,这也就是随机森林性能往往要比bagging好的原因,在前面的集成学习(ensemble learning)基础知识里介绍了bagging一般只做了样本的随机扰动,而随机森林不光有样本的随机扰动,还加入了属性的随机扰动(属性随机选择),这样就使得基学习器之间差异程度更大,因此集成后的泛化性能更加强大。

随机森林的属性随机选择是这样做的: 在前面的博客(决策树(decision tree)(一)——构造决策树方法)里,介绍了决策树在选择划分属性的时候是在当前节点的属性集合(假设有 d d d个属性)中选择一个最优属性(可以根据信息增益或者信息增益率或者基尼指数等方法作为依据),而在随机森林中,对基决策树中的每个结点,先从该结点的属性集合中随机选择 k k k个属性作为子集,然后再从这个子集里选择一个最优属性用于划分。因此这实际上相当于加入了属性的随机扰动。这里的参数 k k k能够控制随机性的引入程度,若 k = d k=d k=d,则基决策树的构建就和前面讲的传统决策树一模一样了,没有任何区别。若 k = 1 k=1 k=1,则相当于随机选择一个属性用于划分。一般情况下,推荐 k = l o g 2 d k=log_2d k=log2d

我们下面来做一个随机森林和bagging的对比(由于数据集较小,随机森林和bagging性能差异不大,有时候可能bagging性能还会好于随机森林,但是在大数据集下,通常情况下随机森林性能是相对较好的,随机森林在kaggle比赛里也很常用),代码:

# 对比bagging和random forest性能
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=33)
estimators = [1, 5, 10, 20, 40, 60, 80, 100]
bc_score = []
rfc_score = []
for i in estimators:
    bc = BaggingClassifier(n_estimators=i, random_state=1)
    bc.fit(X_train, y_train)
    bc_score.append(bc.score(X_test, y_test))
    rfc = RandomForestClassifier(n_estimators=i, max_features="log2", random_state=1)
    rfc.fit(X_train, y_train)
    rfc_score.append(rfc.score(X_test, y_test))

plt.plot(estimators, bc_score, 's-', color='r', label="Bagging")  # s-:方形
plt.plot(estimators, rfc_score, 'o-', color='g', label="RandomForest")  # o-:圆形
plt.xlabel("n_estimators")  # 横坐标名字
plt.ylabel("mean accuracy")  # 纵坐标名字
plt.legend(loc="best")
plt.show()

结果如下:

随机森林(random forest)_第1张图片

周老师在西瓜书中介绍(从上面的图中也能看出),随机森林的起始性能往往相对较差,特别是只有一个基分类器的时候,因为随机森林在基决策树中加入了属性扰动,这样会导致结点划分时选择出来的属性并不一定是最优属性,因此基学习器的性能相对传统决策树性能是下降的。但是随着基学习器数目的增加,随机森林通常会拥有更好的泛化性能。还有一点就是随机森林的训练效率要由于bagging,因为在随机森林构建基决策树的时候是随机选择 k k k个属性,然后再从中选择一个最优的属性用于划分,而bagging是从所有属性中选择一个最优的属性用于划分。
所以随机森林实际上只在bagging(基学习器用决策树)上做了一个微小的改动,即引入了属性扰动,随机选择一个 k k k个属性的子集,但是这样做却带来了巨大的好处:

  • 使得基学习器个体之间差异变大,增加了多样性,提高了集成的泛化性能。
  • 由于在构建基决策树的时候先随机选择 k k k个属性,然后再从中选择一个最优的属性用于划分,提高了训练的效率。

有时候不得不感叹,一个小小的改变却能带来如此巨大的好处,而且在机器学习中,随机 的思想是个很有意思的东西,往往能带来意想不到的好处。

你可能感兴趣的:(machine,learning,随机森林,random,forest,集成学习)