CART决策树做表:从原理到实战避坑指南

1次阅读
没有评论

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

image.webp

核心概念:决策树如何做选择

CART 决策树的本质是通过一系列 if-then 规则对数据进行分割。与 ID3 算法不同,它既可用于分类也能处理回归任务,核心在于两个关键指标:

CART 决策树做表:从原理到实战避坑指南

  • 基尼系数:衡量数据不纯度的指标,计算公式为 $Gini = 1-\sum(p_i^2)$。值越小说明分组越 ” 纯净 ”,比如完美分类时基尼系数为 0
  • 信息增益:基于信息熵的变化量,但 CART 默认使用基尼系数计算更高效

实际应用中,基尼系数计算速度比信息增益快约 20-30%,这是 scikit-learn 默认采用它的主要原因。

表格数据的典型痛点

处理表格数据时,这些坑我基本都踩过:

  1. 类别不平衡:比如欺诈检测中正常交易占 99%,直接用原始数据训练会导致模型 ” 躺平 ”
  2. 高基数特征:像用户 ID 这种唯一值过多的特征,决策树会过度关注这些无意义差异
  3. 混合类型数据:同时包含数值型(年龄)和类别型(职业)时的处理尴尬
  4. 缺失值陷阱 :传统 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 到随机森林

建议做对比实验:

  1. 相同数据分别训练 CART 和随机森林
  2. 对比两者的特征重要性排序
  3. 观察随机森林是否缓解了过拟合问题

关键发现点:随机森林通常会有更高的训练效率,但决策树在模型解释性上完胜。

写在最后

经过三个实际项目的磨练,我的体会是:决策树就像瑞士军刀,简单但实用。特别是在需要快速验证思路或向业务方解释模型时,它的可视化能力是无敌的。建议初学者先从 max_depth=3 的简单模型开始,逐步增加复杂度,这样更容易理解每个参数的实际影响。

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