分类是管理学、金融学、统计学等常用的实证分析方法之一,目前,分类的方法有逻辑回归、支持向量机、贝叶斯分类、决策树、支持向量机、卷积神经网络、线性判别分类器等等。方法有很多,不同的方法适用于不同的环境,其难易度也不同。
本文对随机森林算法进行实例分析,讲述在R语言中的建模过程与结果。
1
随机森林
在开始建模前,首先说一下,随机森林名称的由来。
Leo Breiman和 Adele Cutler发展出、推论出随机森林的算法。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"以建造决策树的集合。
随机森林在以决策树、构建Bagging集成(从数据里抽取出自举样本,即有放回的随机样本,根据每一个样本,可以建立一个决策树模型,最终的模型是所有单个决策树结果的平均。bagging决策树算法通过降低方差得到稳定的最终模型,这种方法提高了精度,也不太可能过拟合)的基础上,进一步在基决策树的训练过程中引入了随机属性选择。所以随机指的是训练过程中引入了随机属性选择,森林是指的“众木成林”,也就是许多决策树的集合。所以,学术界的大佬起名字总是有深意的。
01
随机森林的优缺点
优点
训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。
由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
在训练后,可以给出各个特征对于输出的重要性
由于采用了随机采样,训练出的模型的方差小,泛化能力强。
相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
对部分特征缺失不敏感。
缺点
在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
02
随机森林最重要的参数
随机森林中树的个数:随机森林的总体规模。
树节点预选的变量个数:单棵决策树的情况。
2
基于R语言使用随机森林处理鸢尾花数据实战
安装与加载相关包
##安装
Install.packages(“randomForest”)
##加载
Library(randomForest)
了解数据格式
使用R内置的鸢尾花数据
##分类classification
##使用R内置的鸢尾花数据
data(“iris”)
head(iris)
设置随机数种子保证结果可重复
##设置随机种子数,保证结果可重复
set.seed(1234)
随机森林分类
##随机森林分类
iris.rf = randomForest(Species~.,data=iris,importance=TRUE,proximity=TRUE)
print(iris.rf)
结果如下:包括分析的命令,优化选择的分类变量个数2,和数据再分类和错误率统计结果。
此例中使用2个变量分类,三种花的分类错误率为4%。
查看每个变量的分类贡献度
显示仅保存两位小数可读性更好
##查看每个变量的分类贡献度
round(importance(iris.rf),2)
格式化MeanDecreaseAccuracy
也就是说,没有这个特征(Features),分类准确度下降的程度,相当于常用的分类贡献度的概念
##可视化
varImPlot(iris.rf)
分类结果主坐标轴分析
##主坐轴分析和可视化
iris.mds=cmdscale(1-iris.rf$proximity,eig=TURE)
##设置样本点
op=par(pty=”s”)
##散点图展示每个特征(Feature)和PCoA1/2轴间的相互分布
paris(cbind(iris[,1:4],iris.mds$points),cex=0.6,gap=0,col=c(“red”,”green”,”blue”)[as.numeric(iris$Species)],main=“Tris Data: Predictors and MDS of Proximity Based on RandomForest”)
par(op)
print(iris.mds$GOF)
结果如下:
可以看到个特征(Feature)间的相关性,如Petal.Width和Petal.Length正相关非常好,而且大小也可以很好分开不同组;更可以看到PCoA轴1/2与每个特征(Features)分布样式,是如何区分组的。
随机选取2/3的数据作为训练集,用1/3的数据集作为验证集
##随机选取2/3预测,1/3验证
##随机1-2有放回抽样150次,概率分别为0.67和0.33,用于获取训练集
ind=sample(2,nrow(iris),replace=TURE,prob=c(0.67,0.33))
#2/3作为预测建模
iris.rf=randomForest(Species~.,iris[ind==1,],ntree=1000,nPerm=10,mtry=3,proximity=TURE,importance=TRUE)
print(iris.rf)
#1/3作为预测模型
iris.pred=predict(iris.rf,iris[ind==2,])
#输出预测与观测对应表
table(observed=iris[ind==2,“Species”],predicted=iris.pred)
使用未被用于建模的1/3样本数据用于验证模型,结果更加可信
无监督分类
##无监督分类
set.seed(1234)
iris.urf=randomForest(iris[,-5])
##主坐标轴分析并展示
MDSplot(iris.urf,iris$Species)
结果如下:
可以看到,其中3个物种在分组未知的情况下,也是可以非常好的分开的。其实在分析前应该进行PCoA,查看组间是否存在差异,再进行随机森林找特征(Features)。
分层抽样
##分层抽样
#分层取样:抽取20、30,20是每个决策树的成长空间(species)
(iris.rf2=randomForest(iris[1:4],iris$Species,sampsize=c(20,30,20)))
随机森林自动评估,利用袋外数据(OOB)评估错误率也是非常可靠的。
转自:“云导师学术辅导平台”微信公众号
如有侵权,请联系本站删除!