随机森林算法思想

随机森林(Random Forest)使用多个CART决策树作为弱学习器,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。

随机森林在生成决策树的时候用随机选择的特征,即使用Bagging方法。这么做的原因是:如果训练集中的某几个特征对输出的结果有很强的预测性,那么这些特征会被每个决策树所应用,这样会导致树之间具有相关性,这样并不会减小模型的方差。

随机森林对决策树的建立做了一些改进:

随机森林不会像普通决策树一样选择最优特征进行子树的划分,而是随机选择节点上的一部分样本特征:Nsub(子集),然后在随机挑选出来的集合Nsub中,选择一个最优的特征来做决策树的左右子树划分。一般情况下,推荐子集Nsub内特征的个数为log2d个。这样进一步增强了模型的泛化能力。

如果Nsub=N,则此时随机森林的CART决策树和普通的CART决策树没有区别。Nsub越小,则模型越健壮。当然此时对于训练集的拟合程度会变差。也就是说Nsub越小,模型的方差会减小,但是偏差会增大。在实际案例中,一般会通过交叉验证调参获取一个合适的的Nsub值。

随机森林有一个缺点:不像决策树一样有很好地解释性。但是,随机森林有更好地准确性,同时也并不需要修剪随机森林。对于随机森林来说,只需要选择一个参数,生成决策树的个数。通常情况下,决策树的个数越多,性能越好,但是,计算开销同时也增大了。

随机森林建立过程

第一步:原始训练集D中有N个样本,且每个样本有W维特征。从数据集D中有放回的随机抽取x个样本(Bootstraping方法)组成训练子集Dsub,一共进行w次采样,即生成w个训练子集Dsub。

第二步:每个训练子集Dsub形成一棵决策树,形成了一共w棵决策树。而每一次未被抽到的样本则组成了w个oob(用来做预估)。

第三步:对于单个决策树,树的每个节点处从M个特征中随机挑选m(m<M)个特征,按照结点不纯度最小原则进行分裂。每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝。

第四步:根据生成的多个决策树分类器对需要进行预测的数据进行预测。根据每棵决策树的投票结果,如果是分类树的话,最后取票数最高的一个类别;如果是回归树的话,利用简单的平均得到最终结果。

随机森林算法优缺点总结及面试问题

随机森林是Bagging的一个扩展变体,是在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择

随机森林简单、容易实现、计算开销小,在很多实际应用中都变现出了强大的性能,被誉为“代表集成学习技术水平的方法”。可以看出,随机森林对Bagging只做了小改动。并且,Bagging满足差异性的方法是对训练集进行采样;而随机森林不但对训练集进行随机采样,而且还随机选择特征子集,这就使最终集成的泛化性进一步提升。

随着基学习器数目的增加,随机森林通常会收敛到更低的泛化误差,并且训练效率是优于Bagging的。

总结一下随机森林的优缺点:

优点:

  • 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。
  • 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
  • 在训练后,可以给出各个特征对于输出的重要性。
  • 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
  • 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
  • 对部分特征缺失不敏感。

缺点有:

  • 在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
  • 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

下面看几个面试问题:

1、为什么要有放回的抽样?保证样本集间有重叠,若不放回,每个训练样本集及其分布都不一样,可能导致训练的各决策树差异性很大,最终多数表决无法 “求同”,即最终多数表决相当于“求同”过程。

2、为什么RF的训练效率优于bagging?因为在个体决策树的构建过程中,Bagging使用的是“确定型”决策树,bagging在选择划分属性时要对每棵树是对所有特征进行考察;而随机森林仅仅考虑一个特征子集。

3、随机森林需要剪枝吗?不需要,后剪枝是为了避免过拟合,随机森林随机选择变量与树的数量,已经避免了过拟合,没必要去剪枝了。一般rf要控制的是树的规模,而不是树的置信度,剩下的每棵树需要做的就是尽可能的在自己所对应的数据(特征)集情况下尽可能的做到最好的预测结果。剪枝的作用其实被集成方法消解了,所以用处不大。

Extra-Tree及其与RF的区别

Extra-Tree是随机森林的一个变种, 原理几乎和随机森林一模一样,可以称为:“极其随机森林”,即决策树在节点的划分上,使用随机的特征和随机的阈值。

特征和阈值提供了额外随机性,抑制了过拟合,再一次用高偏差换低方差。它还使得 Extra-Tree 比规则的随机森林更快地训练,因为在每个节点上找到每个特征的最佳阈值是生长树最耗时的任务之一。

Extra-Tree与随机森林的区别有以下两点:

  1. 对于每个决策树的训练集,随机森林采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而Extra-Tree一般不采用随机采样,即每个决策树采用原始训练集。
  2. 在选定了划分特征后,随机森林的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是Extra-Tree比较的激进,他会随机的选择一个特征值来划分决策树。

从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于随机森林所生成的决策树。也就是说,模型的方差相对于随机森林进一步减少,但是偏倚相对于随机森林进一步增大。在某些时候,Extra-Tree的泛化能力比随机森林更好。

RF评估特征重要性

在实际业务场景中,我们会关系如何在高维数据中选择对结果影响最大的前n个特征。我们可以使用PCA、LASSO等方法,当然也可以用RF算法来进行特征选择。感兴趣的话。

RF算法的有一个典型的应用:评估单个特征变量的重要性并进行特征选择。

举一个具体的应用场景:银行贷款业务中能否正确的评估企业的信用度,关系到能否有效地回收贷款。但是信用评估模型的数据特征有很多,其中不乏有很多噪音,所以需要计算出每一个特征的重要性并对这些特征进行一个排序,进而可以从所有特征中选择出重要性靠前的特征。

下面我们来看看评估特征重要性的步骤:

  1. 对于RF中的每一棵决策树,选择OOB数据计算模型的预测错误率,记为Error1。(在随机森林算法中不需要再进行交叉验证来获取测试集误差的无偏估计)

  2. 然后在OOB中所有样本的特征A上加入随机噪声,接着再次用OOB数据计算模型预测错误率,记为Error2。

  3. 若森林中有N棵树,则特征A的重要性为 求和(Error2-Error1/N)。

我们细品:在某一特征A上增加了噪音,那么就有理由相信错误率Error2要大于Error1,Error2越大说明特征A重要。

可以这么理解,小A从公司离职了,这个公司倒闭了,说明小A很重要;如果小A走了,公司没变化,说明小A也没啥用。

在sklearn中我们可以这么做:

1
2
3
4
5
6
7
8
from sklearn.cross_validation import train_test_split
from sklearn.ensemble import RandomForestClassifier

(处理数据)

rf_clf = RandomForestClassifier(n_estimators=1000, random_state=666)
rf_clf.fit(x_train, y_train)
importances = rf_clf.feature_importances_

从重要性到特征选择

我们已经知道如何使用RF算法评估特征重要性了,那么在此基础上做特征选择就很简单了:

  1. 对每一个特征都计算其特征重要性。
  2. 将这些特征按照重要性从大到小排序。
  3. 设置要删除的特征的比率,删除重要性最小的那些特征。
  4. 剩下的那些特征,继续计算每个每个特征的重要性,然后循环回第一步,直到剩余特征数达到我们的要求。

承接上面的代码,我们进行特征选择:

1
2
threshold = [某个阈值]
x_selected = x_train[:, importances > threshold]