随机森林算法
Posted 荼靡,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机森林算法相关的知识,希望对你有一定的参考价值。
随机森林
1.1定义
- 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法。
- 随机森林非常简单,易于实现,计算开销也很小,在分类和回归表现出非常惊人的性能,因此,随机森林被誉为"代表集成学习技术水平的方法"
1.2随机森林的随机性体现的方面
- 数据集的随机选择
- 从原始数据集中采取《有放回的抽样bagging》,构造子数据集,子数据集的数据量和原始数据集相同,不同子数据集的元素可以重复,同一子数据集中的元素也可以重复
- 待选特征的随机选取
- 随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再随机选取的特征中选取最优的特征
1.3 随机森林的重要作用
- 可用于分类问题和回归问题
- 可以解决模型过拟合的问题,如果随机森林中的树足够多,那么分类器就不会出现过拟合
- 可以检测出特征的重要性,从而选取好的特征
1.4 随机森林的构建过程
- 1.从原始数据集中随机有放回采样取出m个样本生成m个训练集
- 2.对m个训练集,分别训练m个决策树模型
- 3.对于单个决策树模型,假设训练样本特征的个数为n,每次分裂时根据信息增益/信息增益比/基尼系数,选择最好的特征进行分裂
- 4.将生成的多棵决策树组成随机森林,对于分类问题,按照多棵树分类器投票决定最终分类的结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
1.5 随机森林的优缺点
- 优点
- 采用了集成算法,本身精度比大多数单个算法要好,即准确性高
- 两个随机性引入,使得随机森林不容易陷入过拟合(样本随机,特征随机)
- 两个随机性引入,使得随机森林具有一定的抗噪声能力,对比其它算法具有一定的优势
- 能够处理很高的维度(feature很多)的数据,并且不同做特征选择,对数据集的适应能力强:即能处理离散型数据,也能处理连续型数据
- 在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定的参考意义
- 缺点
- 当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大
2. 随机森林参数描述
- 分类参数
参数 | 含义 |
---|---|
n_estimators | 树的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators 越大,模型的效果越好。但是,任何一个模型都有决策边界,n_estimators 达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators 越大,需要的计算量和内存也越大,训练的时间也会越来越长,对于这个参数,希望在训练难度和模型效果之间取得平衡;默认值在现有版本的sklearn 中是10,但是在即将更新的0.22版本中,这个默认值会被修正为 100 |
random_state | 控制生成森林的模式,用来固定森林中树的随机性,当random_state 固定时,随机森林中生成是一组固定的树 |
bootstrap | 控制抽样技术参数,boostrap 默认为TRUE ,代表采用有放回的随机抽样技术 |
oob_score | 被忽略或者一次都没被采集到的样本叫做obb 袋外数据;即在使用随机森林时,可以不划分测试集和训练集,用袋外数据即可测试;将oob_score=True ,训练完毕后,可以用obb_score_ 查看在袋外数据上的测试结果 |
cirterion | 不纯度衡量指标,有基尼系数和信息熵两种选择 |
max_depath | 树的最大深度,超过最大深度的树枝都会剪掉 |
min_samples_leaf | 一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支都不会发生 |
min_samples_split | 一个节点必须包含至少min_samples_split个训练样本,这个节点才允许分枝,否则不允许分枝 |
max_features | 限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整 |
min_impurity_decrease | 限制信息增益的大小,信息增益小于设定数值的分枝不会发生 |
- 回归参数
from sklearn.ensemble import RandomForestRegression
- 所有参数,属性,接口,全部和随机分类器一致,仅有不同的就是回归树与分类树的不同,不纯度指标,参数
Criterion
不一致 Criterion
参数,回归树衡量分支质量的指标,支持的标准有三种
参数 | 含义 |
---|---|
mse | 使用均方误差(mean squared error(MSE) ,父节点与子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子结点的均值来最小化L2损失 |
friedman_mse | 使用费尔德曼均方误差,这种指标使用费尔德曼针对潜在分支中的问题改进后的均方误差 |
mae | 使用绝对平均误差(mean absolute error) ,这种指标使用叶节点的中值来最小化L1 损失 |
3. 分类随机森林的代码实现
-
分类
from sklearn.ensemble import RandomForestClassifier
-
obb_score_
重要参数from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine wine=load_wine() rfc=RandomForestClassifier(n_estimators=25,oob_score=True) rfc=rfc.fit(wine.data,wine.target) rfc.oob_score_ #0.9606741573033708
-
随机森林与决策树的效果对比
from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wine=load_wine() #随机森林与决策树的对比 x_train,x_test,y_train,y_test=train_test_split(wine.data,wine.target,test_size=0.3) clf=DecisionTreeClassifier(random_state=0) rfc=RandomForestClassifier(random_state=0) clf=clf.fit(x_train,y_train) rfc=rfc.fit(x_train,y_train) score_c=clf.score(x_test,y_test) score_r=rfc.score(x_test,y_test) print(score_c,score_r) #0.8518518518518519 0.9629629629629629
-
随机森林与决策树在一组交叉验证下的效果对比
from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt %matplotlib inline wine=load_wine() rfc=RandomForestClassifier(n_estimators=25) rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10) clf=DecisionTreeClassifier() clf_s=cross_val_score(clf,wine.data,wine.target,cv=10) plt.plot(range(1,11),rfc_s,label='RandomForest') plt.plot(range(1,11),clf_s,label='DecisionTree') plt.legend() plt.show()
-
随机森林与决策树在十组交叉验证下的效果对比
from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt %matplotlib inline wine=load_wine() rfc_l=[] clf_l=[] for i in range(10): rfc=RandomForestClassifier(n_estimators=25) rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10).mean() rfc_l.append(rfc_s) clf=DecisionTreeClassifier() clf_s=cross_val_score(clf,wine.data,wine.target,cv=10).mean() clf_l.append(clf_s) plt.plot(range(1,11),rfc_l,label="RangeForest") plt.plot(range(1,11),clf_l,label='DecisionTree') plt.legend() plt.show()
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
以上是关于随机森林算法的主要内容,如果未能解决你的问题,请参考以下文章