CART(分类回归树)分类算法原理

本文介绍了CART(分类回归树)算法的核心原理,重点讲解了如何利用基尼指数选择最优特征进行数据划分。通过一个实例展示了如何计算不同特征的基尼指数,并选择最小基尼指数的属性作为节点分类依据。最后,探讨了剪枝策略,以防止过拟合,提高决策树的泛化能力。

目的

生成一颗决策树,输入X(各种特征条件)输出Y(该样本分类结果)。

一、分类树选择特征的依赖——基尼指数

  • 基尼指数——总体内包含的类别越杂乱,基尼指数就越大

在CART算法中, 基尼不纯度表示一个随机选中的样本在子集中被分错的可能性。

基尼不纯度 = ∑i=1K(\sum_{i=1}^K(i=1K(样本iii被选中的概率 ∗* 它被分错的概率)

(当一个节点中所有样本都是一个类时,基尼不纯度为零。)

假设y的可能取值有K个,令pkp_kpk是样本取值为k的概率,
则基尼指数可以通过如下公式计算:

Gini(p)=∑i=1Kpi(1−pi)=1−∑i=1Kpi2Gini(p)=\sum_{i=1}^Kp_i(1-p_i)=1-\sum_{i=1}^K{p_i}^2Gini(p)=i=1Kpi(1pi)=1i=1Kpi2
在选择根节点属性时,计算每一种属性分类后的基尼指数GiniGiniGini,选择GiniGiniGini最小的那种属性作为该节点的分类依据。

二、例子

头发身高体重性别
60
65
70
55
50

要对上表的数据构建一颗决策树,它的特征集合A={头发、身高、体重}

1.当选择{头发}分类时,对应的样本数如下表:

12
11
Total23

G长=1−(12)2−(12)2=0.5G_长=1-(\frac{1}{2}){^2} - (\frac{1}{2}){^2} = 0.5G=1212212=0.5
G短=1−(13)2−(23)2=0.444G_短={1-}(\frac{1}{3}){^2} - (\frac{2}{3}){^2} = 0.444G=1312322=0.444
G{头发}=25∗G长+35∗G短=0.466G_{\{头发\}} = \frac{2}{5}*G_长 + \frac{3}{5}*G_短= 0.466G{}=52G+53G=0.466

(两种值的加权值为该属性的基尼系数)


2.当选择{身高}分类时,有三种值,对应三种分法,

(1)按照中和非中分类如下表:
非中
12
11
Total23

G中=1−(12)2−(12)2=0.5G_中={1-}(\frac{1}{2}){^2} - (\frac{1}{2}){^2} = 0.5G=1212212=0.5
G非中=1−(13)2−(23)2=0.444G_{非中}={1-}(\frac{1}{3}){^2} - (\frac{2}{3}){^2} = 0.444G=1312322=0.444
G{身高−中}=25∗G中+35∗G非中=0.466G_{\{身高-中\}} = \frac{2}{5}*G_中 + \frac{3}{5}*G_{非中}= 0.466G{}=52G+53G=0.466

(两种值的加权值为该属性的基尼系数)

(2)按照高和非高分类如下表:
非高
21
02
Total23

G高=1−(22)2−(02)2=0G_高={1-}(\frac{2}{2}){^2} - (\frac{0}{2}){^2} = 0G=1222202=0
G非高=1−(13)2−(23)2=0.444G_{非高}={1-}(\frac{1}{3}){^2} -( \frac{2}{3}){^2} = 0.444G=1312322=0.444
G{身高−高}=25∗G高+35∗G非高=0.266G_{\{身高-高\}} = \frac{2}{5}*G_高 + \frac{3}{5}*G_{非高}= 0.266G{}=52G+53G=0.266

(两种值的加权值为该属性的基尼系数)

(3)按照矮和非矮分类如下表:
非矮
03
11
Total14

G矮=1−(01)2−(11)2=0G_矮={1-}(\frac{0}{1}){^2} - (\frac{1}{1}){^2} = 0G=1102112=0
G非矮=1−(34)2−(14)2=0.375G_{非矮}={1-}(\frac{3}{4}){^2} - (\frac{1}{4}){^2} = 0.375G=1432412=0.375
G{身高−矮}=15∗G矮+45∗G非矮=0.3G_{\{身高-矮\}} = \frac{1}{5}*G_矮 + \frac{4}{5}*G_{非矮}= 0.3G{}=51G+54G=0.3

(两种值的加权值为该属性的基尼系数)


3.当选择{体重}分类时,由于是连续值,从小到大排列:

性别
体重5055606570
分界点1
<=52.5>52.5
12
02
Total14
(1)对于分界点1

G<=52.5=1−(11)2−(01)2=0G_{<=52.5}={1-}(\frac{1}{1}){^2} - (\frac{0}{1}){^2} = 0G<=52.5=1112102=0
G>52.5=1−(24)2−(24)2=0.5G_{>52.5}={1-}(\frac{2}{4}){^2} - (\frac{2}{4}){^2} = 0.5G>52.5=1422422=0.5
G{体重−分界点1}=15∗G<=52.5+45∗G>52.5=0.4G_{\{体重-分界点1\}} = \frac{1}{5}*G_{<=52.5}+ \frac{4}{5}*G_{>52.5}= 0.4G{1}=51G<=52.5+54G>52.5=0.4

(两种值的加权值为该属性的基尼系数)


性别
体重5055606570
分界点2
<=62.5>62.5
12
20
Total32
(2)对于分界点2

G<=62.5=1−(13)2−(23)2=0.444G_{<=62.5}={1-}(\frac{1}{3}){^2} - (\frac{2}{3}){^2} = 0.444G<=62.5=1312322=0.444
G>62.5=1−(22)2−(02)2=0G_{>62.5}={1-}(\frac{2}{2}){^2} - (\frac{0}{2}){^2} = 0G>62.5=1222202=0
G{体重−分界点2}=35∗G<=62.5+25∗G>62.5=0.266G_{\{体重-分界点2\}} = \frac{3}{5}*G_{<=62.5}+ \frac{2}{5}*G_{>62.5}= 0.266G{2}=53G<=62.5+52G>62.5=0.266

(两种值的加权值为该属性的基尼系数)


4.比较以上各个分类方法基尼指数

GiniGiniGini最小的属性为:
G{身高−高}=0.266G_{\{身高-高\}} = 0.266G{}=0.266
G{体重−分界点2}=0.266G_{\{体重-分界点2\}}=0.266G{2}=0.266
当有基尼指数相同的属性时,选择第一次出现的,
那么根节点就是身高,分为高和非高。

非高
身高=?
男女2:0
男女1:2

5.左分支都是男,不用再分类;现在右分支的数据如下表

头发体重性别
60
55
50

身高的属性已经用了,剩下两种属性,分别计算基尼指数:

(1)以{头发}分类
01
11
Total12

G长=1−(01)2−(11)2=0G_长={1-}(\frac{0}{1}){^2} - (\frac{1}{1}){^2} = 0G=1102112=0
G短=1−(12)2−(12)2=0.5G_{短}={1-}(\frac{1}{2}){^2} -( \frac{1}{2}){^2} = 0.5G=1212212=0.5
G{身高−高}=13∗G高+23∗G非高=0.333G_{\{身高-高\}} = \frac{1}{3}*G_高 + \frac{2}{3}*G_{非高}= 0.333G{}=31G+32G=0.333

(两种值的加权值为该属性的基尼系数)

(2)以{体重}分类
性别
体重505560
分界点1
<=52.5>52.5
10
02
Total12

G<=52.5=1−(11)2−(01)2=0G_{<=52.5}={1-}(\frac{1}{1}){^2} - (\frac{0}{1}){^2} = 0G<=52.5=1112102=0
G>52.5=1−(02)2−(22)2=0G_{>52.5}={1-}(\frac{0}{2}){^2} - (\frac{2}{2}){^2} = 0G>52.5=1202222=0
G{体重−分界点1}=13∗G<=52.5+23∗G>52.5=0G_{\{体重-分界点1\}} = \frac{1}{3}*G_{<=52.5}+ \frac{2}{3}*G_{>52.5}= 0G{1}=31G<=52.5+32G>52.5=0

(两种值的加权值为该属性的基尼系数)


6.选择GiniGiniGini最小的

GiniGiniGini最小的属性为:
G{体重−分界点1}=0G_{\{体重-分界点1\}}=0G{1}=0
那么此节点选体重,分界点为52.5。

非高
<=52.5
>52.5
身高=?
体重=?

现在每一个叶子节点性别都确定了,不需要再分类
一颗简单的CART树就完成了


三、总结

CART根据基尼系数选择分类属性,进行二叉树分类,不断递归这个过程,直到
(1) 当前结点包含的样本全属于同一类别,无需划分;
(2) 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;


四、扩展——剪枝

剪枝的目的:训练时会尽可能多得生成枝子,往往对训练集分类效果很好,但在验证集分类误差大。为防止过拟合,提高决策树的泛化性,需要修剪一些分支。

剪枝过程:首先将样本分为训练集和验证集。

1)预剪枝
预剪枝要对划分前后,验证集精度进行估计,如精度提高则进行划分。
2)后剪枝
后剪枝先从训练集生成一棵完整决策树,再依次对每个叶枝剪除前后,验证集精度进行评估,如精度提高则剪枝。

后剪枝决策树通常比预剪枝决策树保留了更多的分支。
一般情形下后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
但后剪枝过程是在生成完全决策树之后进行的
并且要白底向上地对树中的所有非叶结点进行逐一考察,
因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

<think> 首先,用户的问题是:“我想了解使用CART回归树进行分类的相关内容 请问CART回归树用于分类原理、方法及案例”。用户提到CART回归树用于分类,但根据引用材料,CART指的是Classification and Regression Trees,其中回归树用于回归问题(连续目标变量),而分类树用于分类问题(离散目标变量)。 从引用[2]和[引用3]: - 引用[2]明确说CART包括分类树回归树。 - 引用[3]解释决策树分为分类决策树回归决策树。 用户说“CART回归树用于分类”,这可能是个误解。CART回归树是针对回归问题的,CART分类树是针对分类问题的。我需要澄清这一点。 用户的问题是询问CART回归树用于分类原理、方法和案例。但根据知识,回归树不适合直接用于分类任务。我应该解释CART算法既可以用于分类也可以用于回归,并区分两者的不同。 回顾引用: - 引用[1]:CART回归树用于回归分析。 - 引用[2]:CART作为分类树的步骤(使用基尼指数)。 - 引用[3]:决策树分为分类回归树。 所以,我需要: 1. 澄清CART回归树分类树的区别。 2. 解释如果用户想用CART进行分类,应该使用CART分类树。 3. 提供原理、方法和案例。 用户指定“CART回归树用于分类”,这可能是个错误或特定场景。在现实中,回归树预测连续值,不适合分类分类树预测离散类别。但理论上,可以强制使用回归树进行分类,但这不标准且可能效率低。我应该指出这一点。 结构我的回答: - 先澄清概念。 - 然后解释CART分类树原理、方法和案例。 - 或许简要提到为什么回归树不适合分类。 用户提到“使用CART回归树进行分类”,所以我需要基于引用材料回答。 引用[4]似乎是一个数据示例,可能与树的生成有关。 系统指令: - 使用中文回答。 - 生成相关问题。 - 回答结构清晰。 - 行内数学表达式用$...$。 - 独立公式用$$...$$。 - 引用的段落末尾添加引用标识。 我的回答结构: 1. **澄清概念**:解释CART回归树分类树的区别。 2. **原理**:如果用于分类,使用分类树的方法(基尼指数或信息增益)。 3. **方法**:步骤如分裂准则、停止条件等。 4. **案例**:提供一个简单示例。 5. **生成相关问题**:在最后添加。 内容大纲: - **概念澄清**:CART算法可用于分类回归回归树预测连续值(如平均),分类树预测离散类别(如众数)。参考[3]。 - **原理**:对于分类CART使用基尼指数最小化来选择分裂点。参考[2]。 - **方法**: - 步骤:选择最佳特征和分裂点来减少基尼指数。递归分裂直到停止条件(如节点纯、数据少等)。 - 预测:叶节点中目标变量的众数。 - **案例**:构建一个简单的分类树数据集。例如,预测天气是否下雨基于温度和湿度。 数学表达式可能涉及: - 基尼指数:$ \text{Gini}(D) = 1 - \sum_{i=1}^{k} p_i^2 $,其中 $p_i$ 是类别i的概率。 - 在行内或独立公式中正确使用。 引用添加: - 在解释的段落末尾添加[^n]。 最后,生成相关问题。 确保回答真实可靠:基于提供的引用和常识。 完整回答: - 开头:直接回应用户的问题。 - 主体:分点解释原理、方法、案例。 - 结尾:相关问题。 </think> ### CART回归树用于分类的解析 您的查询提到“CART回归树用于分类”,但需要澄清一个关键点:CART(Classification and Regression Trees)算法包含两个分支——**CART分类树**(用于分类任务,预测离散类别)和**CART回归树**(用于回归任务,预测连续数值)。标准的CART回归树专为回归设计(如预测房价),不适合直接用于分类任务(如预测类别标签)。如果强行将回归树用于分类,可能会效率低下、预测不准确,因为回归树基于最小化均方误差(MSE)来分裂节点,而分类任务需要离散输出(如类别概率或众数)。相反,CART分类树使用基尼指数(Gini impurity)或信息增益来选择分裂点,更适合分类问题[^3]。 然而,在某些特殊场景下(如目标变量编码为连续值或概率估计),可以通过间接方式“借用”回归树结构进行分类,但实操中强烈推荐使用CART分类树。下面我将基于您的引用材料,先解释CART分类树原理、方法和案例(因为这才是标准分类方法),并附带说明回归树用于分类的潜在思路和局限。 --- ### 1. **原理CART分类树的核心机制** CART分类树通过递归地将数据集划分为纯度更高的子集来预测离散类别。其核心是选择最佳分裂特征和分裂点,以最小化基尼不纯度(Gini impurity),最终叶节点输出目标变量的众数(即最常见的类别)。基尼指数衡量数据集的“不纯度”:值越小表示节点越纯(同一类别样本越多)。数学上,基尼指数定义为: $$ \text{Gini}(D) = 1 - \sum_{i=1}^{k} p_i^2 $$ 其中: - $D$ 是当前节点数据集。 - $k$ 是类别数量。 - $p_i$ 是类别 $i$ 在 $D$ 中的比例。 分裂准则:选择特征和分裂点使分裂后的加权基尼指数下降最大。公式为: $$ \Delta \text{Gini} = \text{Gini}(D) - \left( \frac{|D_{\text{left}}|}{|D|} \cdot \text{Gini}(D_{\text{left}}) + \frac{|D_{\text{right}}|}{|D|} \cdot \text{Gini}(D_{\text{right}}) \right) $$ 其中 $D_{\text{left}}$ 和 $D_{\text{right}}$ 是分裂后的子集。这个过程递归进行,直到满足停止条件:数据集为空、属性列表为空、或节点中所有样本属于同一类[^2][^3]。 **为什么回归树不适合分类?** 回归树使用均方误差(MSE)优化分裂点(例如,$ \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y})^2 $,其中 $\hat{y}$ 是节点均值),输出连续值。如果用于分类: - 输出的是连续概率或数值,需额外步骤(如阈值处理)转换为类别。 - 可能导致预测不鲁棒,因为MSE对类别边界不敏感。 - 案例中罕见使用,但理论上可通过“回归到类别概率”实现(例如,预测概率后取最大概率类别)[^1][^3]。 --- ### 2. **方法:CART分类树的构建步骤** CART分类树的构建是二叉树过程(每个节点分裂为两个子集),步骤如下: 1. **初始化**:从根节点开始,包含整个训练数据集。 2. **特征选择和分裂**: - 对每个特征计算所有可能分裂点的基尼指数下降值 $\Delta \text{Gini}$。 - 选择 $\Delta \text{Gini}$ 最大的特征和分裂点,将节点分裂为左右子集。 3. **递归分裂**:对每个子节点重复步骤2。 4. **停止条件**(任一满足时停止分裂): - 数据集为空(无样本)。 - 属性列表为空(无可用特征)。 - 节点中所有样本属于同一类(纯度100%,基尼指数为0)。 - 达到预设的深度或最小样本数(防止过拟合)。 5. **预测**:叶节点输出该区域内目标变量的众数(最常见类别)[^2][^3]。 **示例方法伪代码(Python风格):** ```python class TreeNode: def __init__(self, feature=None, threshold=None, left=None, right=None, value=None): self.feature = feature # 分裂特征索引 self.threshold = threshold # 分裂点 self.left = left # 左子树(特征值 ≤ 阈值) self.right = right # 右子树(特征值 > 阈值) self.value = value # 叶节点的预测值(众数) def build_cart_tree(X, y, max_depth=5): # 停止条件检查 if len(y) == 0 or max_depth == 0 or np.unique(y).size == 1: return TreeNode(value=np.argmax(np.bincount(y))) # 返回众数 best_gain = -np.inf best_feature, best_threshold = None, None # 遍历所有特征和可能的分裂点 for feature_idx in range(X.shape[1]): thresholds = np.unique(X[:, feature_idx]) for threshold in thresholds: left_idx = X[:, feature_idx] <= threshold right_idx = X[:, feature_idx] > threshold # 计算基尼指数下降 gini_parent = calc_gini(y) gini_left = calc_gini(y[left_idx]) gini_right = calc_gini(y[right_idx]) n_left, n_right = np.sum(left_idx), np.sum(right_idx) gain = gini_parent - (n_left/len(y)*gini_left + n_right/len(y)*gini_right) if gain > best_gain: best_gain = gain best_feature = feature_idx best_threshold = threshold # 递归构建子树 left_idx = X[:, best_feature] <= best_threshold left_tree = build_cart_tree(X[left_idx], y[left_idx], max_depth-1) right_tree = build_cart_tree(X[~left_idx], y[~left_idx], max_depth-1) return TreeNode(feature=best_feature, threshold=best_threshold, left=left_tree, right=right_tree) def calc_gini(y): # 计算基尼指数 classes = np.unique(y) gini = 1.0 for c in classes: p = np.sum(y == c) / len(y) gini -= p**2 return gini # 预测函数 def predict(tree, x): if tree.value is not None: return tree.value # 叶节点输出众数 if x[tree.feature] <= tree.threshold: return predict(tree.left, x) else: return predict(tree.right, x) ``` --- ### 3. **案例:简单分类任务示例** 假设一个数据集:预测天气是否下雨(二分类,1=下雨,0=不下雨),基于两个特征:温度(°C)和湿度(%)。数据样本如下: | 温度 | 湿度 | 是否下雨 | |------|------|----------| | 25 | 80 | 1 | | 30 | 60 | 0 | | 22 | 90 | 1 | | 28 | 70 | 0 | | 26 | 85 | 1 | **CART分类树构建过程:** 1. **根节点**:所有样本(5个),基尼指数计算:$ \text{Gini} = 1 - \left( \left(\frac{3}{5}\right)^2 + \left(\frac{2}{5}\right)^2 \right) = 1 - (0.36 + 0.16) = 0.48 $。 2. **分裂选择**: - 特征“温度”:尝试分裂点(如26°C)。分裂后左子集(≤26°C):样本(25,80,1)和(22,90,1),右子集(>26°C):样本(30,60,0)、(28,70,0)、(26,85,1)。基尼下降:$ \Delta \text{Gini} = 0.48 - \left( \frac{2}{5} \cdot \text{Gini}_{\text{left}} + \frac{3}{5} \cdot \text{Gini}_{\text{right}} \right) $,其中 $\text{Gini}_{\text{left}} = 1 - (1^2 + 0^2) = 0$(纯),$\text{Gini}_{\text{right}} = 1 - \left( \left(\frac{1}{3}\right)^2 + \left(\frac{2}{3}\right)^2 \right) ≈ 0.44$,下降≈0.27。 - 特征“湿度”:类似计算,假设分裂点85%给出更高下降。 - 选择最佳分裂(如湿度≤85%)。 3. **递归分裂**:左子集纯度高(不下雨样本多),可能停止;右子集继续分裂。 4. **最终树**:例如,根节点按湿度≤85%分裂,左子叶节点预测0(不下雨),右子叶节点预测1(下雨)。 5. **预测**:新样本(温度=24, 湿度=88),预测为1(下雨)。 **回归树用于分类的潜在方案(不推荐)** 如果强行使用回归树,需将“是否下雨”编码为连续值(如1.0或0.0),通过MSE优化分裂点。预测时输出连续值(如0.8),然后设定阈值(如0.5)转换为类别。但此方法精度通常低于分类树,因为MSE对类别不平衡敏感[^1][^3]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值