用R软件做分类树和回归树(CART)
决策树(Decision Tree)又称为判定树,是运用于分类的一种树结构。其中的每个内部结点(internal node)代表对某个属性的一次测试,每条边代表一个测试结果,叶结点(leaf)代表某个类(class)或者类的分布(class distribution),最上面的结点是根结点。决策树提供了一种展示类似在什么条件下会得到什么值这类规则的方法。
构造决策树是采用自上而下的递归构造方法。以多叉树为例,如果一个训练数据集中的数据有几种属性值,则按照属性的各种取值把这个训练数据集再划分为对应的几个子集(分支),然后再依次递归处理各个子集。反之,则作为叶结点。
决策树构造的结果是一棵二叉或多叉树,它的输入是一组带有类别标记的训练数据。二叉树的内部结点(非叶结点)一般表示为一个逻辑判断,如形式为(a = b)的逻辑判断,其中a 是属性,b是该属性的某个属性值;树的边是逻辑判断的分支结果。多叉树(ID3)的内部结点是属性,边是该属性的所有取值,有几个属性值,就有几条边。树的叶结点都是类别标记。
使用决策树进行分类分为两步:
第1步:利用训练集建立并精化一棵决策树,建立决策树模型。这个过程实际上是一个从数据中获取知识,进行机器学习的过程。
第2步:利用生成完毕的决策树对输入数据进行分类。对输入的记录,从根结点依次测试记录的属性值,直到到达某个叶结点,从而找到该记录所在的类。
问题的关键是建立一棵决策树。这个过程通常分为两个阶段:
第一阶段,建树(Tree Building):决策树建树算法见下,这是一个递归的过程,最终将得到一棵树。
第二阶段,剪枝(Tree Pruning):剪枝的目的是降低由于训练集存在噪声而产生的起伏。
分类树和回归树(CART:Classification and Regression)
描述给定预测变量X后,变量Y条件分布的一种方法,使用二叉树将预测空间递归地划分为若干个子集,Y在这些子集上的分布是连续均匀的,树中的叶节点对应着划分的不同区域,划分是由与每个内部节点相关的分支规则(Splitting rules)确定的.通过从树的根节点逐渐到叶节点移动,每个预测样本被赋予一个叶节点,Y在该节点上的分布也被确定。利用CART进行预测同样需要一个学习样本(训练样本)对CART进行建树和评估,然后利用其进行预测。以下面的数据结构为例:
其中,为属性变量,可以是连续或离散的;
为类别变量,当
为离散时该模型为分类树,当
为有序变量时,模型为回归树。
根据给定的训练样本进行建模的步骤主要有:
CART的原理或细节,相关数据挖掘或机器学习书籍都有阐述,另外,百度了相关博客,个人感觉RaySaint的博客把握了CART的关键因素。详见:
http://underthehood.blog.51cto.com/2531780/564685
R软件完成CART
#1调用rpart包进行CART建模
library(rpart)
#1前列腺癌数据stagec
head(stagec)
progstat = factor(stagec$pgstat, levels = 0:1, labels = c("No", "Prog"))
#2建树,method主要有 "anova", "poisson", "class" "exp"。通常作生存分析选exp,因变量是因子变量选class,作poisson回归选poisson,其他情况通常选择anova;
cfit = rpart(progstat ~ age + eet + g2 + grade + gleason + ploidy,data = stagec, method ='class')
#输出结果
print(cfit)
#作树图
par(mar = rep(0.1, 4))
plot(cfit)
#添加标签
text(cfit)
#对分类结果作混淆矩阵
(temp = with(stagec, table(cut(grade, c(0, 2.5, 4)),
cut(gleason, c(2, 5.5, 10)),exclude = NULL)))
#3剪枝
cfit2=prune(cfit,cp=.02)
plot(cfit2)
text(cfit2)
printcp(cfit2)#输出剪枝表格
summary(cfit2)#输出CART完整细节,包括printcp内容
#4rpart中相关参数,rpart(,..,parms=())
"Anova"分类没有参数
"Poisson"分类只有单一参数:率的先验分布的变异系数,默认为1
"Exp"分类参数同poisson
"Class"分类包含的参数最为复杂,包括先验概率、损失矩阵或分类指标(Gini或Information)。#4.1比较Gini和Information分类指标,以自带汽车消费数据为例cu.summary
head(cu.summary)#查阅数据
fit1 = rpart(Reliability ~ Price + Country + Mileage + Type, data = cu.summary, parms = list(split = 'gini'))
fit2 = rpart(Reliability ~ Price + Country + Mileage + Type,data = cu.summary, parms = list(split = 'information'))
par(mfrow = c(1,2), mar = rep(0.1, 4))
plot(fit1, margin = 0.05); text(fit1, use.n = TRUE, cex = 0.8)
plot(fit2, margin = 0.05); text(fit2, use.n = TRUE, cex = 0.8)
#4.2比较parms中的先验概率(prior)和损失矩阵(loss)参数,以rpart自带驼背数据kyphosis为例
#查阅数据
head(kyphosis)
#默认的先验概率为Kyphosis两类的频率比fit1 = rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)#定义先验概率prior=c(..,..)fit2 = rpart(Kyphosis ~ Age + Number + Start, data = kyphosis, parms = list(prior = c(0.65, 0.35)))
##loss参数设置,首先一个损失矩阵lmat
lmat = matrix(c(0,3, 4,0), nrow = 2, ncol = 2, byrow = FALSE)fit3 = rpart(Kyphosis ~ Age + Number + Start, data = kyphosis,parms = list(loss = lmat))par(mfrow = c(1, 3), mar = rep(0.1, 4))plot(fit1); text(fit1, use.n = TRUE, all = TRUE, cex = 0.8)plot(fit2); text(fit2, use.n = TRUE, all = TRUE, cex = 0.8)plot(fit3); text(fit3, use.n = TRUE, all = TRUE, cex = 0.8)
二、回归树
1.通常默认anova用来作回归树,以汽车消费数据car90为例,该数据包括34个变量110条观察值。
#查阅car90数据
head(car90);str(car90)
#剔除轮胎尺寸、型号等3个因素型变量(factor variable):"Rim", "Tires", "Model2"
cars = car90[, -match(c("Rim", "Tires", "Model2"), names(car90))]#建立回归树模型carfit = rpart(Price/1000 ~ ., data=cars)carfit;printcp(carfit);summary(carfit,cp=0.1)plot(carfit);text(carfit)
#图示不同分类的误差,par(mfrow=c(1,2)); rsq.rpart(carfit)
2.Poisson回归树
以数据solder为例
#查看数据,变量属性
head(solder);str(solder)
#建立poisson回归树
sfit = rpart(skips ~ Opening + Solder + Mask + PadType + Panel,data = solder, method = 'poisson',control = rpart.control(cp = 0.05, maxcompete = 2))sfit;printcp(sfit);summary(sfit,cp=.1)
3.生存模型回归树
#以前列腺癌数据stagec为例,调用survival包进行生存分析
library(survival)temp = coxph(Surv(pgtime, pgstat) ~ 1, stagec)newtime = predict(temp, type = 'expected')
pfit <- rpart(Surv(pgtime, pgstat) ~ age + eet + g2 + grade +gleason + ploidy, data = stagec)
pfit2 <- prune(pfit, cp = 0.016)#进行减枝
par(mar = rep(0.2, 4))
plot(pfit2, uniform = TRUE, branch = 0.4, compress = TRUE)
text(pfit2, use.n = TRUE)
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在当今这个数据驱动的时代,几乎每一个业务决策都离不开对数据的深入分析。而其中,指标波动归因分析更是至关重要的一环。无论是 ...
2025-02-18当数据开始说谎:那些年我们交过的学费 你有没有经历过这样的场景?熬了三个通宵做的数据分析报告,在会议上被老板一句"这数据靠 ...
2025-02-17数据分析作为一门跨学科领域,融合了统计学、编程、业务理解和可视化技术。无论是初学者还是有一定经验的从业者,系统化的学习路 ...
2025-02-17挖掘用户价值本质是让企业从‘赚今天的钱’升级为‘赚未来的钱’,同时让用户从‘被推销’变为‘被满足’。询问deepseek关于挖 ...
2025-02-17近来deepseek爆火,看看deepseek能否帮我们快速实现数据看板实时更新。 可以看出这对不知道怎么动手的小白来说是相当友好的, ...
2025-02-14一秒精通 Deepseek,不用找教程,不用买资料,更不用报一堆垃圾课程,所有这么去做的,都是舍近求远,因为你忽略了 deepseek 的 ...
2025-02-12自学 Python 的关键在于高效规划 + 实践驱动。以下是一份适合零基础快速入门的自学路径,结合资源推荐和实用技巧: 一、快速入 ...
2025-02-12“我们的利润率上升了,但销售额却没变,这是为什么?” “某个业务的市场份额在下滑,到底是什么原因?” “公司整体业绩 ...
2025-02-08活动介绍 为了助力大家在数据分析领域不断精进技能,我们特别举办本期打卡活动。在这里,你可以充分利用碎片化时间在线学习,让 ...
2025-02-071、闺女,醒醒,媒人把相亲的带来了。 我。。。。。。。 2、前年春节相亲相了40个, 去年春节相亲50个, 祖宗,今年你想相多少个 ...
2025-02-06在数据科学的广阔领域中,统计分析与数据挖掘占据了重要位置。尽管它们常常被视为有关联的领域,但两者在理论基础、目标、方法及 ...
2025-02-05在数据分析的世界里,“对比”是一种简单且有效的方法。这就像两个女孩子穿同一款式的衣服,效果不一样。 很多人都听过“货比三 ...
2025-02-05当我们只有非常少量的已标记数据,同时有大量未标记数据点时,可以使用半监督学习算法来处理。在sklearn中,基于图算法的半监督 ...
2025-02-05考虑一种棘手的情况:训练数据中大部分样本没有标签。此时,我们可以考虑使用半监督学习方法来处理。半监督学习能够利用这些额 ...
2025-02-04一、数学函数 1、取整 =INT(数字) 2、求余数 =MOD(除数,被除数) 3、四舍五入 =ROUND(数字,保留小数位数) 4、取绝对值 =AB ...
2025-02-03作者:CDA持证人 余治国 一般各平台出薪资报告,都会哀嚎遍野。举个例子,去年某招聘平台发布《中国女性职场现状调查报告》, ...
2025-02-02真正的数据分析大神是什么样的呢?有人认为他们能轻松驾驭各种分析工具,能够从海量数据中找到潜在关联,或者一眼识别报告中的数 ...
2025-02-01现今社会,“转行”似乎成无数职场人无法回避的话题。但行业就像座围城:外行人看光鲜,内行人看心酸。数据分析这个行业,近几年 ...
2025-01-31本人基本情况: 学校及专业:厦门大学经济学院应用统计 实习经历:快手数据分析、字节数据分析、百度数据分析 Offer情况:北京 ...
2025-01-3001专家简介 徐杨老师,CDA数据科学研究院教研副总监,主要负责CDA认证项目以及机器学习/人工智能类课程的研发与授课,负责过中 ...
2025-01-29