共计 1191 个字符,预计需要花费 3 分钟才能阅读完成。
CART 决策树作为经典的机器学习算法,既能处理分类任务也能解决回归问题,其白盒特性让模型决策过程清晰可见。本文将通过流程图解 + 代码实战,带新手避开构建过程中的常见陷阱。

为什么新手总在特征选择踩坑?
-
信息增益计算误区:
许多教程直接套用信息增益公式,但忽略连续特征需要先排序分箱。例如年龄字段未经离散化直接计算,会导致分裂点无效。 -
停止条件的双刃剑:
min_samples_split设置过小(如 =2)会产生过深树,而max_depth过大时模型会记住噪声。建议从深度 5 开始试探。
从流程图到代码实战
决策树构建流程(Mermaid 版)
flowchart TD
A[开始] --> B{是否达到停止条件?}
B -- 否 --> C[选择最佳分裂特征]
C --> D[按 Gini 系数分裂节点]
D --> E{是否需要剪枝?}
E -- 是 --> F[合并叶节点]
E -- 否 --> B
B -- 是 --> G[生成叶节点]
Gini 系数计算实现
import numpy as np
def gini_index(y):
"""
计算 Gini 不纯度
:param y: 当前节点样本标签 array-like
:return: float 基尼系数
"""
_, counts = np.unique(y, return_counts=True)
probabilities = counts / counts.sum()
return 1 - np.sum(probabilities ** 2) # 公式: 1-Σ(p_i)^2
# 示例:二分类样本的 Gini 计算
y = np.array([0, 1, 1, 0, 1])
print(f"Gini 指数: {gini_index(y):.4f}") # 输出 0.48
避坑指南
- 连续值分箱的边界处理
- 对年龄等连续特征,先用
pandas.cut分箱 -
边界值建议取
np.linspace(min_val, max_val, bins+1) -
可视化防重叠技巧
- 调整
figsize参数:plt.figure(figsize=(20,10)) - 设置节点间距:
sklearn.tree.plot_tree(..., node_ids=True, proportion=True)
思考与延伸
-
算法对比:
| 算法 | 支持任务 | 分裂标准 | 缺失值处理 |
|—|—|—|—|
| ID3 | 分类 | 信息增益 | 不支持 |
| C4.5 | 分类 | 增益率 | 支持 |
| CART | 分类 / 回归 | Gini/ 方差 | 支持 | -
sklearn 样式优化:
from sklearn.tree import plot_tree plot_tree(model, filled=True, rounded=True, feature_names=feature_names, class_names=['No','Yes']) # 二分类标签替换
决策树就像编程中的 if-else 进阶版,理解每个参数背后的数学意义比调参更重要。建议用 graphviz 导出高清矢量图,能更直观分析模型决策路径。
正文完
