随机森林算法梳理

随机森林算法梳理,第1张

全称Bootstrap Aggregation的集成算法。每个基学习器都会对训练集进行 有放回抽样得到子训练集 ,比较著名的采样法为 0.632 自助法。每个基学习器 基于不同子训练集进行训练,并综合所有基学习器的预测值得到最终的预测结果 。 Bagging 常用的综合方法是投票法,票数最多的类别为预测类别 。

Boosting 训练过程为阶梯状, 基模型的训练是有顺序的,每个基模型都会在前一个基模型学习的基础上进行学习,最终综合所有基模型的预测值产生最终的预测结果,用的比较多的综合方式为加权法 。

Stacking 是 先用全部数据训练好基模型,然后每个基模型都对每个训练样本进行的预测,其预测值将作为训练样本的特征值,最终会得到新的训练样本,然后基于新的训练样本进行训练得到模型,然后得到最终预测结果。

那么,为什么集成学习会好于单个学习器呢?原因可能有三:

训练样本可能无法选择出最好的单个学习器,由于没法选择出最好的学习器,所以干脆结合起来一起用;

假设能找到最好的学习器,但由于算法运算的限制无法找到最优解,只能找到次优解,采用集成学习可以弥补算法的不足;

可能算法无法得到最优解,而集成学习能够得到近似解。比如说最优解是一条对角线,而单个决策树得到的结果只能是平行于坐标轴的,但是集成学习可以去拟合这条对角线。

不是所有集成学习框架中的基模型都是弱模型。Bagging 和 Stacking 中的基模型为强模型(偏差低,方差高),而Boosting 中的基模型为弱模型(偏差高,方差低)。

对于 Bagging 来说,每个基模型的权重等于 1/m 且期望近似相等,故我们可以得到:

通过上式我们可以看到:

在此我们知道了为什么 Bagging 中的基模型一定要为强模型,如果 Bagging 使用弱模型则会导致整体模型的偏差提高,而准确度降低。Random Forest 是经典的基于 Bagging 框架的模型,并在此基础上通过引入特征采样和样本采样来降低基模型间的相关性,在公式中显著降低方差公式中的第二项,略微升高第一项,从而使得整体降低模型整体方差。

对于 Boosting 来说,由于基模型共用同一套训练集,所以基模型间具有强相关性,故模型间的相关系数近似等于 1,针对 Boosting 化简公式为:

通过观察整体方差的表达式我们容易发现:

基于 Boosting 框架的 Gradient Boosting Decision Tree 模型中基模型也为树模型,同 Random Forrest,我们也可以对特征进行随机抽样来使基模型间的相关性降低,从而达到减少方差的效果。

️那么这里有一个小小的疑问,Bagging 和 Boosting 到底用的是什么模型呢?

随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于集成学习方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这也是随机森林的主要思想--集成思想的体现。然而,bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。

“森林”容易理解,就是由很多“树”组成,那么“随机”体现在什么方面呢?

(1)训练集随机的选取:如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;这样保证了每颗树的训练集都不同,从而构建的树也不同

(2)特征的随机选取:从M个特征中选取m个特征,这样可以避免某个特征与分类结果具有强相关性,如果所有特征都选取,那么所有的树都会很相似,那样就不够“随机”了

另外还有一点,随机森林法构建树的时候不需要做额外的剪枝 *** 作。个人理解:因为前两个“随机” *** 作,以及多颗树的建立,已经避免了过拟合现象,所以这种情况下,我们只需要让每棵树在它自己的领域内做到最好就可以了。

随机森林算法的预测性能与两个因素有关:

(1)森林中任意两棵树的相关性,相关性越强,则总体性能越容易差

(2)森林中每棵树的预测性能,每棵树越好,则总体性能越好

其实可以理解为要求“好而不同”。然而特征数m的选择越大,则相关性与个体性能都比较好,特征数m选择越小,则相关性与个体性能都更小,所以m的选择影响着随机森林的预测性能。

在包括N个样本的数据集中,采用有放回的抽样方式选择N个样本,构成中间数据集,然后在这个中间数据集的所有特征中随机选择几个特征,作为最终的数据集。以上述方式构建多个数据集;一般回归问题选用全部特征,分类问题选择全部特征个数的平方根个特征

利用CART为每个数据集建立一个完全分裂、没有经过剪枝的决策树,最终得到多棵CART决策树;

根据得到的每一个决策树的结果来计算新数据的预测值。

由于RF在实际应用中的良好特性,基于RF,有很多变种算法,应用也很广泛,不光可以用于分类回归,还可以用于特征转换,异常点检测等。下面对于这些RF家族的算法中有代表性的做一个总结。

extra trees是RF的一个变种, 原理几乎和RF一模一样,有区别有:

对于每个决策树的训练集,RF采用的是 随机采样bootstrap来选择采样集作为每个决策树的训练集 ,而extra trees一般不采用随机采样,即 每个决策树采用原始训练集。

在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。

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

Totally Random Trees Embedding(以下简称 TRTE)是一种 非监督学习的数据转化方法。它将低维的数据集映射到高维 ,从而让映射到高维的数据更好的运用于分类回归模型。我们知道,在支持向量机中运用了核方法来将低维的数据集映射到高维,此处TRTE提供了另外一种方法。

TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。比如我们有3颗决策树,每个决策树有5个叶子节点,某个数据特征x划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。

映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。

Isolation Forest(以下简称IForest)是一种 异常点检测的方法。 它也使用了类似于RF的方法来检测异常点。

对于在T个决策树的样本集,IForest也会对训练集进行随机采样,但是采样个数不需要和RF一样,对于RF,需要采样到采样集样本个数等于训练集个数。但是IForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数?为什么呢?因为我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。

对于每一个决策树的建立, IForest采用随机选择一个划分特征,对划分特征随机选择一个划分阈值。这点也和RF不同。

另外,IForest一般会选择一个比较小的最大决策树深度max_depth,原因同样本采集,用少量的异常点检测一般不需要这么大规模的决策树。

对于异常点的判断,则是将测试样本点x拟合到T颗决策树。计算在每颗决策树上该样本的叶子节点的深度ht(x),从而可以计算出平均高度h(x)。此时我们用下面的公式计算样本点x的异常概率:

其中,m为样本个数。c(m)的表达式为:

s(x,m)的取值范围是[0,1],取值越接近于1,则是异常点的概率也越大。

RF的主要优点有:

训练可以 高度并行化 ,对于大数据时代的大样本训练速度有优势。

由于可以随机选择决策树节点划分特征,这样在 样本特征维度很高的时候,仍然能高效的训练模型。

在训练后,可以给出各个特征对于输出的重要性

由于采用了随机采样,训练出的模型的 方差小,泛化能力强。

相对于Boosting系列的Adaboost和GBDT, RF实现比较简单

对部分特征缺失不敏感。

缺点:

在某些噪音比较大的样本集上, RF模型容易陷入过拟合。

取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

数据维度相对低(几十维),同时对准确性有较高要求时。

因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。

sklearn.ensemble.RandomForestClassifier(n_estimators=100, 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, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

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

随机森林(Random forest)指的是利用多棵树对样本进行训练并预测的一种分类器。 并且其输出的类别是由个别树输出的类别的众数而定。在机器学习中有一个地位很重要的包scikit-learn可实现随机森林算法。

原理:(随机森林的分类预测和回归预测sklearn.ensemble.RandomForestRegressor方法)

(1)给定训练集S,测试集T,特征维数F。确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m,对于第1-t棵树,i=1-t:

(2)从S中有放回的抽取大小和S一样的训练集S(i),作为根节点的样本,从根节点开始训练

(3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;如果是回归问题,预测输出为当前节点样本集各个样本值的平均值。然后继续训练其他节点。如果当前节点没有达到终止条件,则从F维特征中无放回的随机选取f维特征。利用这f维特征,寻找分类效果最好的一维特征k及其阈值th,当前节点上样本第k维特征小于th的样本被划分到左节点,其余的被划分到右节点。继续训练其他节点。

(4)重复(2)(3)直到所有节点都训练过了或者被标记为叶子节点。

(5)重复(2),(3),(4)直到所有CART都被训练过。

随机森林的简单实现过程如下:

一、 开发环境、编译环境:

PyCharm Community Edition 2016.2.3

Python2.7.10

二、 所用库及安装方法:

pandas[python自带]

sklearn:命令行pip install sklearn如果没有安装pip,先使用easy_install pip安装pip;如果在MAC上没有权限,使用sudo pip install sklearn

三、 代码介绍

1. 使用pandas读取本地excel的训练集和测试集,将属性集赋给X_train和Y_train将要预测的集合赋给X_test和Y_test

2. 使用DictVectorizer对数据进行规范化、标准化

3. 生成RandomForestRegressor对象,并将训练集传入fit方法中进行训练

4. 调用predict函数进行预测,并将结果存入y_predict变量中;

5. 使用mean_squared_error、score方法输出MSE、NMSE值对拟合度、稳定度进行分析;输出feature_importance,对影响最终结果的属性进行分析;

6. 详细代码见附录

四、 附录

# coding:utf-8

import pandas as pd

data_train = pd.read_excel('/Users/xiaoliu/Desktop/data_train.xlsx')

X_train = data_train[['CPI', 'GDP', 'PPI', 'AJR', 'BJFJ', 'FBDR', 'PCFD', 'PCFDED', 'BDR']]

y_train = data_train['FJ']

data_test = pd.read_excel('/Users/xiaoliu/Desktop/data_test.xlsx')

X_test = data_test[['CPI', 'GDP', 'PPI', 'AJR', 'BJFJ', 'FBDR', 'PCFD', 'PCFDED', 'BDR']]

y_test = data_test['FJ']

from sklearn.feature_extraction import DictVectorizer

vec = DictVectorizer(sparse=False)

X_train = vec.fit_transform(X_train.to_dict(orient='records'))

X_test = vec.transform(X_test.to_dict(orient='records'))

from sklearn.ensemble import RandomForestRegressor

rf = RandomForestRegressor()

rf.fit(X_train,y_train)

y_predict = rf.predict(X_test)

print 'predict value:',y_predict

from sklearn.metrics import mean_squared_error

print 'MSE:', mean_squared_error(y_test, y_predict)

print 'NMES:',rf.score(X_test, y_test)

print rf.feature_importances_

                           


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11473839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存