随机森林 - Random_Forest

什么是随机森林(Random Forest) ?

  • 一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来做出最终决策。
  • 随机森林是用随机的方式建立一个森林,森林由很多的决策树组成,而且每一棵决策树之间没有关联。得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类,再看看哪一类被选择最多,就预测这个样本为哪一类
  • 每一棵决策树就是一个精通某一个领域的专家,这样在随机森林中就有了很多个精通不同领域的专家,对于一个新的问题(新的输入数据),可以从不同的角度去看待它,最终由各个专家投票得到结果

随机森林如何评估特征重要性?

  • 随机森林中进行特征重要性的评估思想为: 判断每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。其中关于贡献的计算方式可以是基尼指数或袋外数据错误率。
  • 以基于袋外数据为例, 对于一棵树 ,用 OOB 样本可以得到误差 e1,然后随机改变 OOB 中的第 j 列,保持其他列不变,对第 j 列进行随机的上下置换,得到误差 e2。至此,可以用 e1−e2 来刻画特征 j 的重要性。其依据就是,如果一个特征很重要,那么其变动后会非常影响测试误差,如果测试误差没有怎么改变,则说明特征 j 不重要

随机森林如何处理缺失值?

  • 方法一(na.roughfix) 简单粗暴,对于训练集,同一个 class 下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。
  • 方法二(rfImpute) 这个方法计算量大,至于比方法一好坏?不好判断。先用 na.roughfix 补上缺失值,然后构建森林并计算 proximity matrix,再回头看缺失值,如果是分类变量,则用没有阵进行加权平均的方法补缺失值。然后迭代 4-6 次,这个补缺失值的思想和 KNN 有些类似 1 缺失的观测实例的 proximity 中的权重进行投票。如果是连续型变量,则用 proximity 矩 2

什么是包外数据 (out-of-bag, OOB)?他是如何计算的?

  • 未在训练集中出现的测试数据包外数据 (out-of-bag, OOB)
  • 对于一个样本,它在某一次含 m 个样本的训练集的随机采样中,每次被采集到的概率是 1/m。不被采集到的概率为 1−1/m,若 m 次采样都没有被采集中的概率是 (1−1/m)^m, 当 m⇒∞时,(1−1/m)^m⇒1/e≃0.368,即每轮随机采样中,训练集中大约有 36.8% 的数据没有被采样集采集中

什么是包外估计(out-of-bag estimate)?

  • 使用包外数据 (out-of-bag, OOB) 作出决策的方法

RF 与 GBDT 之间的区别与联系?

  • 相同点:都是由多棵树组成,最终的结果都是由多棵树一起决定。
  • 不同点: 组成随机森林的树可以分类树也可以是回归树,而 GBDT 只由回归树组成 组成随机森林的树可以并行生成,而 GBDT 是串行生成 随机森林的结果是多数表决表决的,而 GBDT 则是多棵树累加之和 随机森林对异常值不敏感,而 GBDT 对异常值比较敏感 随机森林是减少模型的方差,而 GBDT 是减少模型的偏差 随机森林不需要进行特征归一化,而 GBDT 则需要进行特征归一化

在 scikit-learn 中,随机森林如何应用于分类任务?

  • 随机森林是一个元估计器,它在数据集的不同子样本上拟合一些决策树分类器,并使用平均法来提高预测精度和控制过拟合 (overfitting)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     >>> from sklearn.ensemble import RandomForestClassifier
    >>> from sklearn.datasets import make_classification
    >>> X, y = make_classification(n_samples=1000, n_features=4,
    ... n_informative=2, n_redundant=0,
    ... random_state=0, shuffle=False)
    >>> clf = RandomForestClassifier(max_depth=2, random_state=0)
    >>> clf.fit(X, y)
    RandomForestClassifier(...)
    >>> print(clf.predict([[0, 0, 0, 0]]))
    [1]

在 scikit-learn 中,随机森林如何应用于回归任务?

  • 随机森林是一个元估计器,它在数据集的不同子样本上拟合一些分类决策树,并使用平均法来提高预测精度和控制过拟合 (overfitting)
    1
    2
    3
    4
    5
    6
    7
    8
    9
     >>> from sklearn.ensemble import RandomForestRegressor
    >>> from sklearn.datasets import make_regression
    >>> X, y = make_regression(n_features=4, n_informative=2,
    ... random_state=0, shuffle=False)
    >>> regr = RandomForestRegressor(max_depth=2, random_state=0)
    >>> regr.fit(X, y)
    RandomForestRegressor(...)
    >>> print(regr.predict([[0, 0, 0, 0]]))
    [-8.32987858]