在集成学习原理中知道,集成学习分为两部分Bagging和Boosting。随机森林RF作为Bagging方法的典型例子,以其并行训练的优点在如今处理数据问题上广受欢迎。随机森林,顾名思义,是有多棵树组成的森林,故RF的弱学习器都是决策树。RF=Bagging+DT。下面介绍一下RF的相关知识。Bagging方法就不再介绍,可以回顾集成学习原理。
在介绍随机森林前,简单的介绍一下其构成弱学习器决策树DT。决策树是比较经典的机器学习算法,可以用来处理分类问题和回归问题。同时也是集成学习中弱学习器经常选择的机器学习算法。如RF,GBDT。
决策树是一种树型结构,每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。决策树是一种基于if-then-else规则的有监督机器学习算法。
下图为决策树示意图,圆点——内部节点,方框——叶节点
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
决策树算法有3种:
(1) ID3: 通过信息增益来选择特征,信息增益最大的优先选择。
(2)C4.5:通过信息增益比选择特征,减少信息增益容易选择特征值多的特征问题。
(3)CART:使用基尼系数Gini代替信息增益比。
随机森林(RF)其实就是多棵决策树。
通过对样本重新采样的方法得到不同的训练样本集,在这些新的训练样本集上分别训练学习器,最终合并每一个学习器的结果,作为最终的学习结果,其中,每个样本的权重是一样的。具体过程如下:
其中,在该方法中,b个学习器之间彼此是相互独立的,这样的特点使该方法更容易并行。
自助法即Bootstrap方法进行随机有放回地抽样。
学习器即为决策树DT。
随机森林构造步骤:
每棵树按照如下规则生成:
(1)如果训练集的大小为N,对于每棵树而言,随机有放回地从训练集中抽取N个训练样本,作为该树的训练集。(每棵树训练集不同,而且包含重复样本)
(2)如果每个样本的特征维度为M,指定一个常数m<
(3)每棵树都是尽最大程度生长,并且没有剪枝过程。(建立大量决策树,形成森林)
随机:样本随机、特征随机(保证不容易陷入过拟合)
分类问题:对于测试样本,森林中每棵决策树会给出最终类别,最后综合考虑每一棵树输出,投票决定。在scikit-learn中用RandomForestClassifier。使用方式如下:
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
回归问题:每棵决策树输出均值作为最终结果。在scikit-learn中用RandomForestRegressor。使用方式如下:
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
特征对目标变量预测的相对重要性可以通过(树中的决策节点的)特征使用的相对顺序(即深度)来进行评估。决策树顶部使用的特征对更大一部分输入样本的最终预测决策做出贡献;因此,可以使用接受每个特征对最终预测的贡献的样本比例来评估该 特征的相对重要性。scikit-learn通过将特征贡献的样本比例与纯度减少相结合得到特征的重要性。
通过对多个随机树中的预期贡献率 (expected activity rates)取平均,可以减少这种估计的方差 ,并将其用于特征选择。这被称作平均纯度减少,或MDI。
RF特征重要性评估:看每个特征在随机森林中每棵树上做了多大贡献值,取平均值,比较贡献大小。
贡献大小通常基于不纯度和袋外数据OOB错误率。
scikit-learn中计算RF的特征重要性调用**feature_importances_**方法是基于不纯度来进行计算的。
对于每棵树,按照不纯度给特征排序,然后整个森林取平均。分类问题不纯度采用Gini指数计算,回归问题采用方差mse。
选定一个feature M,统计RF的每一棵树中,由M形成的分支节点的Gini指数(或方差mse)下降程度之和就是M的importance。 最后,把所有求得的重要性评分做一个归一化处理。
实际上,对于训练完成的模型的这些估计值存储在feature_importances_属性中,这是一个大小为(n_features)的数组,其每个元素的值都为正,并且总和为1.0。一个元素的值越高,对应的特征预测函数的贡献越大。
下面举一个例子,用随机森林调用feature_importance_方法将特征重要性排序。
model = RandomForestRegressor()
model.fit(train_x, train_y)
y = model.feature_importances_
feature = ['Lat', 'Lon', 'Vmax', 'Dvmax', 'D200', 'JDAY',
'MPI_Vmax', 'POT', 'RHHI', 'RHLO', 'SHRD',
'SHRS', 'Speed', 'T200', 'U200',
'V200', 'WVF500', 'WVF850', 'Z500', 'Z850', 'SL',
'SST']
Feature_importances = [round(x, 4) for x in y]
F2 = pd.Series(Feature_importances, index=feature)
F2 = F2.sort_values(ascending=True)
f_index = F2.index
f_values = F2.values
x_index = list(range(0, 22))
x_index = [x/27 for x in x_index]
plt.rcParams['figure.figsize'] = (6, 7)
plt.barh(x_index, f_values, height=0.028, align="center", color='blue', tick_label=f_index)
plt.title('预测因子重要性排序', fontproperties=font_set)
plt.xlabel('importances')
plt.ylabel('features')
plt.show()
其中,train_x,train_y为训练集,本例子是将22个特征按照重要性进行排序。
结果如下:
RF需要调参的参数包括两部分,第一部分是Bagging框架的参数,第二部分是CART决策树的参数。
(1)RF框架参数
n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。
oob_score :即是否采用袋外样本来评估模型的好坏。默认是False。
criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。
从上面可以看出, RF重要的框架参数比较少,主要需要关注的是 n_estimators,即弱学习器的最大迭代次数。
(2)RF决策树参数
RF划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"auto",还有"log"和"sqrt"。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般我们用默认的"auto"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
决策树最大深度max_depth: 默认可以不输入。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2。
叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。
最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
上面决策树参数中最重要包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split。
RF的主要优点有:
1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。
2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
3) 在训练后,可以给出各个特征对于输出的重要性
4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
6) 对部分特征缺失不敏感。
RF的主要缺点有:
1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
2)取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。