共计 1641 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
决策树是机器学习中最直观且易于解释的算法之一,而 CART(Classification and Regression Trees)算法则是其中最经典的一种实现。它通过递归地二分数据来构建树结构,适用于分类和回归任务。与其他决策树算法不同,CART 使用基尼系数作为分裂标准,能够处理连续型和分类型特征,且生成的二叉树结构更简洁。

核心算法解析
基尼系数计算
基尼系数衡量数据的不纯度,值越小表示数据越纯净。其计算公式为:
def gini_index(groups, classes):
n_instances = sum(len(group) for group in groups)
gini = 0.0
for group in groups:
size = len(group)
if size == 0:
continue
score = 0.0
for class_val in classes:
p = [row[-1] for row in group].count(class_val) / size
score += p * p
gini += (1 - score) * (size / n_instances)
return gini
特征选择与分裂规则
CART 通过穷举所有可能的分裂点,选择使基尼系数降低最多的特征和分裂值:
- 对每个特征进行排序
- 计算相邻值的中点作为候选分裂点
- 评估每个分裂点的基尼系数
- 选择最优分裂点
递归构建过程
构建决策树的核心是递归分割数据,直到满足停止条件(如达到最大深度或节点样本数过少):
class DecisionTree:
def build_tree(self, node, max_depth, min_size, depth):
left, right = node['groups']
if not left or not right:
node['left'] = node['right'] = self.to_leaf(left + right)
return
if depth >= max_depth:
node['left'], node['right'] = self.to_leaf(left), self.to_leaf(right)
return
if len(left) <= min_size:
node['left'] = self.to_leaf(left)
else:
node['left'] = self.get_split(left)
self.build_tree(node['left'], max_depth, min_size, depth+1)
# 同理处理右子树...
Python 实现
完整实现包含以下核心组件:
Node类:表示树节点split方法:执行单次分裂predict方法:递归遍历树进行预测
关键实现技巧:
- 使用字典存储节点信息更灵活
- 预计算特征值的中位数减少重复计算
- 采用深度优先构建策略节省内存
简单案例演示
以鸢尾花数据集的前两个特征为例:
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, :2] # 只使用前两个特征
tree = DecisionTree()
tree.fit(X, y, max_depth=3)
print(tree.predict([5.1, 3.5]))
可视化决策边界:
import matplotlib.pyplot as plt
# 绘制决策边界代码...
plt.show()
生产环境注意事项
过拟合解决方案
- 预剪枝:设置最大深度、最小叶节点样本数
- 后剪枝:通过验证集评估剪枝收益
连续值处理
- 预先离散化为百分位数
- 动态计算候选分裂点
缺失值处理
- 代理分裂:找到替代特征的分裂规则
- 默认方向:将缺失样本分配到多数类别分支
性能优化建议
- 并行化特征选择
- 使用稀疏矩阵存储
- 批量预测减少递归调用
总结与扩展
CART 是随机森林的基础组件,在实际应用中:
– 金融风控:利用可解释性强的特点
– 医疗诊断:处理混合类型特征
– 工业质检:快速部署到边缘设备
完整实现代码见 GitHub 仓库(示例链接)。在实际项目中,建议先从小规模数据验证模型效果,再逐步扩展到全量数据。
正文完
