R语言实现决策树算法
2017-06-17 16:05
183 查看
决策树算法的R实现
根据ppvk上的文章《基于 R 语言和 SPSS 的决策树算法介绍及应用》,只简单跑了关于R部分的代码,实验成功,简单记录下。决策树算法简介
R语言实现
决策树算法
决策树算法是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。一个简单的决策树示例(图片来源网络)(https://book.douban.com/subject/26708119/)):
决策树由节点和有向边组成,内部节点代表了特征属性,外部节点(叶子节点)代表了类别,根据一步步地属性分类可以将整个特征空间进行划分,从而区别出不同的分类样本。好的决策树不仅对训练样本有着很好的分类效果,对于测试集也有着较低的误差率。
数据集纯度函数
信息增益
信息熵表示的是不确定度。均匀分布时,不确定度最大,此时熵就最大。当选择某个特征对数据集进行分类时,分类后的数据集信息熵会比分类前的小,其差值表示为信息增益。
假设在样本数据集 D 中,混有 c 种类别的数据。构建决策树时,根据给定的样本数据集选择某个特征值作为树的节点。
在数据集中,可以计算出该数据中的信息熵:其中 D 表示训练数据集,c 表示数据类别数,Pi 表示类别 i 样本数量占所有样本的比例。
对应数据集 D,选择特征 A 作为决策树判断节点时,在特征 A 作用后的信息熵的为 Info(D),其中 k 表示样本 D 被分为 k 个部分。
InfoA(D)=−∑ci=1∣∣Dj∣∣|D|×Info(Dj)
信息增益表示数据集 D 在特征 A 的作用后,其信息熵减少的值
Gain\left ( A \right )=Info\left ( D \right ) - Info_{A}\left ( D \right )
对于决策树节点最合适的特征选择,就是 Gain(A) 值最大的特征。
基尼指数
对于给定的样本集合D, c 表示数据集中类别的数量,Pi 表示类别 i 样
Gini(D)=1−∑cip2i
选取的属性为 A,那么分裂后的数据集 D 的基尼指数的计算公式,其中 k 表示样本 D 被分为 k 个部分,数据集 D 分裂成为 k 个 Dj 数据集。
GiniA(D)=∑kj=1∣∣Dj∣∣|D|Gini(Dj)
c57e
对于特征选取,需要选择最小的分裂后的基尼指数。也可以用基尼指数增益值作为决策树选择特征的依据
ΔGini(A)=Gini(D)−GiniA(D)
R语言实现决策树算法
实现决策树算法之前首先确保自己已经安装了所需相应的语言包。安装方法有两种。方法一:使用 install.packages( ) ,括号内填写要安装的包。例如
install.packages("rpart")
方法二:自己在官网下载好语言包,手动安装。使用方法一安装时,如果自己安装的R的版本过低,而R在执行 install.packages( )命令时,会自动下载最新版本,可能与计算机上安装的R的版本不符合,导致运行不成功等问题,这时需要自己去官网上下载与本机上R版本相符的语言包进行安装。安装方法如下:
打开RStudio,点击Packages,下方有Install按键
点击按键,弹出页面
点击browse,浏览你所保存的r语言包,选中后,点击install,即可安装。
使用rpart包
# 导入构建决策树所需要的库 library("rpart") library("rpart.plot") library("survival") #--------------------------------------------------------------------------# # A查看本次构建决策树所用的数据源 stagec stagec # 通过 rpart 函数构建决策树 fit <- rpart(Surv(pgtime,pgstat)~age+eet+g2+grade+gleason+ploidy,stagec,method="exp") # 查看决策树的具体信息 print(fit) printcp(fit) # 绘制构建完的决策树图 plot(fit, uniform=T, branch=0.6, compress=T) text(fit, use.n=T) # 通过 prune 函数剪枝 fit2 <- prune(fit, cp=0.016) # 绘制剪枝完后的决策树图 plot(fit2, uniform=T, branch=0.6, compress=T) text(fit2, use.n=T) #-------------------------------------------------------------------------# #B(rpart包)使用TH.data包中的bodyfat数据集 str(TH.data::bodyfat) dim(TH.data::bodyfat) head(TH.data::bodyfat) # 分别选取训练样本(70%)和测试样本(30%) set.seed(1234) indexa <- sample(2,nrow(TH.data::bodyfat),replace = TRUE,prob=c(0.7,0.3)) bodyfat_train <- TH.data::bodyfat[indexa==1,] bodyfat_test <- TH.data::bodyfat[indexa==2,] # 使用age、waistcirc等五个变量进行决策树分类 myFormulaa <- DEXfat ~ age + waistcirc + hipcirc + elbowbreadth + kneebreadth # minsplit为最小分支节点数 bodyfat_rpart <- rpart(myFormulaa, data = bodyfat_train, control = rpart.control(minsplit = 10)) # cptable: a matrix of information on the optimal prunings based on a complexity parameter. print(bodyfat_rpart$cptable) # 输出具体的决策树模型结果 bodyfat_rpart # 可视化展示 rpart.plot::rpart.plot(bodyfat_rpart) # 对决策树进行剪枝处理(prune),防止过度拟合 opt <- which.min(bodyfat_rpart$cptable[,"xerror"]) cp <- bodyfat_rpart$cptable[opt, "CP"] bodyfat_prune <- prune(bodyfat_rpart, cp = cp) plot(bodyfat_prune) text(bodyfat_prune,use.n=T) # 使用调整过后的决策树进行预测 DEXfat_pred <- predict(bodyfat_prune, newdata=bodyfat_test) xlim <- range(TH.data::bodyfat$DEXfat) plot(DEXfat_pred ~ DEXfat, data=bodyfat_test, xlab="Observed", ylab="Predicted", ylim=xlim, xlim=xlim) # 为图形添加回归线,点的分布越靠近该线,则表示使用算法预测的精度越高 abline(a=0,b=1)
使用party包
# 载入所用的包,使用ctree()函数 library(party) #本次构建决策树所用的数据源 iris str(iris) set.seed(1234) #分别选取训练样本(70%)和测试样本(30%) indexb <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7,0.3)) traindata <- iris[indexb == 1,] testdata <- iris[indexb == 2,] # 构建模型 myFormulab <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width iris_ctree <- ctree(myFormulab, data=traindata) # 决策树模型的判断结果 table(predict(iris_ctree), traindata$Species) # 输出具体的决策树模型结果 print(iris_ctree) # 可视化展示 plot(iris_ctree) plot(iris_ctree,type='simple') # predict on test data testpred <- predict(iris_ctree,newdata=testdata) table(testpred,testdata$Species)
相关文章推荐
- R语言-决策树算法(C4.5和CART)的实现
- 『原创』机器学习算法的R语言实现(二):决策树算法
- 机器学习算法的R语言实现(二):决策树算法
- R语言与机器学习学习笔记(分类算法)(2)决策树算法
- 灰色系统模型GM(1,1)的R语言实现
- R语言实现viterbi算法
- R语言与机器学习学习笔记(分类算法)(2)决策树算法
- 用R语言实现向量化与并行计算
- R语言学习系列(数据挖掘之决策树算法实现--ID3代码篇)
- 数据挖掘中 决策树算法实现——Bash
- 机器学习经典算法——KNN算法R语言实现
- 史上代码最少的协同过滤推荐引擎(R语言实现)
- R语言之作者合作网络jaccard系数及余弦相似性实现篇
- R语言OOP(3):S4的实现方法
- R语言实现 广义加性模型 Generalized Additive Models(GAM) 入门
- R语言实现--分类法在医学诊断中的应用
- R语言与马克维茨资产组合理论学习笔记(利用fportfolio包实现)
- 关联规则R语言实现
- R语言实现Google 搜索引擎的pagerank算法
- R语言OOP(2):S3 OOP 的实现方法