R语言之Random Forest随机森林
什么是随机森林?
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想--集成思想的体现。
随机森林算法的实质是基于决策树的分类器集成算法,其中每一棵树都依赖于一个随机向量,随机森林的所有向量都是独立同分布的。随机森林就是对数据集的列变量和行观测进行随机化,生成多个分类数,最终将分类树结果进行汇总。
随机森林相比于神经网络,降低了运算量的同时也提高了预测精度,而且该算法对多元共线性不敏感以及对缺失数据和非平衡数据比较稳健,可以很好地适应多达几千个解释变量数据集。
随机森林的组成
随机森林是由多个CART分类决策树构成,在构建决策树过程中,不进行任何剪枝动作,通过随机挑选观测(行)和变量(列)形成每一棵树。对于分类模型,随机森林将根据投票法为待分类样本进行分类;对于预测模型,随机森林将使用单棵树的简单平均值来预测样本的Y值。
随机森林的估计过程
1)指定m值,即随机产生m个变量用于节点上的二叉树,二叉树变量的选择仍然满足节点不纯度最小原则;
2)应用Bootstrap自助法在原数据集中有放回地随机抽取k个样本集,组成k棵决策树,而对于未被抽取的样本用于单棵决策树的预测;
3)根据k个决策树组成的随机森林对待分类样本进行分类或预测,分类的原则是投票法,预测的原则是简单平均。
随机森林的两个重要参数:
1.树节点预选的变量个数:单棵决策树决策树的情况。
2.随机森林中树的个数:随机森林的总体规模。
随机森林模型评价因素
1)每棵树生长越茂盛,组成森林的分类性能越好;
2)每棵树之间的相关性越差,或树之间是独立的,则森林的分类性能越好。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
对于分类问题(将某个样本划分到某一类),也就是离散变量问题,CART使用Gini值作为评判标准。定义为Gini=1-∑(P(i)*P(i)),P(i)为当前节点上数据集中第i类样本的比例。例如:分为2类,当前节点上有100个样本,属于第一类的样本有70个,属于第二类的样本有30个,则Gini=1-0.7×07-0.3×03=0.42,可以看出,类别分布越平均,Gini值越大,类分布越不均匀,Gini值越小。
在寻找最佳的分类特征和阈值时,评判标准为:argmax(Gini-GiniLeft-GiniRight),即寻找最佳的特征f和阈值th,使得当前节点的Gini值减去左子节点的Gini和右子节点的Gini值最大。
主要函数
R语言中的randomForest包可以实现随机森林算法的应用,该包中主要涉及5个重要函数,关于这5个函数的语法和参数请见下方:
1)randomForest()函数用于构建随机森林模型
randomForest(formula, data=NULL, ..., subset, na.action=na.fail)
randomForest(x, y=NULL, xtest=NULL, ytest=NULL, ntree=500,
mtry=if (!is.null(y) && !is.factor(y))
max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),
replace=TRUE, classwt=NULL, cutoff, strata,
sampsize = if (replace) nrow(x) else ceiling(.632*nrow(x)),
nodesize = if (!is.null(y) && !is.factor(y)) 5 else 1,
maxnodes = NULL,
importance=FALSE, localImp=FALSE, nPerm=1,
proximity, oob.prox=proximity,
norm.votes=TRUE, do.trace=FALSE,
keep.forest=!is.null(y) && is.null(xtest), corr.bias=FALSE,
keep.inbag=FALSE, ...)
formula指定模型的公式形式,类似于y~x1+x2+x3...;
data指定分析的数据集;
subset以向量的形式确定样本数据集;
na.action指定数据集中缺失值的处理方法,默认为na.fail,即不允许出现缺失值,也可以指定为na.omit,即删除缺失样本;
x指定模型的解释变量,可以是矩阵,也可以是数据框;y指定模型的因变量,可以是离散的因子,也可以是连续的数值,分别对应于随机森林的分类模型和预测模型。这里需要说明的是,如果不指定y值,则随机森林将是一个无监督的模型;
xtest和ytest用于预测的测试集;
ntree指定随机森林所包含的决策树数目,默认为500;
mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;
replace指定Bootstrap随机抽样的方式,默认为有放回的抽样;
classwt指定分类水平的权重,对于回归模型,该参数无效;
strata为因子向量,用于分层抽样;
sampsize用于指定样本容量,一般与参数strata联合使用,指定分层抽样中层的样本量;
nodesize指定决策树节点的最小个数,默认情况下,判别模型为1,回归模型为5;
maxnodes指定决策树节点的最大个数;
importance逻辑参数,是否计算各个变量在模型中的重要性,默认不计算,该参数主要结合importance()函数使用;
proximity逻辑参数,是否计算模型的临近矩阵,主要结合MDSplot()函数使用;
oob.prox是否基于OOB数据计算临近矩阵;
norm.votes显示投票格式,默认以百分比的形式展示投票结果,也可以采用绝对数的形式;
do.trace是否输出更详细的随机森林模型运行过程,默认不输出;
keep.forest是否保留模型的输出对象,对于给定xtest值后,默认将不保留算法的运算结果。
2)importance()函数用于计算模型变量的重要性
importance(x, type=NULL, class="NULL", scale=TRUE, ...)
x为randomForest对象;
type可以是1,也可以是2,用于判别计算变量重要性的方法,1表示使用精度平均较少值作为度量标准;2表示采用节点不纯度的平均减少值最为度量标准。值越大说明变量的重要性越强;
scale默认对变量的重要性值进行标准化。
3)MDSplot()函数用于实现随机森林的可视化
MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)
rf为randomForest对象,需要说明的是,在构建随机森林模型时必须指定计算临近矩阵,即设置proximity参数为TRUE;
fac指定随机森林模型中所使用到的因子向量(因变量);
palette指定所绘图形中各个类别的颜色;
pch指定所绘图形中各个类别形状;
还可以通过R自带的plot函数绘制随机森林决策树的数目与模型误差的折线图
4)rfImpute()函数可为存在缺失值的数据集进行插补(随机森林法),得到最优的样本拟合值
rfImpute(x, y, iter=5, ntree=300, ...)
rfImpute(x, data, ..., subset)
x为存在缺失值的数据集;
y为因变量,不可以存在缺失情况;
iter指定插值过程中迭代次数;
ntree指定每次迭代生成的随机森林中决策树数量;
subset以向量的形式指定样本集。
5)treesize()函数用于计算随机森林中每棵树的节点个数
treesize(x, terminal=TRUE)
x为randomForest对象;
terminal指定计算节点数目的方式,默认只计算每棵树的根节点,设置为FALSE时将计算所有节点(根节点+叶节点)。
一般treesize()函数生成的结果用于绘制直方图,方面查看随机森林中树的节点分布情况。
bagging简介
在bagging方法里,从数据里抽取出自举样本(有放回的随机样本),根据每一个样本,可以建立一个决策树模型,最终的模型是所有单个决策树结果的平均。bagging决策树算法通过降低方差得到稳定的最终模型,这种方法提高了精度,也不太可能过拟合。
应用
在随机森林算法的函数randomForest()中有两个非常重要的参数,而这两个参数又将影响模型的准确性,它们分别是mtry和ntree。一般对mtry的选择是逐一尝试,直到找到比较理想的值,ntree的选择可通过图形大致判断模型内误差稳定时的值。
#将数据集分为训练集和测试集,并查看数据集基本属性。数据为R自带IRIS数据
#选取randomforest –mtry节点值,对应误差最小为2,一般可默认。通常也是2记得。mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。
#之后选择ntree值,ntree指定随机森林所包含的决策树数目,默认为500;.在400左右时,模型内误差基本稳定,故取ntree=400。
> set.seed(100)
> ntree_fit<-randomForest(Species~.,data=train,mtry=2,ntree=1000)
> plot(ntree_fit)
#看结果
由上图的结果可知,OOB误差为2.8%,同时在随机森林中,第二类和第三类仍然有误差,会被误判,也可以通过输入plot(rf)绘制每一棵树的误判率的图。
#看重要性
> set.seed(100)
> varImpPlot(rf)
#最后验证并预测
> pred1<-predict(rf,data=train)
> Freq1<-table(pred1,train$Species)
#验证矩阵中迹占整体情况,
精度=0.97。
#margin参数无main,为了展示而写,不报错
plot(margin(rf,test$Species),main=观测值被判断正确的概率图)
总结
- bagging通过减少方差来稳定决策树并提高精度。
- bagging降低泛化误差。
- 随机森林通过去除bagging集合中的个体树之间的相关性来进一步提高决策树的性能。
- 随机森林的变量重要性度量可以帮助确定哪些变量对模型的贡献度最大。
- 由于随机森林的集合中的树是未剪枝的并且往往非常深,还有过拟合的危险,因此,一定要确保在保留数据上使用简单交叉验证来评估模型,从而更好地评价模型的性能。
随机森林是一种集成学习+决策树的分类模型,它可以利用集成的思想(投票选择的策略)来提升单颗决策树的分类性能(通俗来讲就是“三个臭皮匠,顶一个诸葛亮”)。
集集成学习和决策树于一身,随机森林算法具有众多的优点,其中最为重要的就是在随机森林算法中每棵树都尽最大程度的生长,并且没有剪枝过程。
随机森林引入了两个随机性——随机选择样本(bootstrap sample)和随机选择特征进行训练。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
参考:http://www.36dsj.com/archives/21036
http://blog.csdn.net/hhtnan/article/details/54580747
http://zzanswer.github.io/