决策树(二)

本文介绍了CART算法的基本原理,包括分类与回归树的构建过程、最小二乘回归树生成算法、基尼指数的计算方法等。同时,还讨论了CART算法的优缺点,并提供了R语言实现的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 分类与回归树(CART)

CART树由特征选择、树的生成及树的剪枝组成,可用于分类,也可用于回归。CART假设决策树是二叉树,内部节点特征取值为“是”和“否”。CART算法由以下两步组成:
(1)决策树生成: 基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝: 用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

2. 最小二乘回归树生成算法

输入: 训练数据集D;
输出: 回归树f(x).f(x).f(x).
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域的输出值,构建二叉决策树:
(1)选择最优切分变量jjj与切分点s,求解
minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]min_{j,s}[min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i-c_1)^2+min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2]minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]
遍历变量jjj,对固定的切分变量jjj扫描切分点s,选择使上式达到最小的对(j,s)(j,s)j,s.
(2)用选定的对(j,s)(j,s)(j,s)划分区域并决定相应的输出值:
R1(j,s)={x∣x(j)≤s},R2(j,s)={x∣x(j)>s}c^m=1N∑xi∈Rm(j,s)yi,x∈Rm,m=1,2R_1(j,s)=\{x|x^{(j)}\le s\},R_2(j,s)=\{x|x^{(j)}\gt s\}\\ \hat{c}_m=\frac{1}{N}\sum_{x_i \in R_m(j,s)}y_i,x \in R_m,m=1,2R1(j,s)={xx(j)s},R2(j,s)={xx(j)>s}c^m=N1xiRm(j,s)yi,xRm,m=1,2
(3)继续对两个子区域调用步骤(1)(2),直至满足停止条件。
(4)将输入空间划分为M个区域R1,R2,⋯ ,RMR_1,R_2,\cdots,R_MR1,R2,,RM,生成决策树:
f(x)=∑m=1Mc^mI(x∈Rm)f(x)=\sum_{m=1}^M\hat{c}_mI(x\in R_m)f(x)=m=1Mc^mI(xRm)

3. 基尼指数

基尼指数的定义:
假设有K个类,样本点属于第k类的概率为pkp_kpk,则基尼指数为
Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
对于二类分类问题,样本点属于第一个类的概率为p,则概率分布的基尼指数为
Gini(p)=2p(1−p)Gini(p)=2p(1-p)Gini(p)=2p(1p)
对于给定样本集合D,其基尼指数为
Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2Gini(D)=1k=1K(DCk)2
其中,Ck是DC_k是DCkD中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值a被分割成D1和D2D_1和D_2D1D2两部分,即
D1={(x,y)∈D∣A(x)=a},D2=D−D1D_1=\{(x,y)\in D|A(x)=a\},D_2=D-D_1D1={(x,y)DA(x)=a},D2=DD1
在特征A的条件下,集合D的基尼指数定义为
Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

4. CART生成算法

输入:训练数据集D,停止计算条件;
输出:CART决策树。
根据训练数据集,从根节点开始,递归对每个节点进行以下操作,构建二叉决策树:
(1)设节点的训练数据集为D,计算现有特征对该数据集的基尼指数,此时,对每个特征A,对其可能的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割成D1和D2D_1和D_2D1D2两部分利用特征A条件下计算基尼指数的公式计算A=a时的基尼指数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依照最优特征与最优切分点,从现结点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
(3)对两个子节点递归地调用(1),(2),直至满足停止条件。
(4)生成CART决策树。
算法停止计算的条件是节点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或没有更多特征。

5. CART剪枝

在剪枝中,需要计算子树的损失函数:
Cα(T)=C(T)+α∣T∣C_\alpha(T)=C(T)+\alpha|T|Cα(T)=C(T)+αT
其中,T为任意子树,C(T)为训练数据的预测误差(如基尼指数),|T|为子树的叶结点个数,α≥0\alpha\ge 0α0为参数,Cα(T)为参数是αC_\alpha(T)为参数是\alphaCα(T)α时的子树T的整体损失,参数α\alphaα权衡训练数据的拟合程度与模型的复杂度。
CART树剪枝算法
输入: CART算法生成的决策树T0;T_0;T0;
输出: 最优决策树Tα.T_\alpha.Tα.
(1) 设k=0,T=T0.k=0,T=T_0.k=0T=T0.
(2) 设α=+∞.\alpha=+\infty.α=+.
(3) 自下而上地对各内部结点t计算C(Tt),∣Tt∣C(T_t),|T_t|C(Tt),Tt以及
g(t)=C(t)−C(Tt)∣Tt∣−1α=min(α,g(t))g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}\\ \alpha=min(\alpha,g(t))g(t)=Tt1C(t)C(Tt)α=min(α,g(t))
这里,g(t)为剪枝后整体损失函数减少的程度,TtT_tTt表示以t为根节点的子树,C(Tt)C(T_t)C(Tt)是对训练数据集的预测误差,∣Tt∣是Tt|T_t|是T_tTtTt的叶结点个数。
(4) 对g(t)=αg(t)=\alphag(t)=α的内部结点t进行剪枝,并对叶结点t以多数表决法决定其类,得到树T。
(5) 设k=k+1,αk=α,Tk=T.k=k+1,\alpha_k=\alpha,T_k=T.k=k+1,αk=α,Tk=T.
(6) 如果TkT_kTk不是由根节点及两个叶结点构成的树,则回到步骤(3);否则,令Tk=Tn.T_k=T_n.Tk=Tn.
(7) 采用交叉验证法在子树序列T0,T1,⋯ ,TN中T_0,T_1,\cdots,T_N中T0,T1,,TN选取最优子树TαT_\alphaTα.

6. CART方法优缺点

优点

  • 将决策树的优点与对数值型数据建立模型的能力相结合
  • 能自动选择特征,允许该方法与大量特征一起使用
  • 不需要使用者事先指定模型
  • 拟合某些类型的数据可能会比线性模型好得多
  • 不要求用统计的知识来解释模型
    缺点
  • 不像线性回归那样常用
  • 需要大量的训练数据
  • 难以确定单个特征对于结果的总体净影响
  • 可能比回归模型更难解释
    ##7. CART的R实现
    在R中使用rpart包中的rpart()函数实现CART算法
    建立模型:
m <- rpart(dv ~ iv, data = mydata)
  • dv: mydata数据框中需要建模的因变量
  • iv: 一个R公式,用来指定mydata数据框中被用于建模的自变量
  • data: 为包含变量dv和iv的数据框
    该函数返回一个回归树模型对象,该对象能够用于预测。
    进行预测:
p <- predict(m, test, type = "vector")
  • m: 由函数rpart()训练的一个模型
  • test: 测试数据集
  • type: 给定返回预测值的类型,取值为“vector”(预测数值型数据),或者“class”(预测类别型数据),或者“prob”(预测类别的概率)
    该函数返回值取决于type参数,是一个汉语预测值的向量。
    对于生成的CART模型,可以用rpart.plot包中的rpart.plot()函数使决策树可视化。详细内容可参考rpart.plot文档。
### 构建决策树实现分类模型 决策树是一种常用的监督学习算法,既可以用于分类任务也可以用于回归任务。对于分类问题,决策树通过递归地划分特征空间来构建一棵树形结构,最终使得每个叶子节点对应于某一类标签。 #### 决策树的核心原理 决策树的构建过程依赖于分裂准则的选择,常见的分裂准则是基于信息增益或基尼指数。在每次分裂时,算法会选择使当前数据集的信息熵最小化或者基尼系数最小化的特征及其阈值[^1]。 #### 预剪枝与后剪枝的作用 为了防止过拟合,在实际应用中通常会对决策树进行剪枝操作。预剪枝是在树生长过程中提前停止某些分支的增长;而后剪枝则是在完全生成一颗大树之后再移除部分子树。这两种方式都可以有效降低模型复杂度并提升其泛化性能。 以下是使用Python中的`scikit-learn`库实现一个简单的分类决策树的例子: ```python from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 加载乳腺癌数据集作为示例 data = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=42) # 初始化决策树分类器 clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42) # 使用Gini指数作为分裂标准,并设置最大深度为3 clf.fit(X_train, y_train) # 可视化决策树 plt.figure(figsize=(12,8)) plot_tree(clf, filled=True, feature_names=data.feature_names, class_names=data.target_names) plt.show() # 输出测试集上的预测结果 predictions = clf.predict(X_test) print(predictions[:10]) # 打印前十个预测样本的结果 ``` 上述代码片段展示了如何利用`DecisionTreeClassifier`创建一个带有约束条件(如最大深度)的决策树来进行癌症诊断的分类任务。这里我们选择了基尼指数作为衡量不纯度的标准之一,并设置了树的最大深度以控制模型复杂度[^2]。 #### 参数调整的重要性 当运用决策树解决具体业务场景下的分类问题时,合理调节超参数至关重要。例如可以通过交叉验证寻找最佳的最大深度(`max_depth`)、最小分割样本数(`min_samples_split`)等参数配置,从而达到更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值