1 树模型何时比线性更合适
预测用户是否流失时,表格里可能有入网月数、月费、合同类型、支付方式和近期使用量。线性模型通常把这些特征的贡献相加:月费每增加相同幅度,分数变化也相同。如果真正的规律是“短期合同且月费较高的用户更容易流失,长期合同用户则不同”,就出现了条件之间的组合。树模型通过连续提问表达这种关系,例如先问合同类型,再在某个分支上问月费是否超过阈值。它很适合从表格数据中发现阈值、分段关系和特征交互。
这里的“树”是预测规则的组织方式。根节点接收样本,内部节点提出条件,分支记录条件结果,叶子给出预测。预测时,样本沿路径到达叶子;分类树可以根据叶子里的训练样本类别比例给出类别概率,回归树则常输出目标值的平均数。路径很容易读懂,但它只是训练数据支持的统计规则,不能直接解释成因果关系。“月费较高”与流失相关,不代表降价就必然能挽留所有用户。
本课用公开的 IBM Telco Customer Churn 表格作为贯穿例子,目标是预测流失标签 Churn。客户编号只用于关联和排查,不作为预测特征。应先检查下载版本的字段说明,确认每列在预测时是否已经存在。这个公开快照适合练习建模流程,但缺少完整的历史事件时间,不能直接证明模型在真实未来月份有效。生产任务需要另行定义预测时点,例如在月初使用此前的信息预测未来 30 天是否流失。
线性模型仍然是有价值的基线。它训练快,常能在经过适当表示的文本上得到可靠结果。树模型不保证胜过它;当信号接近相加关系、样本较少或输入极其稀疏时,更复杂的分裂可能只学到噪声。实践中要让逻辑回归、受约束的单棵树和某种集成树使用相同的数据划分及指标,再比较验证表现。选择依据是对未见样本的效果和部署成本,而不是训练集上的漂亮分数。
对原始图片,直接把每个像素交给普通决策树,通常难以利用位置相邻和物体平移等结构;对短文本,词袋或 TF-IDF 加线性分类器常是值得优先尝试的方案。树可以处理图片或文本提取后的表格特征,但“能够输入”与“适合表达”是不同问题。先判断数据结构,再选择模型家族,可以减少在不合适的输入上反复调深度的时间。

2 分裂、不纯度与深度
训练树可以理解为反复寻找能让类别更集中、子节点更“纯”的问题。假设某个节点有 100 个训练样本,其中 40 个流失、60 个未流失。候选条件“是否为月度合同”把它分成 50 个样本的节点,里面有 35 个流失,以及另 50 个样本的节点,里面有 5 个流失。相较于父节点,分裂后的两侧更容易给出明确判断。这说明条件有区分能力,尚不能说明它在验证集上也成立。
不纯度是对这种混杂程度的量化。分类中常见的基尼不纯度为 1 减去各类别比例平方之和。全部属于同类时为 0;在二分类中,类别各占 50% 时为 0.5。上例父节点为 0.48,分裂后每侧都是 0.21,因此按样本数加权后的不纯度下降 0.27。评价分裂要按子节点大小加权,不能让只有 1 个样本的纯节点掩盖另 99 个样本仍很混杂的事实。
算法会在当前节点比较特征和候选切分点,选择能降低不纯度的条件,再对各分支继续操作。这是一种逐步作出局部选择的过程,通常不保证找到全局最优的整棵树。连续特征可以产生“月费 ≤ 某阈值”的条件;类别特征如何进入模型则取决于实现,有的需要先编码,有的支持原生类别处理。缺失值也必须按照所用实现的规则处理,不要假定所有库都自动理解缺失的含义。
深度限制路径可以追问多少层,叶子数限制最终能形成多少组预测,最小叶子样本数限制每组至少保留多少证据。本课约定根节点深度为 0;最大深度为 3 的二叉树,最多具有 8 个叶子,实际可能更少。深度增加后,模型可以表达更细的交互,也更容易为少量偶然样本建立专门分支。深度、叶子数和最小叶子样本数应一起看,不能把“树越大,理解越充分”当作训练原则。
叶子输出的概率也有局限。某叶子有 8 个样本,其中 6 个流失,训练比例为 0.75;另一个叶子有 800 个样本,其中 600 个流失,也得到 0.75,但证据稳定性不同。叶子很小时,概率可能接近 0 或 1,却只是样本不足。应在未参与训练的数据上检查概率表现,并根据是否需要风险分层、资源排序或阈值决策选择评价方式。概率校准的具体方法留到后续学习,这里先记住:输出 0.75 不等于已经证明长期有 75% 的事件会发生。
3 随机森林与梯度提升的直觉差别
单棵树对训练数据的小变化可能很敏感:靠近根节点的条件换了,后面的路径也会跟着变化。随机森林通过训练多棵有差异的树,再汇总预测来降低这种波动。常见做法是对训练样本有放回抽样,并在分裂时只考察部分特征,让各棵树有机会形成不同规则。分类概率通常由各棵树的概率取平均得到,具体以实现文档为准。
随机森林的关键是成员之间既有预测能力,又不要犯完全相同的错误。如果每棵树都只依赖同一个泄漏字段,平均后仍然会得到失真的高分。增加树的数量主要让汇总结果更稳定,并不自动消除深树的全部问题,还会增加内存占用和推理工作量。森林的单个成员路径可以查看,但不能把其中某棵树的一条路径当作整个森林的完整解释。
梯度提升则按顺序添加树。后加入的树针对当前整体预测尚未处理好的部分继续改进。在回归的平方误差例子中,可以直观理解为学习剩余误差;在分类中,实际优化对象与所选损失有关,不能机械地说成“每次只训练被分错的样本”。每棵新树都对总体分数作出较小修正,学习率控制修正的步幅,迭代次数控制添加多少轮。
这让两类方法形成不同的调参直觉。随机森林侧重通过多样化和汇总获得稳定结果;梯度提升侧重让连续的修正改善损失。提升树常使用较浅的成员树,但成员树浅不代表整个集成模型简单。学习率较小时,往往需要更多轮数才能学到足够信号;轮数过多又可能开始拟合噪声。可以在训练数据之外留出用于停止训练的验证部分,观察性能何时不再改善,测试集始终保留到最终评估。
在中小规模表格任务中,两类集成都值得尝试,但不必先研究复杂的分裂搜索、二阶导数或高性能直方图实现。入门阶段先控制树大小、记录随机种子、统一编码与划分,并比较验证指标及预测延迟。若森林与提升树效果相近,而较简单的方案更容易维护,就有理由选择它。算法名只能提示学习方式,不能替代实验结果。

4 动手:深度与叶子数对验证集的影响
先给流失任务建立明确的实验协议。若使用公开快照做入门练习,可按标签比例分层划分训练集、验证集和测试集,比例为 60%、20%、20%,固定随机种子。若同一客户存在多条记录,必须按客户分组,避免同一个人的近似记录进入不同集合。真实任务若预测未来,应优先按时间划分,让验证和测试发生在训练之后;时间顺序与分组约束不能为了凑齐比例而破坏。
检查字段时,将 customerID 排除,将 Churn 作为标签,入网月数 tenure、月费 MonthlyCharges、合同 Contract 等作为候选输入。TotalCharges 的某些版本可能含有表示空值的字符串,应按字段含义转成数值并标记缺失。数值填补所用的统计量只从训练集计算,类别编码器也只在训练集拟合,再应用于验证和测试。树通常不依赖数值标准化,但这并不免除缺失处理、类型检查和类别编码。
建立受约束的分类树,依次尝试最大深度 2、4、6、8,先固定最小叶子样本数为 30,再在选定深度附近比较 10、30、100。也可以固定深度上限,比较最大叶子数 8、16、32。每次改变少量因素,记录训练及验证的 F1、ROC-AUC、树深度、实际叶子数和预测耗时。这样能区分“模型表达能力不足”与“训练得更细但泛化变差”,不必把所有参数混在一起搜索。
为了理解曲线,可以先看一组示意结果:深度从 2 增加到 4 时,训练 F1 从 0.53 升至 0.66,验证 F1 从 0.51 升至 0.61;继续增加到 8 时,训练 F1 升至 0.86,验证 F1 却降至 0.55。这些数值用于演示,不能当作公开数据集的实测成绩。前半段说明适当增加容量可能有益,后半段提示额外分支可能主要记住了训练样本。
F1 是 precision 与 recall 的调和平均。precision 回答“被预测为流失的人中,有多少真的流失”,recall 回答“实际流失的人中,找回多少”。它们依赖概率阈值;ROC-AUC 衡量跨阈值的排序区分能力,不能说明某个干预容量下的 precision。流失比例较低时还应看 PR 曲线或 PR-AUC,并明确所用计算口径。把所有人预测为未流失可能有较高准确率,却完全无法完成找回流失用户的任务。
先在验证集上确定模型配置与阈值,再锁定方案评估测试集。若训练后要合并训练集和验证集重新拟合,需要把这个步骤预先写入协议,阈值如何迁移也应明确,不能看到测试结果后继续调整。有限样本下,0.01 的指标差异未必稳定;可在训练开发数据内用交叉验证观察波动。测试集只用于最终报告,并不因为换了模型名称就重新变成可调参的数据。

5 特征重要度怎么读、怎么误读
训练树后,工具往往会给出“特征重要度”。常见的不纯度重要度把某特征带来的不纯度下降按节点样本量汇总,再进行归一化。它反映该模型在训练中如何使用特征,适合帮助定位模型依赖,却不是特征的客观价值排名,更不是因果影响排名。月费排名较高,只能说明模型利用了与月费有关的分裂,不能直接推出“把月费降低 10 元,流失率就下降某个比例”。
有较多候选切分点的数值特征,以及高基数类别经过某些编码形成的特征,可能更容易在训练中找到偶然有效的分裂,因此不纯度重要度可能偏向它们。客户编号看起来取值丰富,甚至可以帮助树记住样本;重要度很高反而应促使人检查特征可用性和泛化表现。类别经过独热编码后,还要说明图中的重要度对应原始字段还是某个类别列,否则读者可能把同一字段拆散后的排名误解为多个独立信号。
置换重要度提供了另一个观察角度:保持已经训练好的模型不变,在验证集上打乱某列,再看指定指标下降多少。例如打乱合同类型后,验证 ROC-AUC 从 0.84 下降到 0.77,可说在这套数据和这个模型中,打乱该列明显损害了排序能力。应重复置换并报告波动;若出现轻微负重要度,可能是随机误差、模型利用噪声,或该特征在当前数据上确实有害,不能只看单次结果下结论。
相关特征会让解释更加复杂。入网月数与累计费用可能包含重叠信息,打乱其中某列后,模型仍能借助另一个信号,因此单列下降不大并不表示它毫无价值。反过来,单独置换可能制造现实中罕见的组合,让结果偏离实际使用情境。可以结合字段含义比较成组移除后的表现,但移除后重新训练回答的是另一个问题。阅读报告时,要区分“固定模型依赖什么”与“重训后是否仍需要它”。
最好把重要度、错误样本与分组指标并列阅读。模型是否只在某种合同用户上有效?高月费组的 recall 是否明显偏低?缺失值较多的样本是否出现异常高风险?解释应帮助提出可检验的问题,然后回到独立数据验证。单个样本为何被预测为流失,也不能只靠全局排名回答;可以先读单棵树的实际路径,集成模型的局部解释方法则留到后续。全局重要度负责描述整体依赖,不负责保证每个预测都可靠。

6 常见坑:类别泄漏、高基数类别、默认深度过大
类别泄漏常发生在把目标信息变成类别特征时。假设有人按合同类型计算流失率,再把这个流失率填回每行;如果统计使用了验证集和测试集的标签,验证样本就间接带着答案进入模型。即使只在训练集计算,某些小类别的均值也可能几乎暴露该训练样本的标签。入门实验可优先采用独热编码,并设置未知类别处理;涉及目标编码时,应使用经过正确验证的实现,深入的折内编码原理以后再学。
另一类泄漏来自时间。退订原因、最终离网日期、销户后的工单状态,即使不直接叫“流失标签”,也可能只有结果发生后才产生。把它们放进月初预测模型,得到的是事后识别结果的能力。随机划分无法修复这个问题,因为每个集合都含有来自未来的字段。判断特征是否泄漏,要问“预测发生的那个时刻能否得到这个值”,并追查数据生成与回填时间。
高基数类别指取值很多的类别,例如设备标识、客户编号、极细的地区代码。独热编码可能产生大量稀疏列,整数编码又可能让不具备大小关系的类别被当作有顺序的数值。应先确认该字段是否具有可迁移的意义,再考虑合并低频类别或使用适合的表示。低频判断和合并规则应从训练集确定;上线遇到新类别时,需要明确映射到未知类别还是按其他约定处理,并监控其比例。
默认参数也不应被当作安全配置。有些实现默认不限制深度,并允许很小的叶子,使训练树轻易接近记忆训练集。应显式设置容量约束,再根据验证表现放宽。类不平衡时,可以在训练中尝试类别权重或重采样,但重采样只能作用于训练部分,不能先复制少数类样本再随机划分,否则复制记录可能跨集合出现。权重也不会自动选出合适阈值,仍须检查 precision 与 recall 的实际权衡。
分布变化是另一个常见失效源。训练时月费范围、合同结构、用户来源和缺失模式,与上线后都可能不同。树的阈值不会因为输入超出熟悉范围就自动学会外推;新政策或新套餐也可能改变特征与流失之间的关系。上线前要检查时间外数据和重要分组,上线后记录输入分布及成熟标签下的指标。只看到特征分布变了还不能断言模型已经失效,但它足以触发进一步评估。
7 案例:树上的漂亮重要度来自泄漏列
某团队建立流失模型时,将业务宽表中的 closure_reason 一并加入输入。这是本课构造的案例字段,并非要求公开 Telco 数据集中存在该列。宽表在每天夜间更新:已流失客户通常填写退订原因,仍在使用的客户大多为空。训练脚本只检查了字段类型和缺失比例,没有检查字段生成时间。随机划分后,模型在验证集取得了异常好的成绩,重要度图上 closure_reason 遥遥领先。
初看解释似乎很合理:“退订原因能解释用户为什么离开。”但任务是提前预测未来 30 天的流失,退订原因在月初尚未产生。模型实际上利用了“是否已经完成退订记录”的线索。即使把空值替换为“未知”,泄漏仍然存在,因为缺失与否本身就携带结果信息。问题也不会因模型从单棵树改成随机森林而消失,多棵树只是更稳定地利用了同样的错误线索。
排查时先读取数据字典,确认字段创建、修改和回填规则,再抽查若干客户的事件时间线。随后从候选特征中移除 closure_reason 及其派生列,在相同开发划分下重新训练。示意中,验证 ROC-AUC 从 0.98 降至 0.82,F1 从 0.91 降至 0.59;这些数字表示案例现象,不是可复现的测评结论。下降说明原来的高分依赖可疑信号,仍需继续检查其他字段,不能把剩下的分数立即当成真实上线能力。
接着按历史预测时点重建特征快照,保证每个值在当时已经可用,使用后续月份作验证与测试。如果原始系统只保存最新状态,无法还原历史快照,就应承认当前数据不足以完成时间外验证,补采数据后再评估。不能把“删除明显泄漏列”当作对所有历史字段已经通过时间检查的证明。对延迟回填的数据,还要考虑事件发生时间与系统可见时间的差别。
修复后的报告应保留字段清单、可用时间依据、划分方法、模型版本、阈值和指标变化。它展示的是证据怎样改变了判断:原本以为模型识别了高风险用户,后来发现它识别的是事后状态。团队此时也应回查训练流水线,加入禁止字段及可用时间校验,避免下一版宽表再次把未来信息带进来。重要度图的价值在于暴露模型依赖并推动检查,不能单独充当模型已可解释、可上线的凭证。

8 把树模型约束写进上线门禁
上线门禁是明确的通过条件:哪些数据、模型和运行证据满足后,才允许进入后续发布步骤。对树模型,先固定输入契约,包括字段类型、单位、缺失处理、类别集合与未知类别策略。每个字段应附预测时点是否可用的依据;客户编号等关联字段应与模型输入分开。训练和线上处理需要使用同一份已拟合的转换规则,不能线上再按当天请求重新计算填补均值或类别编码。
性能门禁应与实际决策对应。假设每期只能联系风险最高的 500 位客户,应报告该容量下的 precision、recall 和覆盖情况,而不是仅报告默认阈值 0.5 的 F1。ROC-AUC 可作为排序质量的补充,但不能替代容量下的业务指标。收益还取决于干预是否有效,流失预测本身无法证明联系用户就能减少流失;需要效果实验时,应另行设计,避免把预测准确误写成干预收益。
容量约束也应进入模型配置与检查记录。对于单棵树,记录最大深度、最大叶子数和最小叶子样本数;对于森林或提升树,再记录树的数量、学习率等适用参数。除了整体指标,还要检查关键用户组、未知类别、缺失输入及常见异常值下的行为,使用接近真实请求的数据测量延迟和内存。训练分数上升不能抵消验证退化,也不能抵消预测耗时超出产品允许范围。
上线后需要安排观测与回退。输入监控关注缺失率、未知类别率、关键数值分布和预测分数分布;效果监控等待未来 30 天的标签成熟后,再计算 precision、recall、F1 等指标。标签尚未到齐时,不能把暂时没有流失记录视为真正的负类。对超出门槛的变化,应指定负责人、复核窗口和回退版本,必要时暂停自动决策。门槛应依据历史波动和任务成本制定,不能从别的任务复制一组数字。
这些要求不意味着入门项目必须搭建复杂平台。用版本化的特征清单、训练配置、评估报告和简明检查表,就能先建立可追溯的流程。关键是区分哪些检查已经通过、哪些只在公开快照上演示过,以及还缺哪些真实场景证据。让约束能够被执行,比在报告末尾笼统写“注意过拟合和数据泄漏”更有帮助。
9 其他经典模型何时上场(A13)
学完树模型后,不应把所有任务都改写成树的调参问题。对公开 SMS Spam Collection 一类短文本分类数据,可以将文本转换成 TF-IDF 特征,再比较朴素贝叶斯或线性分类器。这里往往存在大量稀疏词特征,线性方法能直接组合很多弱线索。划分时要检查重复或近似重复短信,避免同一模板同时进入训练和测试;评价时把垃圾短信视为正类,分别看误拦正常短信的 precision 和漏掉垃圾短信的 recall。
对手写数字等图像任务,像素之间有空间关系。用树做小规模基线可以帮助理解输入表示的影响,但若目标是更好的图像识别能力,就应考虑适合图像结构的表示和模型。经典方法中的近邻法可以根据特征距离寻找相似样本,支持向量机也常用于合适表示下的分类;它们的效果依赖距离、尺度与特征表示,不能只凭算法名称判断适用性。A13 将进一步讨论这些经典模型的选择依据。
表格任务也有切换模型的理由。如果受约束的树总是形成不稳定的小分支,而逻辑回归在多个划分上表现相近且更稳定,可以采用线性基线。如果样本较少、类别边界与距离关系明显,可以比较其他经典方法;如果训练耗时或推理内存成为限制,也应把资源指标放进选择过程。所有比较应尽量共用划分和评价口径,同时允许各模型使用适合自身、且不泄漏信息的预处理。
继续学习前,可用 3 个问题检验自己的判断:验证 F1 下降而训练 F1 上升时,能否说明为什么应收紧树的容量?重要度最高的字段只有结果发生后才产生时,能否说明为什么随机划分无法挽救评估?ROC-AUC 较高但只能联系少量用户时,能否说明还缺什么阈值或容量证据?能把这些问题回答清楚,就已经掌握了使用树模型比背诵算法名称更关键的基础。
放进方案里
本方案以未来 30 天客户流失预测为目标,使用预测时点以前可获得的合同类型、入网月数、月费和历史使用量等表格特征。公开 Telco 快照用于流程演示;正式评估需要具有时间记录的历史快照。客户编号用于关联,退订原因、销户日期及事后回填状态不得进入模型。特征清单记录来源、单位、缺失含义与最早可见时间,编码和填补规则仅在训练数据上拟合并随模型保存。
开发阶段比较逻辑回归、受约束的分类树与随机森林。快照练习采用按标签分层的 60%、20%、20% 划分;真实数据按时间及客户分组约束划分,固定测试集。通过验证集比较深度、叶子数和最小叶子样本数,结合 F1、ROC-AUC 与 PR 表现选择配置。根据每期可联系人数确定决策阈值或排序容量,报告对应的 precision 和 recall,并检查主要合同类型及新用户群体的效果。
发布前冻结特征、转换规则、模型配置与阈值,完成独立测试、字段时间审查、缺失及未知类别检查、延迟与内存测量。重要度采用训练依赖分析配合验证集置换结果,异常高排名字段必须追查产生时间。报告保存模型版本、数据范围、评估口径及限制,公开快照成绩不得直接写成未来上线收益。
运行期间监控缺失率、未知类别率、输入分布和风险分数变化,待 30 天结果及约定回填窗口结束后评估真实效果。阈值、复核责任人与回退版本在发布前确定;出现输入契约失配或成熟标签指标持续低于门槛时,触发复核并按约定回退。若缺少可用历史快照,应先补齐数据和时间外验证,再决定是否进入自动决策。
10 小结:下一步其他经典模型(A13)
树用条件分裂表达阈值与交互;深度、叶子数和叶子样本量共同控制复杂度。随机森林通过多棵不同的树汇总预测,梯度提升通过连续添加树修正当前模型。它们都需要独立验证,也都可能被泄漏字段和分布变化误导。
下一步进入 A13,比较朴素贝叶斯、近邻法、支持向量机等经典方法。继续沿用本课的评估习惯:先明确输入与预测时点,再固定划分和指标,让模型选择建立在可复查的证据上。