用一份两万条的客户流失数据跑分类,模型在训练集上准确率98%,上线一周效果惨淡。把树打印出来一看,深度到了三十多层,每个叶子只挂着一两个样本,典型的过拟合。

它靠什么挑分裂点

决策树每一步选一个特征和一个阈值,把数据切成两半,切完之后两边的纯度尽量高。ID3用信息增益,天生偏向取值多的特征;C4.5改用增益率修正这个问题,还能直接处理连续值;CART用基尼系数,只做二叉分裂,sklearn默认就是这一套。三个算法的共同点是贪心,每步都选当前最优,不保证全局最优,所以很容易钻牛角尖。

连续特征怎么切

把某一列的值排序,相邻两个值的中点都作为候选阈值,逐个算不纯度下降,取最好的那个。特征取值越多候选点越多,计算量成倍上涨。工程上会先做分箱,把连续值切成20到50个桶,训练速度能快一个数量级,精度掉得很少。分箱的边界要固定下来保存,线上打分时必须用同一套边界,否则训练和推理不一致。

剪枝比调参更重要

DecisionTreeClassifier(max_depth=6, min_samples_leaf=50, min_samples_split=100)

max_depth限制层数,min_samples_leaf要求每个叶子至少50个样本,这两个是最有效的防过拟合手段,先调它们再考虑别的。ccp_alpha是代价复杂度剪枝,从0开始一点点加,看验证集指标什么时候掉。别一上来就动ccp_alpha,深度和叶子样本数没定下来,调它没有意义。

几个容易忽略的点

  • 类别不平衡:流失用户只占3%,全部预测成不流失也有97%准确率。这种数据要看召回率和AUC,别看准确率,class_weight设为balanced能缓解一部分。
  • 特征重要性:feature_importances_对取值多的连续特征有偏差,最好再用permutation_importance在验证集上复算一遍。
  • 树不稳定:数据抖动一点点,树结构可能完全变样,两次训练出来的规则对不上。要稳定就上随机森林,几十棵树投票。

决策树真正的价值是能解释:从根到叶的一条路径就是一条如果那么规则,业务方看得懂,也方便拿去跟合规部门交代。只追精度的话梯度提升树通常更强,但解释成本高得多,先想清楚要交付的是模型还是规则。