决策树算法的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
在数据分析领域,Excel作为一种普及率极高且功能强大的工具,无疑为无数专业人士提供了便捷的解决方案。尽管Excel自带了丰富的功 ...
2025-01-17在这个瞬息万变的时代,许多人都在寻找能让他们脱颖而出的职业。而数据分析师,作为大数据和人工智能时代的热门职业,自然吸引了 ...
2025-01-14Python作为一门功能强大的编程语言,已经成为数据分析和可视化领域的重要工具。无论你是数据分析的新手,还是经验丰富的专业人士 ...
2025-01-10完全靠数据决策,真的靠谱吗? 最近几年,“数据驱动”成了商界最火的关键词之一,但靠数据就能走天下?其实不然!那些真正成功 ...
2025-01-09SparkSQL 结构化数据处理流程及原理是什么?Spark SQL 可以使用现有的Hive元存储、SerDes 和 UDF。它可以使用 JDBC/ODB ...
2025-01-09在如今这个信息爆炸的时代,数据已然成为企业的生命线。无论是科技公司还是传统行业,数据分析正在深刻地影响着商业决策以及未来 ...
2025-01-08“数据为王”相信大家都听说过。当前,数据信息不再仅仅是传递的媒介,它成为了驱动经济发展的新燃料。对于企业而言,数据指标体 ...
2025-01-07在职场中,当你遇到问题的时候,如果感到无从下手,或者抓不到重点,可能是因为你掌握的思维模型不够多。 一个好用的思维模型, ...
2025-01-06在现代企业中,数据分析师扮演着至关重要的角色。每天都有大量数据涌入,从社交媒体到交易平台,数据以空前的速度和规模生成。面 ...
2025-01-06在职场中,许多言辞并非表面意思那么简单,有时需要听懂背后的“潜台词”。尤其在数据分析的领域里,掌握常用术语就像掌握一门新 ...
2025-01-04在当今信息化社会,数据分析已成为各行各业的核心驱动力。它不仅仅是对数字进行整理与计算,而是在数据的海洋中探寻规律,从而指 ...
2025-01-03又到一年年终时,各位打工人也迎来了展示成果的关键时刻 —— 年终述职。一份出色的年终述职报告,不仅能全面呈现你的工作价值, ...
2025-01-03在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-03在数据分析的江湖里,有两个阵营总是争论不休。一派信奉“大即是美”,认为数据越多越好;另一派坚守“小而精”,力挺质量胜于规 ...
2025-01-02数据分析是一个复杂且多维度的过程,从数据收集到分析结果应用,每一步都是对信息的提炼与升华。可视化分析结果,以图表的形式展 ...
2025-01-02在当今的数字化时代,数据分析师扮演着一个至关重要的角色。他们如同现代企业的“解密专家”,通过解析数据为企业提供决策支持。 ...
2025-01-02数据分析报告至关重要 一份高质量的数据分析报告不仅能够揭示数据背后的真相,还能为企业决策者提供有价值的洞察和建议。 年薪 ...
2024-12-31数据分析,听起来好像是技术大咖的专属技能,但其实是一项人人都能学会的职场硬核能力!今天,我们来聊聊数据分析的核心流程,拆 ...
2024-12-31提到数据分析,你脑海里可能会浮现出一群“数字控”抱着电脑,在海量数据里疯狂敲代码的画面。但事实是,数据分析并没有你想象的 ...
2024-12-31关于数据分析师是否会成为失业高危职业,近年来的讨论层出不穷。在这个快速变化的时代,技术进步让人既兴奋又不安。今天,我们从 ...
2024-12-30