共计 1960 个字符,预计需要花费 5 分钟才能阅读完成。
核心概念:决策树如何做选择
CART 决策树的本质是通过一系列 if-then 规则对数据进行分割。与 ID3 算法不同,它既可用于分类也能处理回归任务,核心在于两个关键指标:

- 基尼系数:衡量数据不纯度的指标,计算公式为 $Gini = 1-\sum(p_i^2)$。值越小说明分组越 ” 纯净 ”,比如完美分类时基尼系数为 0
- 信息增益:基于信息熵的变化量,但 CART 默认使用基尼系数计算更高效
实际应用中,基尼系数计算速度比信息增益快约 20-30%,这是 scikit-learn 默认采用它的主要原因。
表格数据的典型痛点
处理表格数据时,这些坑我基本都踩过:
- 类别不平衡:比如欺诈检测中正常交易占 99%,直接用原始数据训练会导致模型 ” 躺平 ”
- 高基数特征:像用户 ID 这种唯一值过多的特征,决策树会过度关注这些无意义差异
- 混合类型数据:同时包含数值型(年龄)和类别型(职业)时的处理尴尬
- 缺失值陷阱 :传统 pandas 的 dropna() 可能直接扔掉一半数据
实战代码:从数据到模型
先看完整的处理流程代码(Python3.8+ 环境):
# 导入核心库
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
import pandas as pd
# 1. 数据加载
raw_data = pd.read_csv('your_table.csv')
# 2. 特征工程
# 处理高基数特征:只保留出现频次 >10 的类别
def filter_high_cardinality(col, threshold=10):
counts = col.value_counts()
return col.where(col.isin(counts[counts > threshold].index), '其他')
# 独热编码示范
encoder = OneHotEncoder(handle_unknown='ignore')
categorical_cols = ['职业', '城市'] # 示例类别字段
encoded_features = encoder.fit_transform(raw_data[categorical_cols])
# 3. 训练测试集拆分
X_train, X_test, y_train, y_test = train_test_split(
encoded_features,
raw_data['target'],
test_size=0.3,
stratify=raw_data['target'] # 保持类别比例
)
# 4. 模型训练(关键参数示范)model = DecisionTreeClassifier(
max_depth=5, # 控制树深防过拟合
min_samples_leaf=10, # 每个叶节点最少样本数
criterion='gini' # 默认就是 gini 可不写
)
model.fit(X_train, y_train)
模型评估:超越准确率的视角
新手常犯的错误是只看准确率:
- 混淆矩阵:特别关注假阳性 / 假阴性的业务代价
from sklearn.metrics import plot_confusion_matrix plot_confusion_matrix(model, X_test, y_test) - ROC 曲线:当类别不平衡时,AUC 比准确率更可靠
from sklearn.metrics import roc_curve fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:,1])
六大避坑指南
1. 过拟合防御
- 设置
min_samples_leaf为数据集大小的 1%~5% - 用
max_depth控制树深,通常 3 - 7 层足够 - 训练后检查特征重要性,剔除贡献度 <5% 的特征
2. 缺失值处理
不同于随机森林,决策树需要显式处理:
- 数值型:用中位数而非均值填充(更抗异常值)
- 类别型:单独作为 ” 未知 ” 类别
3. 内存优化
部署时注意:
- 用
export_text()替代图形化显示 - 设置
ccp_alpha参数进行剪枝 - 对于大型数据,使用
presort=False加速训练
进阶思考:从 CART 到随机森林
建议做对比实验:
- 相同数据分别训练 CART 和随机森林
- 对比两者的特征重要性排序
- 观察随机森林是否缓解了过拟合问题
关键发现点:随机森林通常会有更高的训练效率,但决策树在模型解释性上完胜。
写在最后
经过三个实际项目的磨练,我的体会是:决策树就像瑞士军刀,简单但实用。特别是在需要快速验证思路或向业务方解释模型时,它的可视化能力是无敌的。建议初学者先从 max_depth=3 的简单模型开始,逐步增加复杂度,这样更容易理解每个参数的实际影响。
正文完
