决策树与集成学习:预测模型的非参数革命
前面三讲我们一直在经典的统计范式里打转线性回归假设了线性关系ARIMA假设了线性时间依赖。这些假设在某些场景下是合理的简化但在更多真实问题中特征与目标之间的关系充满了非线性、交互作用和分段模式。今天这一讲我们进入机器学习的标志性方法——决策树及其集成模型。这可以说是预测建模领域的一次非参数革命它把我们从预设函数形式的束缚中解放出来让数据自己说话。我们先从单棵决策树讲起理解它的核心机理和致命弱点然后一步步走到随机森林和梯度提升看看集成学习是如何把这些“弱学习器”拧成一股绳的。一、决策树的直觉分而治之决策树的思维方式极其贴近人类的日常推理。你判断今天要不要穿厚外套脑子里可能走过这么一串逻辑今天的最高温度低于10度吗如果是穿厚外套。如果不是那风力大于5级吗如果是也穿上。否则如果出太阳了就不穿厚外套。这一连串的“如果-那么”条件判断就是一棵决策树的推理过程。在预测建模中决策树的生长过程就是不断地对样本空间进行划分。每次划分选择一个特征和一个切分点把当前节点上的样本分成两组使得目标变量在这两组中的“纯度”尽可能提高。对于回归问题纯度可以用均方误差的下降来衡量对于分类问题则可以是基尼系数或信息熵的减少。这个划分过程递归地进行直到满足停止条件——比如节点上的样本数太少或者树的深度达到了预设上限。这种建模方式有几个天然的优势。第一它不需要对特征和目标之间的关系做任何函数形式的假设树可以自然地拟合非线性和阶梯状的函数。第二它对特征的尺度不敏感你不需要做标准化或归一化因为划分只关心相对顺序。第三生成出来的模型可以画成直观的树状图完全可解释你可以拿着树图跟业务方逐条讨论逻辑是否合理。然而单棵决策树的短板同样突出。最大的问题是极高的方差。数据的微小扰动可能导致树的拓扑结构发生巨大变化今天用这个数据集训练出来的树明天换一批样本可能长得完全不一样。这种不稳定意味着过拟合风险极高如果不加约束地生长树可以完美记住训练数据的每一个细节但在新数据上表现一塌糊涂。二、剪枝与正则化约束树的野性控制决策树过拟合的方法主要有两种预剪枝和后剪枝。预剪枝是在树的生长过程中就加以限制比如设定最大深度、节点分裂所需的最小样本数、叶节点的最小样本数等。一旦达到这些阈值即使继续分裂还能提升纯度也必须停止。这就像给树苗套上一个框架强制它不能长得太大。后剪枝则是先让树充分生长然后再从底向上检查把那些对验证集性能没有贡献的分支剪掉用叶节点替代。在实际应用中预剪枝更常用因为它计算量小并且可以方便地融入交叉验证来调参。我通常的做法是先让树深度大一些然后用网格搜索在验证集上找最优的剪枝参数组合。但无论如何优化单棵决策树的预测能力上限始终不高它更像是一个思维简洁但不甚精准的“弱学习器”。三、随机森林用民主对抗过拟合集成学习的核心思想说起来并不复杂多个弱学习器组合在一起可以形成一个强学习器。随机森林是集成学习中袋装法的代表作它的策略可以用“民主投票”来类比。面对同一个预测问题我们不只训练一棵树而是训练成百上千棵。每一棵树在训练时使用的样本是通过有放回抽样从原始训练集中随机抽取的而且每次分裂时不是从所有特征中选最优而是从一个随机子集中选最优。这两个随机性的引入使得森林中的每棵树都有所不同。当需要对一个新样本进行预测时让森林中所有树各自给出预测值对于回归问题取平均值对于分类问题取多数票。这个看似简单的操作被数学证明可以大幅降低方差同时基本不增加偏差。每棵树都是高方差低偏差的模型但当成百上千棵不完全相关的树结果平均之后方差被有效地平均掉了。随机森林有很多让人喜爱的地方。它几乎不需要精细调参默认参数通常就能给出相当不错的结果。树的数量当然是越多越好但边际收益递减一般几百棵就够了。随机特征子集的大小是一个关键的调参参数对于回归问题通常设为总特征数的三分之一分类问题设为特征数的平方根。此外随机森林天然能够输出特征重要性排序通过统计每个特征在所有树的分裂中带来的纯度提升总和我们可以知道哪些特征对预测的贡献最大。这个副产品在实际项目中经常比预测本身还受业务方的欢迎。但是随机森林也并非万能。它的预测能力在遇到极其复杂的非线性交互时可能比不上我们后面要讲的梯度提升模型。另外当数据量非常巨大时训练成百上千棵树的时间和内存消耗也是不得不考虑的现实问题。四、梯度提升从错误中持续学习如果说随机森林是让一群树并行工作然后投票那么梯度提升则是一种串行的、持续改进的哲学。它的核心思路是先训练一个非常简单的基学习器通常是一棵很浅的决策树对目标做一个初步的预测。然后计算这个预测的残差也就是真实值减去当前模型的预测值。接下来训练第二棵树但这次的目标不再是原始目标而是前一轮的残差。第二棵树试图去拟合那些第一棵树没搞定、被剩下来的部分。然后把这两棵树的预测加起来得到新的模型。再计算残差训练第三棵树去拟合如此反复迭代。每一轮迭代模型都在沿着损失函数梯度的方向迈出一小步试图不断缩减残差。这个过程就像一位雕塑家先在石头上凿出大致的轮廓然后一点点修正细节每一刀都针对当前作品的不足之处。梯度提升的这个“梯度”二字正是指向损失函数梯度的方向。梯度提升家族中最著名的具体实现之一就是XGBoost我们下一讲会专门展开讲解。除此之外LightGBM和CatBoost也都是极其优秀的实现它们在训练速度和处理大规模特征方面做了各自的优化。梯度提升方法常年霸占各类结构化数据预测竞赛的排行榜足见其强大的表达力。与随机森林相比梯度提升更容易过拟合因为它串行地、贪婪地去拟合残差。因此使用梯度提升时需要更加谨慎地控制迭代轮数、学习率和树的复杂度。学习率是一个小于1的正数乘以每一棵新树的贡献再加入到模型中使得每步只走一小步。较小的学习率通常需要更多的树来补偿但泛化能力更好。实际调参时通常先固定一个较小的学习率然后通过交叉验证来确定最优的迭代轮数。五、特征工程的转变树模型特别是集成树模型彻底改变了我们做特征工程的方式。在传统的线性模型中我们需要费尽心思地构造交互项或者对变量做非线性变换比如取对数、平方根来帮助模型捕捉非线性关系。但树模型天然就可以处理这些。如果你相信某个特征与目标之间存在U型关系你不需要去人为创建平方项树模型自己可以通过一系列分段切分来逼近这个U型曲线。交互效应也是一样树的不同分支自动构成了高阶交互的逻辑条件。但这并不意味着特征工程在树模型时代不重要了只是重心发生了转移。业务知识的注入方式变了。以前我们通过精巧的函数变换来注入知识现在我们更多通过构造有实际含义的衍生特征比如比率、差值、时间间隔等把业务逻辑直接数据化。对于一个销售预测问题我们不是让模型自己从原始数据里硬学“周末效应”而是直接给它一个“是否周末”的布尔特征让模型更轻松、更稳健地捕捉到这一点。这样做的另一个好处是特征重要性的解读也会更加清晰因为每一个特征都具有明确的业务含义。六、从预测到解释的折返树模型集成之后单棵树的可解释性丧失殆尽。你不能再画出一张巨大的森林图来向别人解释为什么这个样本的预测值是这么多。但是特征重要性分析和部分依赖图等工具弥补了一部分损失。部分依赖图可以展示某一个特征如何影响预测输出边际平均掉其他特征的影响。SHAP值是近年来更为强大的解释工具它基于博弈论中的Shapley值公平地在各个特征之间分配预测贡献。在需要强解释性的场景中比如信贷审批、医疗预测这些解释工具已经从“加分项”变成了“必选项”。我想强调的是预测与解释之间的张力将持续存在。越是强力的预测模型内部结构越复杂越难以直观理解。作为建模者你需要在项目初始就跟需求方明确我们究竟更需要准确的预测还是更需要清晰的因果解释这个优先级会直接影响你后续的模型选型。当然在很多情况下最理想的状态是用可解释的简单模型作为基线用复杂模型追求更高的预测精度同时用解释工具来验证复杂模型的行为是否合理这样在预测力和可信度之间取得一个实用主义的平衡。决策树和集成学习给了我们一套全新的思维工具。它们让我们从对数据生成机制的严格假定中解放出来用一种更加灵活的、数据驱动的方式去逼近隐藏在背后的函数。但就像所有的工具一样它们的威力有多大取决于使用者的手艺有多精。下一讲我们将深入XGBoost的细节把这个竞赛神器掰开了揉碎了看看它到底比普通的梯度提升高明在什么地方。