从零构建CART决策树图形:原理详解与Python实战

1次阅读
没有评论

共计 1170 个字符,预计需要花费 3 分钟才能阅读完成。

image.webp

核心概念:基尼系数与信息增益

决策树的核心是选择最佳分割特征,CART 算法使用基尼系数(Gini Index)来衡量不纯度。基尼系数计算公式为:

从零构建 CART 决策树图形:原理详解与 Python 实战

Gini(D) = 1 - Σ(p_i)^2

其中 p_i 是第 i 类样本在数据集 D 中的比例。

信息增益(Information Gain)则是父节点的基尼系数与子节点基尼系数的加权差:

Gain = Gini(D) - Σ(|D_j|/|D|)*Gini(D_j)

新手常见 3 大误区

  • 忽略特征缩放:连续型特征未标准化可能导致分裂点偏移
  • 误解分类边界:将决策树的矩形边界误认为线性分割
  • 过度依赖默认参数 :未调整max_depth 等参数导致模型过拟合

Python 实现全流程

1. 数据预处理

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

2. 模型训练

from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion='gini', max_depth=3)
clf.fit(X_train, y_train)

3. 可视化实现

from sklearn.tree import export_graphviz
import graphviz

dot_data = export_graphviz(clf, feature_names=feature_names, 
                         filled=True, rounded=True)
graph = graphviz.Source(dot_data)
graph.render('decision_tree')

关键参数解析

  • max_depth:控制树的最大深度
  • min_samples_split:节点分裂所需最小样本数
  • ccp_alpha:用于代价复杂度剪枝

避坑实践指南

连续特征分箱

pd.cut(df['age'], bins=5)  # 等宽分箱

预防过拟合

# 后剪枝示例
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas

中文显示方案

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

延伸思考

尝试用 clf.feature_importances_ 生成带颜色深浅的特征重要性标注。对于多输出问题,建议使用 export_text() 先查看文本结构再设计可视化方案。

完整 Notebook 已上传 GitHub(伪链接):
https://github.com/example/decision-tree-visualization

正文完
 0
评论(没有评论)