京公网安备 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-03-18在动态系统状态估计与目标跟踪领域,高精度、高鲁棒性的状态感知是机器人导航、自动驾驶、工业控制、目标检测等场景的核心需求。 ...
2026-03-18“垃圾数据进,垃圾结果出”,这是数据分析领域的黄金法则,更是CDA(Certified Data Analyst)数据分析师日常工作中时刻恪守的 ...
2026-03-18在机器学习建模中,决策树模型因其结构直观、易于理解、无需复杂数据预处理等优势,成为分类与回归任务的首选工具之一。而变量重 ...
2026-03-17在数据分析中,卡方检验是一类基于卡方分布的假设检验方法,核心用于分析分类变量之间的关联关系或实际观测分布与理论期望分布的 ...
2026-03-17在数字化转型的浪潮中,企业积累的数据日益庞大且分散——用户数据散落在注册系统、APP日志、客服记录中,订单数据分散在交易平 ...
2026-03-17在数字化时代,数据分析已成为企业决策、业务优化、增长突破的核心支撑,从数据仓库搭建(如维度表与事实表的设计)、数据采集清 ...
2026-03-16在数据仓库建设、数据分析(尤其是用户行为分析、业务指标分析)的实践中,维度表与事实表是两大核心组件,二者相互依存、缺一不 ...
2026-03-16数据是CDA(Certified Data Analyst)数据分析师开展一切工作的核心载体,而数据读取作为数据生命周期的关键环节,是连接原始数 ...
2026-03-16在用户行为分析实践中,很多从业者会陷入一个核心误区:过度关注“当前数据的分析结果”,却忽视了结果的“泛化能力”——即分析 ...
2026-03-13在数字经济时代,用户的每一次点击、浏览、停留、转化,都在传递着真实的需求信号。用户行为分析,本质上是通过收集、整理、挖掘 ...
2026-03-13在金融、零售、互联网等数据密集型行业,量化策略已成为企业挖掘商业价值、提升决策效率、控制经营风险的核心工具。而CDA(Certi ...
2026-03-13在机器学习建模体系中,随机森林作为集成学习的经典算法,凭借高精度、抗过拟合、适配多场景、可解释性强的核心优势,成为分类、 ...
2026-03-12在机器学习建模过程中,“哪些特征对预测结果影响最大?”“如何筛选核心特征、剔除冗余信息?”是从业者最常面临的核心问题。随 ...
2026-03-12在数字化转型深度渗透的今天,企业管理已从“经验驱动”全面转向“数据驱动”,数据思维成为企业高质量发展的核心竞争力,而CDA ...
2026-03-12在数字经济飞速发展的今天,数据分析已从“辅助工具”升级为“核心竞争力”,渗透到商业、科技、民生、金融等各个领域。无论是全 ...
2026-03-11上市公司财务报表是反映企业经营状况、盈利能力、偿债能力的核心数据载体,是投资者决策、研究者分析、从业者复盘的重要依据。16 ...
2026-03-11数字化浪潮下,数据已成为企业生存发展的核心资产,而数据思维,正是CDA(Certified Data Analyst)数据分析师解锁数据价值、赋 ...
2026-03-11线性回归是数据分析中最常用的预测与关联分析方法,广泛应用于销售额预测、风险评估、趋势分析等场景(如前文销售额预测中的多元 ...
2026-03-10在SQL Server安装与配置的实操中,“服务名无效”是最令初学者头疼的高频问题之一。无论是在命令行执行net start启动服务、通过S ...
2026-03-10