Random Forest入门

from https://www.zybuluo.com/hshustc/note/179319

随机森林(Random Forest)是一个包含多个决策树的分类器, 其输出的类别由个别树输出类别的众数而定。(相当于许多不同领域的专家对数据进行分类判断,然后投票)

算法步骤(对于分类问题)

在随机森林中,每个决策树的生成过程如下所示:(建立第i棵树,原始训练集为S)
1. 用N来表示训练单个决策树所用样本的数目,M表示原始特征维度(输入矩阵N*M)。
2. 输入特征维度m,用于决策树中一个节点的决策结果,其中m应远小于M, 如sqrt(M), 1/2sqrt(M), 2sqrt(M)等。
3. 从原始训练集S中,以有放回抽样的方式,取样N次,形成一个训练集S(i),作为根节点的样本,从根节点开始训练。
4. 对于每一个节点,随机选择m个特征,运用这m个变量来决定最佳的分裂点。在决策树的生成过中,m的值是保持不变的。在这m个特征中根据信息增益来找到该节点的最佳维度的特征k及其阈值th, 当划到左节点,其余划到右节点。(列采样)
5. 用未抽到样本做预测,评估其误差。(行采样)
6. 每棵树都会完整生长而不会剪枝,因为是随机采样,所以不会出现过拟合(overfitting)。
7. 每次根据从M维特征中随机抽取的m个特征生成一个决策树,共生成t个不同的决策树,这样决策树通过投票对测试数据分类(回归时采用平均)。

算法优点

  1. 随机森林能解决分类与回归两种问题,并在这两个方面都表现良好。
  2. 随机森林对高维度数据的处理能力很强。它可以处理成千上万的输入变量,并确定最重要的变量,因此也被认为是一个很不错的降维方法。此外还能够输出变量的重要性程度。(选用不同的特征进行试分类)
  3. 对缺失数据进行估计时,随机森林是一个很有效的方法。(针对有些样本的某些维度的数据丢失)
  4. 当存在分类不平衡时,随机森林能够提供平数据集误差的有效方法。(按比例取样)
  5. 能够有效避免过拟合问题
  6. 训练和测试速度快,容易并行
  7. 随机森林中包含对输入数据的重复自抽样过程(bootstrap抽样)。数据集中大约有三分之一(why ?)将没有用于模型的训练而是用于测试, 这样的数据被称为out of bag samples, 通过这些样本估计的误差称为out of bag error。 研究表明(??), 这种out of bag的方法与测试集规模与训练集一致的估计方法有着同样的精确程度,因此在随机森林中我们无需对测试集进行另外的测试。(???)

算法缺点

  1. 随机森林对回归问题的解决并没有像它在分类中表现那么好。它并不能给出一个连续的输出,而且不能够做出超出训练集数据范围的预测。
  2. 对于统计建模者来说,随机森林跟人的感觉是像一个黑盒子——你几乎无法控制模型内部的运行,只能在不同的参数和随机种子之间进行测试。

算法实现

  • matlab

B = TreeBagger(nTree, train_data, train_label);

predict_label = predict(B,test_data'NVarToSample','all');

测试代码

load fisheriris %载入fisheriris数据包

load test_data %test_data需要自己提供,matlab不提供

%建造50棵树,训练集meas,类别species,'NVarToSample','all'表示使用randmon forest算法

b = TreeBagger(50,meas,species,'OOBPred','on','NVarToSample','all')

%画出out-of-bag的比率

plot(oobError(b)) %随着tree数目的增多,out-of-bag率在下降

xlabel('number of grown trees')

ylabel('out-of-bag classification error')

%预测

[Y] = predict(b, test_data); %这里也可以用meas这个训练数据集来做测试

  • python

#Import Library

from sklearn.ensemble import RandomForestClassifier

#use RandomForestRegressor for regression problem

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create Random Forest object

model= RandomForestClassifier(n_estimators=1000)

# Train the model using the training sets and check score

model.fit(X, y)

#Predict Output

predicted = model.predict(x_test)

####################################################################################

#all parameters

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None,bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)

参数调节

主要有3个参数(以python为例)
1. max_features
随机森林允许单个决策树使用特征的最大数量,python中常见的选项有
a. Auto/None:简单地选取所有特征,每棵树都没有限制
b. sqrt:每棵子树可以利用总特征数的平方根个,同log2
c. 0.2(0.X): 允许每个随机森林的子树可以利用特征数目20%
增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。但是,可以肯定,增加max_features会降低算法的速度。因此,需要适当的平衡和选择最佳max_features。
2. n_estimators
子树数量。在允许的范围内应选择尽可能高的值。
3. min_sample_leaf
较小的叶子使模型更容易捕捉训练数据中的噪声。推荐50,实际中应测试多种叶子大小。

注:更多可参考随机森林模型的参数调优

+
分享到:更多 ()