1. 金融AI落地,最大的错觉是“换个模型就能解决问题”
最近跟金融行业的朋友聊AI落地,常听到一个奇怪的观点:“我们模型不行,所以不良率降不下来。”好像只要换一个更牛的模型,那3%~10%的不良压降就会自己出现在报表上。真到业务复盘时,大家盯着不良率,很少有人会把功劳算在模型头上。反而是一点点抠数据口径、修特征、搭监控、跑A/B测试的团队,最后交出了漂亮的结果。
说句实在话,金融AI这些年真的不缺模型。学术界、开源社区里,Transformer、XGBoost、LightGBM、扩散模型应有尽有,随便一个团队都能拉出一个离线AUC不错的模型。但真正落到信贷审批、反欺诈、贷中管理这些场景,缺的是把模型塞进业务流程里、让它持续产出业务价值的那套体系。模型只是发动机,车辆本身还需要变速箱、传动轴、刹车系统。缺的从来不是模型,而是模型外围的工程与协作能力。
1.1 不良压降3%~10%,这个目标到底意味着什么
先算一笔账。假设一个消费信贷产品在贷余额10亿元,不良率2.5%,那么账面上的不良资产约2500万元。如果通过风控策略把不良率相对压降10%,也就是从2.5%降到2.25%,直接减少的不良资产是250万元。再加上拨备计提减少、催收成本下降、资金占用变少,实际带来的利润影响往往放大到500万元以上。所以“不良压降3%~10%”在业务端是一个非常有吸引力的目标,但它从来不是某一个模型独自能扛下来的。
这个目标可能来自贷前审批策略的优化,多拒绝一批高风险客户;可能来自贷中额度与价格的动态调整,把授信额度向低风险客群倾斜;也可能来自贷后催收的优先排序,把有限的催收资源集中到坏账概率最高的人群身上。更常见的情况是,这几种手段叠加在一起,才凑出了3%~10%的相对压降。从我的经验看,很多项目把“不良压降”当成了“模型性能提升”的代名词,这是最大的认知偏差。模型最多只是策略引擎里的一个零件,如果零件周边的传动轴、仪表盘、刹车系统都没装好,再好的发动机也跑不出速度。
1.2 模型贡献度没你想的那么大
为什么说缺的从来不是模型?因为金融AI是一个强约束场景。可解释性要求、监管报送要求、离线在线一致性要求、样本量限制,每一条都在限制模型“炫技”的空间。经常出现的情况是,算法团队离线测试把AUC从0.82干到0.84,看起来涨了一大截,但上线后业务指标纹丝不动。原因很简单:AUC提升带来的排序改善,如果对应的客群规模很小,或者被额度、定价策略吃掉了,就不会体现在不良率上。
金融风控场景中,我倾向于把项目效果拆成四部分:数据与特征占40%,样本与标签占25%,模型算法占15%,部署监控与策略运营占20%。这个比例不一定精确,但能说明一个事实:模型最多只决定15%的成败。你花三个月去优化模型结构,可能不如花两个星期解决一个特征缺失率问题带来的收益大。这些年我亲眼见过,一个团队把训练集和线上特征对齐、把样本定义理清楚、把PSI监控搭起来,哪怕模型还是原来的XGBoost,不良率都出现了明显改善。所以,与其焦虑模型不够先进,不如先看看模型周围的那些基础设施是不是齐了。
2. 核心细节解析与实操要点:金融AI项目绕不开的五个环节
既然模型不是决胜点,那决胜点在哪儿?我总结出五个关键环节,每个环节都有大量实操细节。任何一个环节出问题,都会直接吃掉不良压降的空间。这一部分的内容可能不如算法论文性感,但都是真金白银的教训。
2.1 样本定义与标签设计是这个行业的地基
金融AI里的“好坏客户”不是拍脑袋定的。标签定义直接决定了模型在学什么。比如逾期30天算坏客户,那么是首逾、当前逾期,还是历史上有过M1?观察期和表现期分别怎么切?表现期太短,坏客户还没充分暴露;表现期太长,样本量又不够,策略迭代也慢。我在信贷项目里最常用的做法是:期限12期的产品,表现期至少设6个月,用放款后90天内是否出现M3逾期(逾期90+)作为坏客户定义。如果是做反欺诈,表现期可以短一点;如果是做贷后催收,又要换一套定义。
样本切分也必须按时间顺序切,而不是随机切。训练集用前18个月的申请样本,验证集用后6个月的,这样才能模拟线上真实的时间漂移场景。这里有个容易被忽略的细节:表现期不足的样本不能直接丢进训练集,也不能简单归为好客户。否则模型会学到“近期申请的客户都是好人”这类假规律,线上效果必然打折扣。样本定义这件事看起来很基础,但绝大多数模型表现不达预期,根源都出在这一步。
2.2 特征工程与特征穿越:最隐蔽的坑
特征工程的核心不是堆特征,是保证特征的时间语义正确。很多模型离线表现很好,一上线就崩,根因就是特征穿越——模型用了某个在决策时点根本拿不到的数据。举一个我真实踩过的坑:审批模型里接了一个“近30天消费总额”的特征,离线数据是从月度跑批表里取的,但跑批表的数据是T+1更新的。线上实时审批时,这个特征在当天的值其实是前一天的,导致模型在白天和晚上的分数分布有明显差异。
后来做特征监控时发现该特征在晚上缺失率飙升,排查半天才定位到是调度链路问题。修复之后,线上KS直接回升了6个百分点,不良率也跟着往下走了。类似的问题还有很多:用了放款后的资金流向特征做贷前审批、用了当期征信快照代替申请时间点的征信快照、用了反推变量(比如“是否被拒过”)等。所以每个特征在上线前都要回答三个问题:在决策时点这个值是否已经存在?它的更新时间是什么时候?如果在实时请求中拿不到,默认值应该是什么?把这三个问题写进特征文档,比多造50个特征有用得多。
2.3 模型选型与融合策略:别为了“先进”而先进
金融风控模型的主流选择依然是逻辑回归、GBDT这类成熟算法。深度学习在部分场景有优势,比如反欺诈的图模型、时序模型,但落地成本高、解释性差。我的习惯是:第一版先拿开源模型(XGBoost或LightGBM)做基准,如果业务方要求强解释性,再回退到逻辑回归或带单调约束的模型。不要一上来就上深度模型,金融场景的样本量通常不够大,过拟合风险远高于CV、NLP这类领域。
模型融合在金融场景中很有价值。单一模型容易在某些客群上出现盲区,多个模型投票可以平滑掉单项波动。实际操作中不一定要用复杂的Stacking,简单加权平均往往就够了。权重怎么定?不是拍脑袋,而是在验证集上搜索权重组合,选KS和稳定性都好的那组。模型蒸馏则更多用于部署环节,把复杂模型压缩成轻量模型,保证在交易链路上的耗时可控。金融场景的实时决策往往要求单次推理在10毫秒以内,太重的模型没法直接用,蒸馏后的模型体积小、速度快,更贴合生产要求。
2.4 评估指标:别只用AUC说话
AUC是一个很方便的指标,但它只告诉你排序能力,不告诉你业务上能赚多少钱。同一个AUC,可以通过不同的分数分布实现,而不同的分数分布在cutoff附近的行为可能完全不同。所以我一般会同时看KS、Lift曲线、PR曲线、以及不同分数档位上的坏账率。Lift曲线尤其重要,它直接告诉我们:拒绝掉10%的客户,能多拦住多少风险?这恰恰是判断不良压降空间的核心。
还有一个指标容易被忽略:分数稳定性,也就是PSI。模型上线后,每个月都要看分数分布是否发生漂移。如果PSI大于0.25,说明当前客群结构已经和训练集差得很远,模型的决策依据已经不可靠了。很多团队只在模型上线时做一次评估,之后就不闻不问,直到不良率飙升才反应过来。金融AI是一个动态博弈的场景,客群在变、对手在变,评估指标也必须是持续滚动、持续追踪的。
2.5 模型监控与冠军挑战者机制
模型上线不是终点,而是监控的起点。金融客群的行为会变,市场环境会变,模型一定会衰减。所以必须搭建一套监控体系,至少包含:分数分布(PSI)、排序能力(KS滚动)、特征缺失率和取值分布、策略通过率、逾期率动态曲线。每一类指标都要设置阈值和告警,比如PSI超过0.1就自动发通知,超过0.25就要进入模型迭代流程。不能让监控变成摆设,不然它就没有存在意义。
线上策略验证用冠军挑战者机制,最稳妥的做法是给两组客群各分配50%流量,跑至少一个完整账龄周期(比如3到6个月),对比逾期30+的Vintage曲线,而不是一上线就看第二天的不良率,因为信贷风险有滞后性。等到挑战者组在统计意义上显著优于冠军组,再全量切换。这个过程很熬人,但它是把模型效果转化成真实不良压降的最可靠路径。
3. 实操过程与核心环节实现:一个信贷审批模型从0到1
光讲道理不过瘾,我拿一个普惠信贷审批模型举例,把完整流程拆开,你可以直接套用。虽然具体参数和业务产品不同,但方法框架是通用的。
3.1 业务目标与基线设定
这个产品的在贷余额约10亿,当前审批通过率30%,12期产品,目前逾期30+不良率3.2%。业务方提出的目标是:在通过率不大幅下降的前提下,把不良率做相对5%的压降。5%相对压降看似温和,但结合前文计算,对应的是几百万的利润改善。我们把这个目标拆成三步:第一,把模型排序能力做得更准;第二,重新校准分数到违约概率,让cutoff有业务含义;第三,用冠军挑战者机制验证并动态调优额度策略。这三个步骤中,模型只是第一步里的一个工具,后面两步才是真正决定不良压降空间的地方。
3.2 数据处理与特征构造:先把时间对齐
样本取最近24个月的申请记录,排除掉还在表现期内的样本。坏客户定义:放款后90天内首次出现M3逾期或核销;好客户:表现期结束且无M2+逾期;中间状态要么剔除,要么单独建模,不要硬归到好或坏。特征分成四类:申请信息、征信负债、历史行为、设备环境。所有特征必须以“申请时间点”为基准做截断,不可以使用任何事后信息。
在代码里,我习惯把每个特征都带上as_of_date字段,在ETL里直接校验。特征数量控制在100个以内,先做缺失率大于50%的特征剔除、相关性大于0.8的特征去重、IV值筛选。这样做的目的不是追求精度,而是让模型在线下线上尽量保持一致。很多团队把特征数量堆到几百个,看起来信息量很大,但上线后维护成本极高,任何一个上游字段发生变动都可能在线上造成不可预见的影响。
3.3 模型训练:稳定优先,调参克制
模型用LightGBM作为主力,同时训练一个XGBoost做融合。我的初始参数是这样的:
params = { 'objective': 'binary:logistic', 'learning_rate': 0.05, 'max_depth': 4, 'min_child_weight': 100, 'subsample': 0.8, 'colsample_bytree': 0.8, 'eval_metric': 'auc', 'n_estimators': 500 }min_child_weight我特意调高,金融数据噪声大,叶子节点样本太少容易过拟合。用五折交叉验证代替简单训练集/验证集,每折留出时间序列尾巴。LightGBM和XGBoost分别训完后,在验证集上搜融合权重,从0.5/0.5开始,步长0.1,看哪个组合的KS最高,同时要看不同客群上的稳定性。最终落地模型不一定是最高的那个,还要看分数分布的稳定性。如果两个模型权重偏离0.5/0.5太远,说明其中一个模型有明显偏好,这时候要回去查特征。
3.4 分数校准与cutoff选择:如何把分数变成决策
模型输出的原始分数不是概率,要对齐到真实违约概率。我常用等频分箱后做单调映射,或者用Platt Scaling做概率校准。校准完成后,把分数切成100档,统计每一档的好客户数量和坏客户数量,画出Lift曲线。这时候你会发现一个有意思的现象:分数最高的那一档坏率可能只有0.1%,最低的一档坏率超过15%。通过调整cutoff,就能决定拒绝哪些人。
回到业务目标,原通过率30%,如果我们把通过率控制在29%,多拒绝的这1%客户是哪一群?他们坏率是多少?假设多拒绝的客户坏率是6%,而原通过客群坏率是3.2%,那么拒绝他们以后,新通过客群坏率约等于3.05%,相对下降接近5%。这就是不良压降的来源。所以cutoff选择本质上不是模型问题,而是成本收益问题。cutoff每动一个百分点,都要评估对通过率、放款量、不良率、利润的综合影响,最后交给业务和风险一起拍板。
3.5 部署、验证与监控:最后一个环节也是翻车重灾区
模型确定后,进入部署环节。金融行业对数据安全要求极高,模型推理通常要在本地私有化环境里跑,外部服务不能随便调用公网API。很多机构会限制模型文件和数据出境,所以绝大部分风控模型都以“本地模型”的形式部署在内部容器或物理机上。这一步的重点是保证训练环境和线上环境的特征口径完全一致。最好的做法是把特征计算逻辑封装成同一个服务,训练时和线上都用它,而不是训练一份代码、线上再写一份。
部署后先做灰度验证,用冠军挑战者策略分配流量。同时把监控看板搭起来,每日刷新PSI、KS、通过率、逾期率。这里要特别提一下“模型检查器”的作用。我所在团队在模型上线前会跑一整套检查:不同客群的KS、训练和线上分数分布差异、特征重要性Top20是否与业务常识一致、cutoff附近客群的稳定性。这套检查器曾经拦下过一个离线AUC很高但线上必然翻车的模型,原因是某个关键特征在训练集里缺失率只有2%,线上缺失率却高达15%。如果没拦下来,项目又会变成“模型不行”的又一案例。
3.6 模型迭代与再训练机制
模型上线后还要决定多久迭代一次。金融场景里客群漂移是常态,完全依赖人工看监控再决定是否迭代,反应速度太慢。我建议建立定期再训练流程:比如每个月自动拉取最新样本,重新训练模型并在测试集上评估,如果新模型在验证集上比线上模型KS高出一截,就自动进入冠军挑战者流程。这个机制能帮你始终跟上客群变化的节奏。
再训练也有风险,不能每次有微小提升就换模型。模型切换过于频繁会给运营和IT带来巨大压力,而且不同版本模型的分数尺度可能不一致,影响额度、定价策略的连续性。所以我的标准是:新模型相对于线上模型,在验证集上KS提升至少0.02,且主要客群的分数分布没有明显跳变,才考虑上罐。这个门槛可以过滤掉大量“看起来涨了但又没完全涨”的模型。
4. 常见问题与排查技巧实录:为什么模型上线就“失灵”
模型在线上表现不佳,大部分不是算法问题。我整理了一份实战速查表,基本覆盖了常见翻车场景。你可以把它打印出来贴在工位上,排查问题时逐项对照。
4.1 常见问题速查:现象、原因、排查方法
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 线上AUC/KS低于离线一大截 | 特征穿越或样本选择偏差 | 检查特征as_of_date,按时间切分重训模型 |
| 某些时段分数分布突变 | 上游数据任务延迟 | 监控特征缺失率和取值分布,看调度日志 |
| 上线3个月后效果持续下滑 | 客群漂移或坏人策略快速变化 | 看PSI,重启冠军挑战者机制,迭代样本 |
| 新模型全量后逾期没降 | 策略冲突或额度吃掉收益 | 检查规则层、额度层是否覆盖了模型信号 |
| 挑战者组效果不稳定 | 流量分配不均匀或样本量不足 | 增加观察期,按客户ID哈希分流 |
| 模型分数高但坏率也高 | 概率校准失效 | 重新做等频分箱校准,检查分数单调性 |
这里面最容易被忽略的是“策略冲突”。有时候模型已经把坏客户排到低分段,但规则引擎里一条老规则又把这些客群捞回来授信了。最后模型不管怎么迭代,业务指标都没变化。排查时要把全链路策略拉出来,看每一层对同一批客群是怎么决策的,而不是只盯模型。如果规则层和模型层打架,再好的模型也发挥不出作用。
4.2 避坑心得:先修数据,再做模型
做金融AI这几年,我最深刻的体会是:数据问题永远优先于模型问题。有好几次团队花了大半个月调模型结构,效果始终差一口气,最后发现是标签里混入了大量“假好客户”——有些客户虽然没逾期,但早已被人工催收标记为高风险,只是因为还款日还没到就没暴露。把标签定义修正后,同样的模型,KS直接提升0.03。这种收益远大于调参带来的提升。
还有一个容易被忽视的是离线在线一致性检查。训练时特征用的库存表,线上实时拿的是接口字段,两边稍微有一点差异,模型就会“失真”。我习惯在部署前随机抽取一万条线上真实请求,用训练特征代码重新计算一遍,和线上特征做一致性比对。差异超过1%就需要回头处理。很多团队卡在“上线后效果不对”的问题上,最后查下来都是特征计算结果不一致,白白浪费几个月时间。
4.3 组织协作:不良压降是业务工程,不是算法比赛
最后再说一个很多人不爱听的事实:金融AI落地最大的阻力往往不是技术,而是组织协作。模型算法再强,如果业务方不认可、IT方不支持、风险方不背责,项目就只能停留在实验阶段。我见过太多模型研发完了却在合规评审环节卡了两个月,最后错过最佳迭代窗口。金融行业对创新天然审慎,这个可以理解,但流程上的低效一定会吞掉模型带来的潜在收益。
所以如果你正卡在“不良压降3%~10%”这个目标上,我建议先别急着引入更复杂的模型。把样本定义、特征链路、监控看板、冠军挑战者机制这四件事做实,哪怕模型还是那棵XGBoost,效果也能见到。缺的从来不是模型,是把模型变成业务收益的那套系统工程。我个人在实际操作中的体会是,一次扎实的特征链路修复带来的收益,可能比换三个模型都大;而这些收益,最后都会诚实地反映在不良率报表上。