做金融风控的人,几乎都绕不过一个问题:给定一个申请人的一堆资料,到底怎么判断ta未来会不会按时还钱。过去大家靠评分卡、靠审批老师的经验,后来有了逻辑回归,再后来随机森林、XGBoost成了比赛标配。但有一类模型,它看起来"太传统"了,却在我实际做的贷款偿还预测项目里反复救场——那就是决策树。
这篇文章不打算讲那种"从零开始推导信息增益"的教科书内容,而是想聊聊我实际构建贷款偿还预测模型时的完整思路:为什么在深度学习这么热的背景下,我反而更愿意先看决策树能给出什么;数据怎么准备才不会让模型"学歪";单棵树的坑在哪,以及最后怎么用集成方式把它变成真正能上线的东西。如果你正在做信贷风控、用户违约预测,或者想弄明白决策树在真实金融数据里到底几斤几两,这篇应该对你有用。
1. 业务侧先理清楚:贷款偿还预测到底在预测什么
很多初学者拿到数据集就直接开始跑模型,这是大忌。贷款偿还预测从业务角度看,不是一个简单的"二分类"问题,它背后牵涉到资金成本、风险偏好、监管合规一堆东西。你得先搞清楚,模型输出的结果会被谁用、怎么用。
1.1 从"会不会违约"到"能承受多大损失"
在银行或者持牌信贷机构里,贷款偿还预测模型的核心输出通常是违约概率(PD),但PD不是终点。同一个0.3的违约概率,对不同的产品意义完全不同。我做过一个消费分期项目和一个小微企业贷项目,前者单笔几千块,后者动辄几十万,同样的模型精度,业务方对误判的容忍度天差地别。
这就是为什么在建模之前,我会花大量时间和业务方对齐"好客户"和"坏客户"的定义。逾期30天算坏?还是逾期90天算坏?有没有宽限期?这些不是拍脑袋定的。通常需要结合资金成本、催收回收率来算一个"平衡点"。现实中很多机构的定义是逾期天数大于等于M3(逾期90天以上)且之后一直未还清,才标记为违约样本。用这个定义训练出来的模型,和用"逾期1天就算坏"训练出来的模型,完全是两种东西。
我自己的习惯是拿到数据后,先不看任何算法,而是先做三件事:看样本时间窗口、看标签定义、看特征覆盖度。样本时间窗口尤其重要——信贷数据穿越周期,你拿2018年的数据训练,在2020年之后的经济环境下使用,效果一定会打折。这个在后面特征工程部分还会展开讲。
1.2 非平衡数据是常态,不是意外
信贷场景里"好客户"永远远多于"坏客户",坏账率能做到2%-5%已经算不错了。这意味着你拿到的原始数据集里,正负样本比例可能悬殊到100:1甚至更高。
这对决策树的影响是直接且明显的。决策树做分裂时用的是基尼系数或信息增益这类指标,如果负样本占比极低,树很容易学出一个"全都预测为好客户"的模型。没错,准确率能到97%,但毫无用处。
处理非平衡问题的常规思路无非是过采样、欠采样、调样本权重。我都试过,说说真实感受:
- 欠采样(把好样本抽到和坏样本一样多):训练速度快,但损失了大量好样本信息,模型方差变大,不太稳定。
- 过采样(复制坏样本或做SMOTE合成):坏样本的"多样性"没增加,容易过拟合到少数样本上。SMOTE在表格数据上尚可,但在高维稀疏特征上容易产生无意义的插值样本。
- 调样本权重(在损失函数里加大坏样本的惩罚系数):这个最直接,尤其在集成树里,效果往往比前面两种都好,因为树模型本身对权重敏感,且不需要改变数据分布。
另外还有一个笨但很有效的办法:不降采样,靠调阈值。模型训练时保持原始分布,预测出来的概率本身会偏向好客户,但没关系,我们最终不是拿0.5做阈值,而是根据业务能承受的坏账率去倒推最佳阈值。这正是后面要讲的"概率校准与阈值选择"的核心思路。
2. 从"深度学习视角"看决策树:它凭什么依然能打
标题里带"深度学习视角",我得先把这个讲清楚。我见过太多人一听到深度学习就觉得是神经网络、是transformer,然后疑惑:决策树跟深度学习有什么关系?其实换个角度看,决策树和深层神经网络在处理"特征交互"这件事上,思路有共通之处。
2.1 决策树的"特征学习"和神经网络的隐层在逻辑上是相通的
神经网络通过一层层非线性变换,把原始特征映射到更高阶的表示空间。决策树呢?每一次分裂其实就是在做一次条件判断,把样本空间不断划分成更纯的子区域。当树足够深时,一条从根到叶子的路径,本质上就是若干个特征的布尔组合——这其实就是在自动构造高阶交互特征。
举个例子,单一特征"月收入"可能对违约预测区分度不高,但"月收入低于5000且贷款金额超过月收入10倍且历史逾期次数大于2"这条路径,就是一个强交互特征。决策树不需要你手动把这三维组合出来,它会自己在分裂的过程中找出来。这跟深度学习自动学习特征表示,是同一个思想的不同实现路径。
这也是为什么在信贷这种表格数据为主的场景里,深度学习未必有绝对优势。神经网络擅长处理图像、语音这种具有空间或时间局部相关性的数据,而信贷数据大多是稠密的、离散的数值和类别特征,特征之间没有天然的"局部性",决策树基于分裂的特征选择方式反而更契合。
2.2 可解释性在金融场景里是不可妥协的硬指标
在信贷场景里,模型给出一个"拒贷"结果,如果客户投诉到监管那里,机构是需要能够说清楚"为什么拒绝"的。神经网络给出的往往是"特征重要性"这种全局解释,到了单个样本上,很难给出清晰的决策路径。
决策树——尤其是单棵浅树——天然具备一条可读的规则链。哪怕最后我们用随机森林或梯度提升树上线,依然可以通过SHAP值或者树结构拆分出每一个预测因子的边际贡献。我做过一个贷后管理项目,业务方明确要求模型必须能回溯到"是哪几个变量触发了高风险预警",这种情况下决策树家族模型的落地阻力远小于神经网络。
还有一点很多人容易忽略:决策树对缺失值具有天然的容忍度。很多树模型在分裂时会自动把缺失样本分配到增益最大的方向,这在业务数据里几乎是救命稻草。信贷数据里的缺失太常见了——申请人没填的字段、无效的联系方式、部分征信字段未授权——你在预处理阶段不用为了喂给神经网络而强行插补一堆可能引入噪声的数据。
2.3 训练成本和部署成本不在同一个量级
这一点是我在实际项目里体会最深的。一个几百万样本、上百个特征的信贷数据集,在普通单机上用XGBoost训练,几十分钟就能出一版效果不错的模型。而同等数据量下去训练一个多层神经网络,没有GPU的话几乎不可行,而且调参周期会拉长很多。
部署更是天壤之别。树模型本质是一堆if-else规则的组合,可以轻松导出为原生的预测函数,甚至嵌入到移动端。神经网络要跑推理,要么拉一个推理服务,要么做量化压缩,运维成本不在一个量级。
所以我一直的观点是:深度学习视角不是"用深度学习替代决策树",而是"用深度学习的思维——自动特征学习、层级抽象、端到端优化——去理解决策树为什么有效,以及怎么把它做得更好"。
3. 特征工程才是拉开差距的地方
很多人以为建模的核心是调参,其实不是。在信贷场景里,决定模型上限的往往是特征。我见过同样一套决策树代码,有人AUC做到0.85,有人只能做到0.72,差别几乎全在特征上。
3.1 数据清洗的细节会直接影响树的纯度
先说说最基础但最关键的数据清洗。信贷数据里有几类经典问题必须在进模型之前处理掉:
- 身份证号、手机号这类标识字段:不能直接进模型。可以衍生出"年龄""所在地区""手机号是否实名登记",甚至"手机号在网时长"这种强特征,但原始字符串进模型只会增加噪声。
- 收入字段:异常值和极端值非常普遍。有人月收入填100万,有人填0。决策树对异常值不算特别敏感(因为分裂点会选择让子集最纯的值),但如果异常值干扰了整体分布,还是建议做截断处理,比如取1%和99%分位数做winsorize。
- 金额类字段的分布偏移:借款金额、授信额度这类字段通常右偏严重,直接进树模型并不影响分裂效果,但如果你想用特征重要性去做业务解读,右偏变量可能会主导分裂,掩盖了一些小变量其实更稳定的预测能力。
我的建议是,在清洗阶段保留一份原始数据,在业务特征上做各种衍生,同时把衍生变量分成几个组:收入偿债能力组、历史信贷行为组、社交稳定性组、多头借贷组。分组的好处是后面做特征筛选和模型解释时,你知道每个变量的业务含义。
3.2 强特征往往藏在"复合变量"里
实际项目里让我印象最深的一个特征是这样造出来的:"申请人近6个月平均月还款额 / 月收入"。单一来看,月还款额和月收入都有预测力,但它们的比值——债务收入比(DTI)——才是真正决定一个人还款能力的核心指标。决策树其实自己也能分裂出类似的交互,但如果人为把这个比值放进特征集,树在第一步就看到了这个强变量,整个树的深度和复杂度都会下降,泛化能力反而更好。
类似值得构造的维度包括:
- 授信使用率:当前总授信额度里,已用额度占比。这个特征在征信数据中预测力极强,因为在很多机构里,授信使用率持续高企往往意味着资金链紧张。
- 近3个月查询次数:征信被硬查询的次数。查询多说明这个人近期在密集申请信贷,这通常不是好信号。
- 历史最长逾期天数:比"是否逾期"这种二分类字段更能刻画一个人的信用恶化程度。
- 稳定性的代理变量:在同一个城市居住超过2年、工作单位在职时长超过1年,这类变量很难直接拿到,但如果有替代数据(如社保缴纳月数),会非常有用。
这里顺便提一下:这类强特征能不能直接在一次分裂中把数据集切得很纯,很大程度上决定了决策树的效果。如果特征全部是弱变量(比如"性别""星座"这种),决策树的深度会变得很深,而且容易过拟合。
3.3 时间序列特征的"穿越窗口"问题
信贷数据天然带时间属性,处理不当会产生极大的偏差。最常见的问题是:建模时用了"未来的数据"来预测"当下的风险"。
举个例子:你想预测某客户在2021年3月之后的违约概率,但你在特征里用了该客户2021年6月的征信查询次数——这在建模时看起来AUC很高,但实际上是在作弊,因为6月的征信笔数在3月时根本拿不到。
正确的做法是严格设置特征观察窗口和表现窗口。通常我会设定"观察窗口为申请日前12个月、表现窗口为申请日后6个月",即只用申请日前一年的数据做特征,用未来6个月是否违约做标签。这样模型学到的才是"基于已知信息预测未知结果"的能力,而不是巧合。
这类窗口穿越问题,往往是线下AUC高但线上效果崩盘的元凶。甚至业内有个说法叫"特征穿越是信贷模型最大的暗坑",再强的模型也救不回来。
4. 决策树构建全流程:从单棵树到集成模型的实操闭环
前面铺垫了这么多,现在进入正题:实际构建决策树模型时的完整流程。我会把自己实践过的步骤、关键参数的选择逻辑、以及那些容易被忽视的细节都交代清楚。
4.1 单棵决策树:先跑一个"粗糙但完整"的基线
我先说我踩过的坑:以前我倾向于直接上随机森林或XGBoost,结果模型调参调到怀疑人生,都不知道是数据问题还是参数问题。后来学乖了,先跑一棵深度受限的决策树做基线。
这里有一个关键选择——决策树CART的分裂标准:基尼系数(Gini)还是信息熵(Entropy)?实践中两个指标的差别不大,基尼速度更快,信息熵对不纯度更敏感,树会稍微深一点。我的习惯是默认基尼,数据量小的时候试试信息熵看差异。
单棵树的参数控制上,我会重点关注这几个:
- 最大深度(max_depth):先设3-5。太浅拟合不足,太深过拟合。信贷数据里,深度在5-10之间效果一般比较好。
- 叶子节点最少样本数(min_samples_leaf):设一个较大的值,比如100-200。这能防止树在极端样本点(往往就是坏样本)上过度细化。
- 分裂所需最少样本数(min_samples_split):一般设为min_samples_leaf的2-4倍。
先跑这样一棵"浅而稳"的树,看它给出的特征重要性排序是否符合业务直觉。如果模型认为"星座"是最重要特征,那基本可以断定是数据泄露,先回去查特征;如果重要性靠前的是"负债收入比""征信查询次数",说明特征工程方向没问题。这一步其实是把决策树当成了"特征验尸工具",而不是最终模型。
4.2 为什么不直接单棵树上线:方差太大,这是必然的
单棵决策树有个致命弱点:高方差。训练数据稍微变一点,树的形状可能完全改变。我用同一个数据集做了交叉验证,单棵树的AUC波动能到上下5个百分点,这在金融场景下是不可接受的。客户A和客户B,在其他特征完全相同的情况下,仅仅因为训练集里多了一个相似样本,预测结果就可能从"正常"跳成"高危"。
而且单棵树在剪枝后很容易出现"叶子节点样本量太小导致估计不准"的问题。比如某个深层的叶子节点只有50个样本,其中30个是坏客户,模型会给出0.6的违约概率,但这个估计的置信区间极宽,压根不能用。
因此在实际项目中,单棵树基本只作为基线、解释性分析和特征筛选工具。真正上线的是它的改进版:随机森林或梯度提升树。
4.3 随机森林和梯度提升树的选型逻辑
随机森林简单理解就是训练很多棵在数据和特征上随机采样的决策树,然后投票表决。它的核心优势是大幅降低了方差,几乎每个参数都有"越随机越好"的意味。
优点:
- 默认参数在多数情况下效果就不错,不容易过拟合
- 适合并行训练,速度可控
- 特征重要性的计算天然考虑了单棵树的交互效应
不足:
- 对数据的"噪声"不敏感,但也不特别擅长从极难的样本里学到精细边界
- 在数据集很大的时候,模型规模偏大,预测阶段会比单棵树慢不少
梯度提升树(包括XGBoost、LightGBM、CatBoost)走的是另一个路子:每一棵树都在拟合前面所有树的残差。它的优势是能逐步逼近数据的复杂曲面,往往精度比随机森林高,尤其在信贷这种数据有强交互、有非线性关系的场景里,效果普遍更好。
在实际项目里我的做法是这样的:
- 先用随机森林跑一版,看整体AUC、KS等指标,确定天花板大概在什么水平。
- 再用梯度提升树做主力模型,在精度上往极限推。
- 最后把两者做简单的加权融合(Stacking或者简单的平均值)。大多数情况下融合后的AUC会比任何单一模型高0.01-0.02,这在信贷场景里已经是很大的提升。
4.4 梯度提升树的关键超参及其调参次序
很多人调参一上来就grid search一堆参数,我认为这是低效的。分享一下我习惯的调参次序,以及每个参数背后的逻辑:
先说每个参数在梯度提升里究竟干什么:
- n_estimators(树的数量):决定模型复杂度上限。一般来说,树越多,模型越强,但时间成本线性上升,且超过某一点后,边际收益衰减。
- learning_rate(学习率):每一步的步长。学习率越小,每一步走得越谨慎,需要更多树来补偿,但也会让模型更平滑、更不容易过拟合。
- max_depth(最大深度):树的复杂程度。梯度提升的树一般不需要太深,太深很容易快速过拟合。
- subsample(样本采样比例):每次训练一棵树时使用的样本比例。小于1.0可视为一种正则化手段。
- colsample_bytree(特征采样比例):每次训练一棵树时使用的特征比例。这相当于引入随机性,能降低过拟合。
- min_child_weight(叶节点最小样本权重和):用于防止叶节点上样本太少带来的过度学习。
我的调参顺序大致是:
- 先把learning_rate固定在一个不算大的值(比如0.1),同时把n_estimators设一个较大的数,先让模型过拟合,然后用早停(early stopping)找到最佳迭代次数。
- 调max_depth(从小到大,2到8逐级试)。这个参数对最终精度影响很大,值得单独花时间。
- 再调min_child_weight(或者min_samples_leaf),用交叉验证确认是不是明显缓解过拟合。
- 最后微调subsample和colsample_bytree。这个阶段收益往往最小,但能压住最后的过拟合。
调参的核心思路永远是"一次只动一个参数,同时观察训练集和验证集的指标变化"。如果训练集AUC继续涨但验证集AUC不涨,就是在过拟合;如果两边都不动,说明参数在该区域不敏感,可以停止。
下表是常见参数的推荐范围(基于我的经验,不是硬性标准):
| 参数 | 推荐范围 | 作用说明 |
|---|---|---|
| learning_rate | 0.01~0.3 | 越小越平滑,树的数量需相应增加 |
| max_depth | 3~8 | 梯度提升的树不宜过深 |
| min_child_weight | 1~10 | 值越大,模型越保守,防过拟合 |
| subsample | 0.6~1.0 | 每棵树用的样本比例 |
| colsample_bytree | 0.5~0.9 | 每棵树用的特征比例 |
| n_estimators | 早停决定 | 配合学习率和早停策略 |
4.5 早停法:让模型自己告诉你该停在哪
早停法是我认为任何一个实战项目中都必须用到的技能。做法就是预留一个单独的验证集(或交叉验证的其中一折),在每一轮迭代生成新树之后,计算验证集上的目标指标(比如AUC),如果这个指标在一定轮数内不再提升,就停止训练,并回退到最佳迭代时的模型状态。
这里有几个细节要注意:
- 验证集必须和训练集严格分离,而且最好在时间维度上也是"未来"的数据。比如训练集用2020年1-6月的样本,验证集就必须是2020年7月之后的样本。这样选出来的迭代次数才真正反映模型在"未来"的表现,而不是在随机切分下的表现。
- 早停不是绝对保险。如果验证集本身有噪声或者太小,早停可能会提前停止。我会在交叉验证里重复做多次早停,取平均迭代次数作为最终值。
- 在梯度提升库(XGBoost、LightGBM里都有early_stopping_rounds参数)中,这个功能几乎是标配。但要注意,停止后往往还需要用全部数据(包括验证集)再训练少量轮次,因为早停时的最优迭代次数是基于验证集计算的,重新加回验证集样本可以稍微提升效果。
5. 评估与瓶颈:不要只看AUC,信贷模型有它自己的评价语言
模型建完之后,新手爱跑一个准确率或者AUC就收工了。但在信贷场景里,这种做法会被业务方批得很惨。我见过好几个人,线下AUC做到0.88,结果在业务上不知道该拿0.88干什么用。
5.1 从AUC到KS、Lift和业务阈值
AUC反映的是"随机取一个好客户和一个坏客户,模型给出的坏客户风险分数高于好客户的概率"。它是不依赖任何阈值的排序性指标。但在实际审批里,你需要的是"风险分数大于多少分就拒绝"这样一个具体阈值。
KS统计量是风控领域最常用的区分能力指标之一,它本质上是把样本按预测概率从低到高分为若干组,累计好客户占比(真阳性率)与累计坏客户占比(假阳性率)的最大差值。KS越高说明模型区分好坏客户的能力越强。业内常说高于0.3就能用,0.4以上就很好了。我实际项目里,KS在0.35左右,配合其他策略做审批,整体坏账率能控制得不错。
除了KS,还有一个实际应用里非常关键的指标叫Lift(提升度)。Lift衡量的其实是"用模型去圈定高风险人群,和不用模型直接随机圈定,效率提升了多少倍"。这跟决策树模型的目标高度相关:我们希望识别出的坏客户,尽量集中在分数最高的那部分人群里,这样催收和审批干预的资源可以优先分配。
另外,单看"AUC高"并不代表能直接用。我后来常用分位数分桶的方式做风险排序检验:把所有样本按预测违约概率从低到高均分成10组,统计每组实际坏账率。如果模型有效,那么第10组的坏账率应该显著高于第1组,呈现出单调递增或者至少阶梯式上升的模式。如果出现"中间组坏账率反而最高"这种非单调现象,说明模型存在严重的校准或分布偏差。
5.2 决策树模型的概率校准:违约概率不等于比例
前面提到,树模型的输出(叶子节点的类别比例)在这里有个著名的坑:不同叶子节点之间的概率估值范围很窄,而且存在偏差。比如一个深度为10的树,叶子节点上如果分别有500个和20个样本,它们的概率估计精度差异巨大。梯度提升树同样存在这个问题,因为它是通过逐步逼近残差来生成概率的,输出分布往往是扁平的。
如果业务上要用"违约概率"去计算预期损失(比如用于准备金计提、用于额度定价),直接使用模型的输出概率会带来系统性偏差。这时候需要做概率校准(Probability Calibration)。常用做法有:
- Platt Scaling(通过逻辑回归把原始分数映射到0-1区间内):适合数据量大、模型输出平稳的情况。
- Isotonic Regression(保序回归):非参数方法,适合模型输出已经基本正确但存在非线性偏差的情况。
我在项目中的经验是,如果数据量够大(比如几十万以上)且分布稳定,Platt Scaling更稳;如果模型已经比较准,只是局部有偏差,Isotonic Regression效果更好。校准完以后,最好再验证一下"模型预测违约概率为0.1的那组人,实际违约率是否接近10%",这叫做可靠性曲线(Reliability Curve)。决策树模型在这个曲线上的表现往往比神经网络更差,因为树的输出空间是离散的,这也算是一个需要额外处理的坑。
5.3 过拟合的三种信号:训练指标爆表、验证指标下滑、特征重要性漂移
模型训练完,最怕的是"线下好、线上崩"。我把过拟合信号归纳成三类,每类都有对应应对措施:
第一类是训练集指标远远高于验证集,而且这个差距在加大。这说明模型在死记硬背训练数据的噪声,而不是学习规律。应对措施是加正则化(减小学习率增大树数、加大min_child_weight、增大subsample)。
第二类是验证集指标先升后降,在某一轮迭代之后出现明显回落。这种情况几乎可以肯定是迭代次数过多,早停就是在防这个。
第三类是特征重要性在多次交叉验证之间变化剧烈。比如某次AUC最高时最重要的特征是"近7天查询次数",但另一次交叉验证时变成了"负债收入比"。这说明数据的分布不稳定。应对的办法是避免依赖单次特征重要性做结论,而是用多次交叉验证里特征重要性的平均值、出现频次、以及稳定性排名去做筛选。
从更宏观的角度来说,信贷模型对于过拟合的容忍度比别的领域低得多。因为新申请人的分布和训练集的分布往往存在偏差,模型学的越"细致",越容易在分布变化时失效。我把这类现象叫"模型脆化"——看起来精度高,但结构脆弱。树模型的天然正则化特性(max_depth、min_samples_leaf等参数)恰好能帮助缓解这一点。
6. 从单棵决策树到可上线的决策树系统:三层项目经验总结
最后这段我不打算再讲代码和参数了,而是想分享一些这个项目做完之后,我沉淀下来的更偏"工程与团队协作"的经验。因为在国内信贷行业,模型最终是要和业务策略、法律法规、系统部署紧密结合的,纯粹把代码跑通只是整个项目的一半。
6.1 把"模型预测"翻译成"业务策略"的几个关键步骤
模型上线不是说"预测概率>0.5就拒贷"。现实里会出现几种特殊人群:首贷客户(几乎没有历史数据)、学生(收入不稳定)、自雇人士(流水复杂)。对这些人模型预测不一定可靠。业务策略上我习惯采用"分层决策":
- 对于高分段客户:直接通过,甚至可以给到更高的授信额度来提升转化率。
- 对于低分段客户:直接拒绝,因为坏账率已超出风险承受能力。
- 对于中间段的灰名单客户:不直接拒绝,而是转入人工审批或者减少授信额度、增加担保措施。这样既利用了模型的自动化筛选,又保留了人工兜底的能力。
在策略落地时,还需要考虑一个"拒斥性"问题:模型拒绝掉的客户,如果他们未来可能成为好客户呢?所以很多机构会把低分段客户放入"观察名单",过一段时间再重新跑模型。这是业务策略,但模型团队要提前在数据架构里支持这个动作,不能等到上线后再补。
6.2 与业务方沟通模型时的表达技巧
模型团队最大的内耗往往不是技术,而是"说不清模型是怎么工作的"。决策树模型的最大优点是可视化能力强,这也是我坚持先跑单棵树的原因。在汇报时,我会直接展示树的路径:比如"如果近6个月平均月还款额占收入比超过0.5,且征信近3个月查询次数大于5次,那么该客户被划分到风险偏高的一组"。这种说法业务方听得懂,也比摆一堆AUC曲线更能建立信任。
在协作沟通上,我觉得还有一个容易被低估的点:我们做出来的模型必须能够回答"为什么"——为什么拒绝这个客户。目前很多监管口径都要求金融机构具备可解释性。如果模型是纯黑盒,关键决策没有依据,轻则影响客户体验,重则面临合规问题。决策树家族天然就能输出一条规则链,哪怕被组合成随机森林,也可以通过SHAP值给每个特征分配可解释的贡献值。这也是我为什么坚持在信贷建模的项目里,把决策树作为主模型,而不是完全依赖"深度"黑盒模型。
6.3 上线后的监控与迭代:决策树模型维护的实操心得
模型上线不是终点。我经历过上线后第二周就开始掉线的模型,原因很多:合作渠道变了、授信策略调过了、甚至系统里某个上游字段开始传空了。所以监控机制必须在上线前设计好。
我一般会在监控表里长期跟踪几个指标:模型的预测分布(score distribution)、实际坏账率、每个重要特征的缺失率变化、以及”特征穿越"的潜在风险。如果预测分布整体偏移,那多半是客群结构变了,需要做样本外校准。如果重要特征的缺失率突然升高,那也要暂停模型,排查上游数据源是否出了问题。
关于迭代周期:信贷模型不是天天都能迭代的。数据的表现窗口一般需要好几个月甚至半年,所以一场完整的表现期出来之前,只能靠"滚动重训"来维持竞争力。我习惯的做法是每季度重新训练一次模型,并把最近的样本加入训练集,让模型在时间维度上保持"新鲜"。
另外,任何用到决策树的项目,我都建议保存在可复现的状态里:特征版本、参数版本、训练集的时间窗口、随机种子、以及样本筛选规则,全部固化下来。否则三个月后再去看当初的模型,根本调不出同样的结果。
最后再分享一个小技巧:如果你在业务中既想要决策树的可解释性,又想要深度学习的自动特征表达能力,可以尝试在特征层面先用决策树做筛选,再把筛选出来的重要特征拼上神经网络一起训练,或者反过来,用神经网络embedding后的特征再作为树的输入。这两种思路在信贷场景里我都跑过,最后发现,大多数情况下纯树模型配合好的特征工程,就足够跑赢那些复杂的混合结构,因为信贷数据本身的信噪比并没有高到需要那么大模型去"硬学"的程度。别急着上大模型,先把手里的树玩透,很多问题能更轻松地解决。