共计 2029 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
决策树是一种直观且强大的机器学习模型,广泛应用于分类和回归任务。在金融风控、医疗诊断、推荐系统等领域都能看到它的身影。CART(Classification And Regression Trees)算法因其以下优势成为当前主流:

- 同时支持分类和回归任务
- 使用基尼系数作为分裂标准,计算效率高于信息增益
- 内置剪枝机制降低过拟合风险
- 生成的二叉树结构更易解释和可视化
技术对比:CART vs 其他算法
与早期决策树算法相比,CART 有以下显著特点:
- 与 ID3 的比较
- ID3 只能处理分类问题,CART 支持回归
- ID3 使用信息增益,容易偏向多值特征
-
ID3 不提供剪枝功能
-
与 C4.5 的比较
- C4.5 通过信息增益率改进 ID3
- CART 生成的二叉树比 C4.5 的多叉树更简洁
- CART 的基尼系数计算比信息增益率更快
核心实现原理
特征选择:基尼系数
基尼系数衡量数据的不纯度,计算公式为:
def gini_impurity(y):
classes = np.unique(y)
impurity = 1
for c in classes:
p = np.sum(y == c) / len(y)
impurity -= p**2
return impurity
递归构建算法流程
- 从根节点开始,计算所有特征的基尼系数
- 选择使不纯度下降最大的特征进行分裂
- 对分裂后的子集递归执行 1 - 2 步
- 直到满足停止条件(如深度限制、样本数阈值)
剪枝策略
- 预剪枝 :在生长过程中控制
- 最大树深度(max_depth)
- 叶节点最小样本数(min_samples_leaf)
-
分裂最小增益(min_impurity_decrease)
-
后剪枝 :先生成完整树再修剪
- 通过代价复杂度参数(ccp_alpha)控制
- 使用验证集评估剪枝效果
Python 实现示例
scikit-learn 版本
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 构建模型
tree = DecisionTreeClassifier(
criterion='gini',
max_depth=3,
min_samples_split=2
)
tree.fit(X, y)
# 可视化
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
plot_tree(tree, filled=True, feature_names=iris.feature_names)
plt.show()
原生 Python 实现(核心部分)
class Node:
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 # 叶节点预测值
class CART:
def __init__(self, max_depth=5, min_samples_split=2):
self.max_depth = max_depth
self.min_samples_split = min_samples_split
def _best_split(self, X, y):
# 实现寻找最佳分裂特征的逻辑
pass
def _grow_tree(self, X, y, depth=0):
# 递归构建树的实现
pass
def fit(self, X, y):
self.root = self._grow_tree(X, y)
性能优化技巧
连续特征处理
- 排序后只考察相邻样本的中点作为候选阈值
- 采用二分查找加速最优分裂点搜索
并行计算
- 对特征级别的计算进行并行化
- 使用 joblib 加速 sklearn 的 n_jobs 参数
# 启用多核计算 tree = DecisionTreeClassifier(n_jobs=-1)
常见问题解决方案
过拟合识别与预防
- 监控训练集与验证集准确率差距
- 通过学习曲线判断是否需要更多数据
- 组合使用预剪枝和后剪枝
类别不平衡处理
- 使用 class_weight 参数调整类别权重
- 对少数类样本进行过采样
- 采用 AUC-ROC 代替准确率作为评估指标
实际应用建议
- 金融风控 :
- 结合 SHAP 值解释单条预测
-
使用决策路径分析高风险用户特征
-
医疗诊断 :
- 导出 if-then 规则供医生参考
-
注意模型的可解释性要求
-
工业质检 :
- 处理高维图像特征时考虑特征选择
- 结合异常检测算法提升效果
思考题
在特征维度极高(如 >1000 维)的情况下,可以考虑:
– 先进行特征选择降维
– 使用近似算法加速基尼系数计算
– 采用特征哈希(hashing trick)
– 实现特征采样策略
正文完
