共计 1905 个字符,预计需要花费 5 分钟才能阅读完成。
在机器学习项目中,决策树类模型的误用常导致结果偏差。最近团队就遇到一个典型案例:同事用 CART 树处理新闻文本多分类任务时,准确率比基准模型低了 15%。复盘发现症结在于错误选择了树模型类型——这促使我系统梳理 CART 与传统决策树的关键差异。

一、先理清基本概念
决策树 (Decision Tree) 是泛指通过树结构进行决策的算法统称,而 CART(Classification and Regression Trees)特指采用 Gini 系数作为分裂准则的二叉树。它们的关系类似于 ” 水果 ” 和 ” 苹果 ”。
二、三大主流决策树对比
| 维度 | ID3 | C4.5 | CART |
|---|---|---|---|
| 分裂准则 | 信息增益 | 信息增益比 | Gini 系数 |
| 特征类型 | 仅离散特征 | 支持连续特征 | 支持所有特征类型 |
| 缺失值处理 | 不支持 | 通过权重修正 | 代理分裂点 |
| 树结构 | 多叉树 | 多叉树 | 二叉树 |
| 输出任务 | 仅分类 | 仅分类 | 分类与回归 |
三、核心数学原理拆解
信息增益(Information Gain):
$$IG(D_p,f) = I(D_p) – \sum_{j=1}^{m} \frac{N_j}{N_p}I(D_j)$$
其中 $I(D)$ 可以是熵或 Gini 指数,计算父节点与子节点的不纯度差值。
Gini 系数计算示例:
import numpy as np
# 计算二分类 Gini 指数
def gini(p):
return 1 - (p**2 + (1-p)**2)
# 假设节点中有 80 个正样本,20 个负样本
gini_node = gini(80/(80+20)) # 输出 0.32
四、代码实战对比
1. 数据预处理
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import KBinsDiscretizer
# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data, data.target
# 对连续特征离散化
discretizer = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')
X_disc = discretizer.fit_transform(X[:, :5]) # 只处理前 5 个特征示例
2. 模型训练与可视化
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 传统决策树(使用信息增益)
dt = DecisionTreeClassifier(criterion='entropy', max_depth=3)
dt.fit(X, y)
# CART 树
dtc = DecisionTreeClassifier(criterion='gini', max_depth=3)
dtc.fit(X, y)
# 可视化树结构
plt.figure(figsize=(12,6))
plot_tree(dtc, feature_names=data.feature_names, filled=True)
plt.show()
3. 性能对比
from sklearn.model_selection import cross_val_score
# 10 折交叉验证
dtv_scores = cross_val_score(dt, X, y, cv=10)
cart_scores = cross_val_score(dtc, X, y, cv=10)
print(f"决策树平均准确率: {dtv_scores.mean():.3f}")
print(f"CART 树平均准确率: {cart_scores.mean():.3f}")
五、生产环境选型建议
- 优先选择 CART 的场景:
- 需要特征重要性排序(CART 的 feature_importances_更稳定)
- 存在大量连续特征(无需预先离散化)
-
回归任务(仅 CART 支持)
-
传统决策树的优势场景:
- 处理高基数类别特征(超过 100 个类别)
-
需要更直观的规则解释(多叉树结构更易读)
-
通用优化技巧:
- 必须启用 CCP 剪枝防止过拟合:
path = dtc.cost_complexity_pruning_path(X, y) ccp_alphas = path.ccp_alphas - 对类别特征优先使用
min_samples_leaf而非max_depth控制树规模
经过在乳腺癌数据集上的实测,CART 以 92.1% 的准确率略优于传统决策树(91.3%),但处理新闻文本时传统决策树反而高出 7 个百分点——这验证了没有绝对最优的算法,只有最适合数据特性的选择。
建议大家在选择树模型时,先花 10 分钟做特征分析和简单 benchmark,这往往能节省后续 80% 的调参时间。
正文完
