京公网安备 11010802034615号
经营许可证编号:京B2-20210330
决策树算法的R实现
根据ppvk上的文章《基于 R 语言和 SPSS 的决策树算法介绍及应用》,只简单跑了关于R部分的代码,实验成功,简单记录下。
决策树算法简介
R语言实现
决策树算法
决策树算法是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
一个简单的决策树示例(图片来源网络):

决策树由节点和有向边组成,内部节点代表了特征属性,外部节点(叶子节点)代表了类别,根据一步步地属性分类可以将整个特征空间进行划分,从而区别出不同的分类样本。好的决策树不仅对训练样本有着很好的分类效果,对于测试集也有着较低的误差率。
数据集纯度函数
信息增益
信息熵表示的是不确定度。均匀分布时,不确定度最大,此时熵就最大。当选择某个特征对数据集进行分类时,分类后的数据集信息熵会比分类前的小,其差值表示为信息增益。
假设在样本数据集 D 中,混有 c 种类别的数据。构建决策树时,根据给定的样本数据集选择某个特征值作为树的节点。
在数据集中,可以计算出该数据中的信息熵:其中 D 表示训练数据集,c 表示数据类别数,Pi 表示类别 i 样本数量占所有样本的比例。
作用前的信息熵公式

对应数据集 D,选择特征 A 作为决策树判断节点时,在特征 A 作用后的信息熵的为 Info(D),其中 k 表示样本 D 被分为 k 个部分。

信息增益表示数据集 D 在特征 A 的作用后,其信息熵减少的值
Gain\left ( A \right )=Info\left ( D \right ) - Info_{A}\left ( D \right )
对于决策树节点最合适的特征选择,就是 Gain(A) 值最大的特征。
基尼指数
对于给定的样本集合D, c 表示数据集中类别的数量,Pi 表示类别 i 样

选取的属性为 A,那么分裂后的数据集 D 的基尼指数的计算公式,其中 k 表示样本 D 被分为 k 个部分,数据集 D 分裂成为 k 个 Dj 数据集。

对于特征选取,需要选择最小的分裂后的基尼指数。也可以用基尼指数增益值作为决策树选择特征的依据

R语言实现决策树算法
实现决策树算法之前首先确保自己已经安装了所需相应的语言包。安装方法有两种。
方法一:使用 install.packages( ) ,括号内填写要安装的包。例如
install.packages("rpart")
方法二:自己在官网下载好语言包,手动安装。使用方法一安装时,如果自己安装的R的版本过低,而R在执行 install.packages( )命令时,会自动下载最新版本,可能与计算机上安装的R的版本不符合,导致运行不成功等问题,这时需要自己去官网上下载与本机上R版本相符的语言包进行安装。安装方法如下:
点击按键,弹出页面

点击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)
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据驱动决策的浪潮中,数据挖掘与数据分析是两个高频出现且极易被混淆的概念。有人将二者等同看待,认为“做数据分析就是做数 ...
2026-04-01在数据驱动决策的时代,企业与从业者每天都会面对海量数据——电商平台的用户行为数据、金融机构的信贷风险数据、快消品牌的营销 ...
2026-04-01在数字化转型的浪潮中,企业数据已从“辅助运营的附属资源”升级为“驱动增长的核心资产”,而一套科学、可落地的企业数据管理方 ...
2026-04-01在数字化时代,每一位用户与产品的交互都会留下可追溯的行为轨迹——电商用户的浏览、加购、下单,APP用户的注册、登录、功能使 ...
2026-03-31在日常数据统计、市场调研、学术分析等场景中,我们常常需要判断两个分类变量之间是否存在关联(如性别与消费偏好、产品类型与满 ...
2026-03-31在CDA(Certified Data Analyst)数据分析师的职场实战与认证考核中,“可解释性建模”是核心需求之一——企业决策中,不仅需要 ...
2026-03-31多层感知机(MLP,Multilayer Perceptron)作为深度学习中最基础、最经典的神经网络模型,其结构设计直接决定了模型的拟合能力、 ...
2026-03-30在TensorFlow深度学习实战中,数据集的加载与预处理是基础且关键的第一步。手动下载、解压、解析数据集不仅耗时费力,还容易出现 ...
2026-03-30在CDA(Certified Data Analyst)数据分析师的日常工作中,“无监督分组、挖掘数据内在聚类规律”是高频核心需求——电商场景中 ...
2026-03-30机器学习的本质,是让模型通过对数据的学习,自主挖掘规律、实现预测与决策,而这一过程的核心驱动力,并非单一参数的独立作用, ...
2026-03-27在SQL Server数据库操作中,日期时间处理是高频核心需求——无论是报表统计中的日期格式化、数据筛选时的日期类型匹配,还是业务 ...
2026-03-27在CDA(Certified Data Analyst)数据分析师的能力体系与职场实操中,高维数据处理是高频且核心的痛点——随着业务场景的复杂化 ...
2026-03-27在机器学习建模与数据分析实战中,特征维度爆炸、冗余信息干扰、模型泛化能力差是高频痛点。面对用户画像、企业经营、医疗检测、 ...
2026-03-26在这个数据无处不在的时代,数据分析能力已不再是数据从业者的专属技能,而是成为了职场人、管理者、创业者乃至个人发展的核心竞 ...
2026-03-26在CDA(Certified Data Analyst)数据分析师的能力体系中,线性回归是连接描述性统计与预测性分析的关键桥梁,也是CDA二级认证的 ...
2026-03-26在数据分析、市场研究、用户画像构建、学术研究等场景中,我们常常会遇到多维度、多指标的数据难题:比如调研用户消费行为时,收 ...
2026-03-25在流量红利见顶、获客成本持续攀升的当下,营销正从“广撒网”的经验主义,转向“精耕细作”的数据驱动主义。数据不再是营销的辅 ...
2026-03-25在CDA(Certified Data Analyst)数据分析师的全流程工作中,无论是前期的数据探索、影响因素排查,还是中期的特征筛选、模型搭 ...
2026-03-25在当下数据驱动决策的职场环境中,A/B测试早已成为互联网产品、运营、营销乃至产品迭代优化的核心手段,小到一个按钮的颜色、文 ...
2026-03-24在统计学数据分析中,尤其是分类数据的分析场景里,卡方检验和显著性检验是两个高频出现的概念,很多初学者甚至有一定统计基础的 ...
2026-03-24