共计 2113 个字符,预计需要花费 6 分钟才能阅读完成。
CART 决策树算法全面解析
决策树是机器学习中最直观的算法之一,而 CART(Classification and Regression Trees)作为其中的经典实现,广泛应用于分类和回归任务。本文将带你深入理解其原理,并手把手教你用 Python 实现。

1. 核心概念:Gini 系数与算法对比
1.1 Gini 系数计算
Gini 系数(基尼指数)衡量数据集的不纯度,计算公式为:
Gini(D) = 1 - Σ(p_i)^2
其中 p_i 是第 i 类样本所占比例。
1.2 信息增益 vs Gini 系数
与 ID3/C4.5 不同之处:
- ID3 使用信息增益(Information Gain)
- C4.5 使用增益率(Gain Ratio)
- CART 使用 Gini 系数
主要差异:
- 计算效率:Gini 系数计算更快(无对数运算)
- 偏向性:信息增益偏向多值特征
- 适用范围:CART 可同时处理分类和回归
2. Python 实现详解
2.1 关键代码结构
class TreeNode:
def __init__(self, feature_idx=None, threshold=None,
left=None, right=None, value=None):
self.feature_idx = feature_idx # 分裂特征索引
self.threshold = threshold # 分裂阈值
self.left = left # 左子树
self.right = right # 右子树
self.value = value # 叶节点预测值
2.2 Gini 系数实现
def gini_impurity(y):
m = y.shape[0]
return 1.0 - sum((np.sum(y == c) / m) ** 2 for c in np.unique(y))
2.3 树生长核心逻辑
def find_best_split(X, y):
best_gini = float('inf')
best_idx, best_thresh = 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
gini = (gini_impurity(y[left_idx]) * np.sum(left_idx) +
gini_impurity(y[~left_idx]) * np.sum(~left_idx)) / len(y)
if gini < best_gini:
best_gini = gini
best_idx = feature_idx
best_thresh = threshold
return best_idx, best_thresh
3. sklearn 实战优化
3.1 基础用法
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(
criterion='gini',
max_depth=5,
min_samples_split=10
)
clf.fit(X_train, y_train)
3.2 关键参数说明
- max_depth:控制树的最大深度
- min_samples_split:节点继续分裂的最小样本数
- min_impurity_decrease:分裂需要的最小不纯度减少量
建议使用 GridSearchCV 进行调优:
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(clf, param_grid, cv=5)
grid_search.fit(X, y)
4. 常见错误及解决方案
- 忽略特征缩放
- 问题:决策树虽不受量纲影响,但影响分裂点选择
-
解决:对连续特征做标准化
-
未处理类别不平衡
- 问题:模型偏向多数类
-
解决:设置 class_weight=’balanced’
-
过拟合问题
- 问题:树过于复杂
-
解决:使用剪枝(ccp_alpha 参数)
-
缺失值处理不当
- 问题:sklearn 默认不支持缺失值
-
解决:使用 SimpleImputer 预处理
-
忽视特征重要性
- 问题:无法识别关键特征
- 解决:分析 feature_importances_
5. 进阶应用
5.1 回归问题
只需将 criterion 改为 ’mse’:
from sklearn.tree import DecisionTreeRegressor
reg = DecisionTreeRegressor(criterion='mse')
5.2 与随机森林的关系
随机森林通过:
- 构建多棵 CART 树(bootstrap 采样)
- 特征随机选择(max_features 参数)
- 投票 / 平均得到最终结果
这种集成方法显著提升了单棵 CART 树的泛化能力。
结语
通过本文的系统学习,你应该已经掌握了 CART 算法的核心原理和实战技巧。建议在 Kaggle 等平台找真实数据集练习,并尝试调整不同参数观察模型表现。决策树作为基础算法,其思想在 XGBoost 等现代算法中仍有体现,值得深入掌握。
正文完
