randomForest 包提供了利用随机森林算法解决分类和回归问题的功能;我们这里只关注随机森林算法在分类问题中的应用

首先安装这个R包

  1. install.packages("randomForest")

安装成功后,首先运行一下example

  1. library(randomForset)
  2. ?randomForset

通过查看函数的帮助文档,可以看到对应的example

  1. data(iris)
  2. set.seed(71)
  3. iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE,
  4. proximity=TRUE)
  5. print(iris.rf)

代码很简单,全部的功能都封装在 randomForest 这个R包中,首先来看下用于分类的数据

  1. > str(iris)
  2. 'data.frame': 150 obs. of 5 variables:
  3. $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
  4. $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
  5. $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
  6. $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
  7. $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
  8. > head(iris)
  9. Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  10. 1 5.1 3.5 1.4 0.2 setosa
  11. 2 4.9 3.0 1.4 0.2 setosa
  12. 3 4.7 3.2 1.3 0.2 setosa
  13. 4 4.6 3.1 1.5 0.2 setosa
  14. 5 5.0 3.6 1.4 0.2 setosa
  15. 6 5.4 3.9 1.7 0.4 setosa

采用数据集iris 进行分类,iris 数据集共有150行,5列,其中第5列为分类变量,共有3种分类情况,这个数据集可以看做150个样本,根据4个指标进行分类,最终分成了3类

接下来调用randomForest 函数就行分类

  1. iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)

调用该函数时,通过一个表达式指定分类变量 Species 和对应的数据集data 就可以了,后面的importance 和 proximity 是计算每个变量的重要性和样本之间的距离

分类器构建完毕之后,首先看一下这个分类器的准确性

  1. > print(iris.rf)
  2.  
  3. Call:
  4. randomForest(formula = Species ~ ., data = iris, importance = TRUE, proximity = TRUE)
  5. Type of random forest: classification
  6. Number of trees: 500
  7. No. of variables tried at each split: 2
  8.  
  9. OOB estimate of error rate: 4%
  10. Confusion matrix:
  11. setosa versicolor virginica class.error
  12. setosa 50 0 0 0.00
  13. versicolor 0 47 3 0.06
  14. virginica 0 3 47 0.06

print 的结果中,OOB estimate of error rate 表明了分类器的错误率为4%, Confusion matrix 表明了每个分类的详细的分类情况;

对于setosa 这个group而言,基于随机森林算法的分类器,有50个样本分类到了setosa 这个group, 而且这50个样本和iris 中属于setosa 这个group的样本完全一致,所以对于setosa 这个group而言,分类器的错误率为0;

对于versicolor 这个group而言,基于随机森林算法的分类器,有47个样本分类到了versicolor 这个group, 3个样本分类到了virginica 这个group,有3个样本分类错误,在iris 中属于versicolor 这个group的样本有50个,所以对于versicolor 这个group而言,分类器的错误率为3/50 = 0.06 ;

对于virginica 这个group而言,基于随机森林算法的分类器,有3个样本分类到了versicolor 这个group, 47个样本分类到了virginica 这个group,有3个样本分类错误,在iris 中属于virginica 这个group的样本有50个,所以对于virginica这个group而言,分类器的错误率为3/50 = 0.06 ;

然后看一下样本之间的距离

  1. iris.mds <- cmdscale(1 - iris.rf$proximity, eig=TRUE)

通过调用cmdscale 函数进行样本之间的距离,proximity 是样本之间的相似度矩阵,所以用1减去之后得到样本的类似距离矩阵的一个矩阵

iris.mds 的结果如下

  1. > str(iris.mds)
  2. List of 5
  3. $ points: num [1:150, 1:2] -0.566 -0.566 -0.566 -0.565 -0.565 ...
  4. ..- attr(*, "dimnames")=List of 2
  5. .. ..$ : chr [1:150] "1" "2" "3" "4" ...
  6. .. ..$ : NULL
  7. $ eig : num [1:150] 23.87 20.89 2.32 1.67 1.23 ...
  8. $ x : NULL
  9. $ ac : num 0
  10. $ GOF : num [1:2] 0.723 0.786
  11. > head(iris.mds$points)
  12. [,1] [,2]
  13. 1 -0.5656446 0.01611053
  14. 2 -0.5656904 0.01585927
  15. 3 -0.5656267 0.01654988
  16. 4 -0.5651292 0.01649026
  17. 5 -0.5653773 0.01576609
  18. 6 -0.5651923 0.01663060

在iris.mds 中points可以看做每个样本映射到2维空间中的坐标,每一维空间是一个分类特征,但是不是最原始的4个特征,而是由4个特征衍生得到的新的分类特征,根据这个坐标,可以画一张散点图,得到每个样本基于两个分类变量的分组情况

  1. plot(iris.mds$points, col = rep(c("red", "blue", "green"), each = 50))

生成的图片如下:

图中不同分类的样本用不同的颜色标注,可以看到基于两个新的分类特征,样本的分组效果还是很好的,不同组的样本明显区分开来

最后,在看一下4个特征,每个特征的重要性

  1. > iris.rf$importance
  2. setosa versicolor virginica MeanDecreaseAccuracy
  3. Sepal.Length 0.027726158 0.0202591689 0.03688967 0.028920613
  4. Sepal.Width 0.007300694 0.0006999737 0.01078650 0.006093858
  5. Petal.Length 0.331994212 0.3171074926 0.31762366 0.319580655
  6. Petal.Width 0.332417881 0.3004615039 0.26540155 0.296416932
  7. MeanDecreaseGini
  8. Sepal.Length 9.013793
  9. Sepal.Width 2.263645
  10. Petal.Length 44.436189
  11. Petal.Width 43.571706

之前调用randomForest 函数时,通过指定importance = TRUE 来计算每个特征的importance , 在 iris.rf$importance 矩阵中,有两个值是需要重点关注的MeanDecreaseAccuracy 和  MeanDecreaseGini

我们还可以利用

  1. varImpPlot(iris.rf, main = "Top 30 - variable importance")

生成的图片如下:

图中和坐标为importance 结果中的MeanDecreaseAccuracy 和  MeanDecreaseGini 指标的值,纵坐标为对应的每个分类特征,该函数默认画top30个特征,由于这个数据集只有4个分类特征,所以4个都出现了

R包 randomForest 进行随机森林分析的更多相关文章

  1. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  2. 笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本内容来源于CDA-DSC课程内容,原内容为& ...

  3. R语言之Random Forest随机森林

    什么是随机森林? 随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法.随机森林的名称中有 ...

  4. 随机森林入门攻略(内含R、Python代码)

    随机森林入门攻略(内含R.Python代码) 简介 近年来,随机森林模型在界内的关注度与受欢迎程度有着显著的提升,这多半归功于它可以快速地被应用到几乎任何的数据科学问题中去,从而使人们能够高效快捷地获 ...

  5. 【R语言进行数据挖掘】决策树和随机森林

    1.使用包party建立决策树 这一节学习使用包party里面的函数ctree()为数据集iris建立一个决策树.属性Sepal.Length(萼片长度).Sepal.Width(萼片宽度).Peta ...

  6. ML—随机森林·1

    Introduction to Random forest(Simplified) With increase in computational power, we can now choose al ...

  7. Python 实现的随机森林

    随机森林是一个高度灵活的机器学习方法,拥有广泛的应用前景,从市场营销到医疗保健保险. 既可以用来做市场营销模拟的建模,统计客户来源,保留和流失.也可用来预测疾病的风险和病患者的易感性. 随机森林是一个 ...

  8. 第九篇:随机森林(Random Forest)

    前言 随机森林非常像<机器学习实践>里面提到过的那个AdaBoost算法,但区别在于它没有迭代,还有就是森林里的树长度不限制. 因为它是没有迭代过程的,不像AdaBoost那样需要迭代,不 ...

  9. 随机森林(Random Forest),决策树,bagging, boosting(Adaptive Boosting,GBDT)

    http://www.cnblogs.com/maybe2030/p/4585705.html 阅读目录 1 什么是随机森林? 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 ...

随机推荐

  1. 【Java】Java复习笔记-第四部分

    反射 反射: 在运行时动态分析或使用一个类进行工作. java.lang.Class类:描述类信息的类. 类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Cla ...

  2. asp.net读取用户控件,自定义加载用户控件

    1.自定义加载用户控件 ceshi.aspx页面 <html> <body> <div id="divControls" runat="se ...

  3. c++ primer读书笔记之c++11(二)

    1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...

  4. django ORM入门

    简单总结一下迟老师今天下午上课时讲的ORM操作 目录: 一.首先配置django连接mysql数据库                                             二.在自己 ...

  5. Netty系列之Netty线程模型

    Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...

  6. Python与操作系统有关的模块

    Os模块 Python的标准库中的os模块主要涉及普遍的操作系统功能.可以在Linux和Windows下运行,与平台无关.os.sep 可以取代操作系统特定的路径分割符.os.name字符串指示你正在 ...

  7. Eigen教程(5)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 块操作 块是matrix或array中的矩形子部分. 使用块 函数.block(), ...

  8. 【转】jdbc:oracle:thin:@192.168.3.98:1521:orcl(详解)

    整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...

  9. 关于python最大递归深度 - 998

    今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...

  10. 一个简单有效的kubernetes部署案例

    部署web-rc:web应用需要去获取redis注入的ip环境变量cluster_ip,以此来访问 [root@sdw1 files]# cat testweb-rc.yaml kind: Repli ...