RandomForest随机森林算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RandomForest随机森林算法相关的知识,希望对你有一定的参考价值。
参考技术A https://blog.csdn.net/qq_16633405/article/details/61200502
http://blog.itpub.net/12199764/viewspace-1572056/
https://blog.csdn.net/colourful_sky/article/details/82082854
随机森林中随机是核心,通过随机的选择样本、特征,降低了决策树之间的相关性。随机森林中的随机主要有两层意思,一是随机在原始训练数据中有放回的选取等量的数据作为训练样本,二是在建立决策树时,随机的选特征中选取一部分特征建立决策树。这两种随机使得各个决策树之间的相关性小,进一步提高模型的准确性。
随机森林未用到决策树的剪枝,那怎样控制模型的过拟合呢?主要通过控制 树的深度(max_depth),结点停止分裂的最小样本数(min_size)等参数。随机森林还可以处理缺失值。
假设训练集中n个样本,每个样本有d个特征,需要训练一个包含T棵数的随机森林,具体的算法流程如下所示:
1、对于T棵决策树,分别重复如下操作:a、使用Bootstrap抽样,从训练集D获得大小为n的训练集D; b、从d个特征中随机选取m(m
2、如果是回归问题,则最后的输出是 每个树输出的均值;
3、如果是分类问题,则根据投票原则,确定最终的类别。
每棵树的生成都是随机的,至于随机选取的特征数,如何决定随机选取的特征数的大小呢,主要有两种方法,一种是交叉验证,另外一种的经验性设置 m= log_2 d +1。
1、分类间隔:分类间隔是指森林中正确分类样本的决策树的比例减去错误分类的决策树的比例,通过平均每个样本的分类间隔得到随机森林的分类间隔。对于分类间隔,当然是越大越好,大的分类间隔说明模型的分类效果比较稳定,泛化效果好。
2、袋外误差:对于每棵树都有一部分样本而没有被抽取到,这样的样本就被称为袋外样本,随机森林对袋外样本的预测错误率被称为袋外误差(Out-Of-Bag Error,OOB)。计算方式如下所示:
(1)对于每个样本,计算把该样本作为袋外样本的分类情况;
(2)以投票的方式确定该样本的分类结果;
(3)将误分类样本个数占总数的比率作为随机森林的袋外误差。
3、变量重要程度刻画:其实变量重要程度刻画不能算是模型性能评估里面,因为有的实际应用中需要查看这么多的特征中到底那一部分特征是相对重要的特征,这个时候变量的重要程度的刻画就显得尤为重要了。其计算方式主要有一下两种方式:
(1)通过计算特征的平均信息增益大小得出;
(2)通过计算每个特征对模型准确率的影响,通过打乱样本中某一特征的特征值顺序,产生新样本,将新样本放入建立好的随机森林模型计算准确率。相对于不重要的特征,即使打乱了顺序也不会对结果产生很大的影响,对于重要的特征,会对结果产生很大的影响的。
优点 :
1、对于大部分的数据,它的分类效果比较好。
2、能处理高维特征,不容易产生过拟合,模型训练速度比较快,特别是对于大数据而言。
3、在决定类别时,它可以评估变数的重要性。
4、对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。
缺点 :
1、随机森林容易产生过拟合,特别是在数据集相对小或者是低维数据集的时候。
2、 计算速度比单个的决策树慢。
3、 当我们需要推断超出范围的独立变量或非独立变量,随机森林做得并不好。
分类问题
回归问题
常用方法 :参考 https://blog.csdn.net/w952470866/article/details/78987265
predict_proba(x):给出带有概率值的结果。每个点在所有label(类别)的概率和为1。
predict(x):预测X的结果。内部还是调用的predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。
predict_log_proba(x):和predict_proba基本上一样,只是把结果给做了log()处理。
fit(X, y, sample_weight=None): 从训练数据集(X,y)上建立一个决策树森林。x为训练样本,y为目标值(分类中的类标签,回归中的实数)。
参数
和GBDT对比,GBDT的框架参数比较多,重要的有最大迭代器个数,步长和子采样比例,调参起来比较费力。但是RandomForest则比较简单,这是因为bagging框架里的各个弱学习器之间是没有依赖关系的,这减小的调参的难度。换句话说,达到同样的调参效果,RandomForest调参时间要比GBDT少一些。
Bagging框架参数 :
n_estimators:最大的弱学习器个数(建立随机森林分类器(树)的个数)。太小容易欠拟合,太大又容易过拟合,一般选择一个适中的数值。增大可以降低整体模型的方差,提升模型的准确度,且不会对子模型的偏差和方差有任何影响。由于降低的是整体模型方差公式的第二项,故准确度的提高有一个上限。在实际应用中,可以在1至200之间取值;
n_jobs:引擎允许使用处理器的数量。 若值为1则只能使用一个处理器, 值为-1则表示没有限制。设置n_jobs可以加快模型计算速度;
oob_score:是否采用袋外误差来评估模型的好坏,默认为 False,推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力;
CART决策树参数 :
max_features: RF划分时考虑的最大特征数。可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数,其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
max_depth: 决策树最大深度。默认为"None",决策树在建立子树的时候不会限制子树的深度这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
min_samples_split: 内部节点再划分所需最小样本数,默认2。这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
min_samples_leaf:叶子节点最少样本数。 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
min_weight_fraction_leaf:叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
max_leaf_nodes: 最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
min_impurity_split: 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 。一般不推荐改动默认值1e-7。
上面的决策树参数中最重要的包括最大特征数 max_features , 最大深度 max_depth , 内部节点再划分所需最小样本数 min_samples_split 和叶子节点最少样本数 min_samples_leaf 。
参数调优 :随机森林参数的调优在数据分析和挖掘中也占有一定的地位,学会好的调优方法能够达到事半功倍的效果。调优参考 https://blog.csdn.net/cherdw/article/details/54971771
以上是关于RandomForest随机森林算法的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accurayF1偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)