10.2 决策树与集成模型:规则、区域与稳定性
逻辑回归用一个分数方程描述整个特征空间。这种全局几何简洁而且常常很强,但运营规则可能包含突变和交互:下雨只对长距离路线影响明显,排队长度对不同车辆又有不同作用。决策树(decision tree)会学习嵌套的 if/then 规则,把特征空间分成局部区域。
本节继续沿用延迟订单契约、正类定义、开发折和封存测试集。模型越灵活,越不能放松评估边界。
把树看成递归空间切分
在一个节点中,分类树会考察 distance_km <= 5.2 这样的候选切分。每次切分把样本送往左侧或右侧。树会贪心地选择最能降低类别不纯度(impurity)的特征与阈值。若一个节点中各类别比例为 ,常见准则包括基尼不纯度(Gini impurity):
以及熵(entropy):
节点由单一类别主导时,两者都会变小。它们是寻找切分的目标,不是部署指标。某次切分即使降低 Gini,也可能增加最终业务成本,因此模型选择仍要依赖与预测契约一致的留出指标。
递归切分在二维数值空间中形成与坐标轴平行的矩形区域。落入同一终端区域,也就是叶节点(leaf)的订单会共享预测。普通分类树的叶概率来自该叶训练样本的加权类别比例。一个叶里 10 笔订单有 9 笔延迟,就会报告约 0.9;但它远不如“1,000 笔中有 900 笔”得到的 0.9 稳定。
树的容量由一组相互关联的参数控制:
max_depth限制一条路径最多连续询问多少个问题。
min_samples_leaf防止形成样本极少的终端组。
min_samples_split控制节点是否允许继续分支。
ccp_alpha可以通过代价复杂度剪枝移除分支。
实验会把规则几何与训练—验证曲线联动起来。增加深度时,橙色区域不断增多,训练分数继续上升,验证分数却可能趋平甚至回落。再增大最小叶样本数,一些狭窄区域会消失,原本不稳定的极端概率也会被合并。
from sklearn.tree import DecisionTreeClassifier
tree = Pipeline([
("preprocess", tree_preprocess),
("model", DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=20,
random_state=42,
)),
])树通常不需要 StandardScaler,因为单调缩放不会改变样本的切分顺序。但填补与类别处理仍然必须防止泄漏。scikit-learn 的标准决策树实现不能直接理解原始类别语义,所以无序类别一般仍需采用受支持的编码;转换器必须留在 Pipeline 中,并只从各训练折学习类别词表。
一幅巨大的树图看起来很有说服力,却可能泛化得很差。plot_tree 只能解释已经锁定的候选模型,不能证明它有效。还要检查概率分区图、验证容量曲线、叶样本量、业务切片和折间稳定性。
组合多棵树,同时看清容量怎样增长
单棵深树很不稳定:数据稍有变化,靠近根部的切分就可能改变,所有后代规则随之重写。集成模型(ensemble)会组合多个学习器。两个重要家族用不同方式解决不稳定性。
随机森林(random forest)会训练足够独立的多棵树,再取平均。每棵树使用 Bootstrap 样本,每个切分只考察随机特征子集,使不同树的错误不完全相关。当每棵树都含有信号、又不会犯完全相同的错误时,平均类别概率可以降低方差。
对于 棵树:
增加树的数量通常是让平均更稳定,并不会无限扩张函数类别。min_samples_leaf、max_depth 与 max_features 仍控制成员树。袋外(out-of-bag)估计可以作为 Bootstrap 森林的额外训练诊断,但不能取代模拟部署的数据划分或最终测试集。
梯度提升(gradient boosting)是顺序过程。先加入一棵浅树,后续树继续沿着能够降低当前损失的方向修正。分类任务中,各阶段更新分数,再把分数转换为概率。学习率与阶段数互相制约:学习率更小时,往往需要更多阶段。
from sklearn.ensemble import HistGradientBoostingClassifier, RandomForestClassifier
forest = RandomForestClassifier(
n_estimators=300,
min_samples_leaf=8,
max_features="sqrt",
n_jobs=-1,
random_state=42,
)
boosting = HistGradientBoostingClassifier(
max_iter=180,
learning_rate=0.06,
max_leaf_nodes=15,
random_state=42,
)集成实验会把差别画出来。在森林模式中,细线代表并行训练的成员树,粗线是概率平均;重新抽样会明显改变单条细线,但平均线变化较小。在提升模式中,每个阶段都修改之前的结果;阶段过多时,模型仍可能在验证表现停止改善后继续适应噪声。
单树、随机森林、提升模型、逻辑回归和 Dummy 基线必须使用完全相同的折比较,而且要报告折分布而不只是均值。平均精确率(average precision)与 ROC AUC 检查排序,对数损失检查概率质量,阈值指标检查具体行动。一个模型可能赢得其中一项,却输掉另一项。
特征重要性也要谨慎解释。基于节点不纯度的树重要性可能偏爱拥有更多切分机会的特征,并在相关变量之间奇怪地分配贡献。留出数据上的置换重要性(permutation importance)更直接地询问“打乱一列后分数下降多少”,但仍然不能证明因果关系。任何解释都必须遵守特征可用性与依赖结构。
决策树把概率模型变成了可见区域,集成模型又展示了组合方式怎样改变稳定性。下一节会固定一个行动阈值,逐一统计哪些预测正确、哪些错误,再把这些计数转换为分类指标。