原创 集成学习之随机森林(random forest)

2020-8-26 17:16 861 12 12 分类: 机器人/ AI

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

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

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

我们下面来做一个随机森林和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()
  • 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

结果如下:

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

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

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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条