共计 1434 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念:CART 决策树如何做选择
决策树就像做选择题:每次根据一个特征把数据分成更 ” 纯 ” 的子集。CART(Classification and Regression Trees)使用基尼系数 (Gini Index) 来衡量不纯度:

$$ Gini = 1 – \sum_{i=1}^{n}(p_i)^2 $$
- 基尼系数:计算简单,偏向于分割出大的分区(适合类别分布均匀的场景)
- 信息增益:基于信息熵,对类别分布不平衡的数据更敏感
实际使用中,80% 的情况用默认的基尼系数就够用——这也是 sklearn 的默认设置。
表格数据的三大杀手
- 类别不平衡:比如欺诈检测中正常交易占 99%
-
对策:class_weight=’balanced’ 参数或过采样
-
高基数特征:像用户 ID 这种唯一值多的特征
-
对策:直接删除或用频次编码
-
混合类型数据:数值型和类别型特征共存
- 对策:ColumnTransformer 分列处理
从原始数据到预测的完整流程
数据预处理实战
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
# 假设 df 包含数值型特征和类别型特征
num_cols = ['age', 'income']
cat_cols = ['gender', 'city']
# 构建处理管道
preprocessor = ColumnTransformer(
transformers=[('num', 'passthrough', num_cols),
('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols)
])
建树与调参关键点
from sklearn.tree import DecisionTreeClassifier
# 重要参数说明:# max_depth:树的最大深度,从 3 开始尝试
# min_samples_leaf:叶节点最小样本数,建议≥5
model = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=20,
class_weight='balanced',
random_state=42
)
模型评估:超越准确率的视角
当正样本只有 1% 时,99% 的准确率可能是假象:
- 混淆矩阵 看具体错分情况
-
召回率 (Recall) 对欺诈检测更重要
-
ROC 曲线 比较不同阈值的效果
- 面积(AUC)>0.9 说明模型很好
六个血泪教训
- 过拟合陷阱:树深度每增加 1 层,所需样本量翻倍
-
通过学习曲线观察验证集表现
-
缺失值处理:
- 简单方法:用中位数 / 众数填充
-
高级方法:新增 ” 是否缺失 ” 作为特征
-
部署优化:
- 用
export_text()代替图形化显示 -
限制树深度≤5 以保证可解释性
-
类别特征:
-
避免直接用 LabelEncoder(会引入虚假大小关系)
-
计算效率:
-
大数据集使用
max_features参数 -
特征重要性:
- 警惕高基数特征的虚假重要性
进阶方向:从单棵树到森林
尝试对比实验:
1. 相同数据先用 CART 单棵树
2. 再用 RandomForest(本质上就是 CART 的集合)
3. 观察两者的:
– 特征重要性排序是否一致
– 测试集表现差异
– 训练时间对比
这种对比能直观理解集成学习的效果。
写在最后
决策树最大的优势是 解释性强 ——当业务方问 ” 为什么拒绝这个客户 ” 时,你能清楚地指出决策路径。建议把最终模型用export_graphviz 可视化,配合业务知识优化特征选择。记住:没有完美的模型,只有最适合当前业务阶段的解决方案。
