村口小卖部的老张,经营了二十年,全靠一本“良心账本”决定给谁赊账。他记得谁家月底总来赊米、谁三个月才结一次账、谁上回说月底还却拖到过年。这些零散的观察,就是最原始的“信用评分”。后来他开了连锁超市,顾客从街坊变成几百万陌生人——老张没法挨个见面,只能把所有经验浓缩成一套统一的打分规则:输入收入、负债、还款历史这些“线索”,输出“大概率能还”或“大概率会赖账”。这就是信用评分模型。本文带你完整体验一次建模全流程:特征怎么选、模型怎么训练、概率怎么变成 300–850 的分数、模型上线后怎么验证,以及如何向监管证明“你拒绝这个人是合理的”。学完之后,你会理解信用评分从数据到上线的完整链路。
学完本文,你将掌握特征工程、逻辑回归、分数校准与模型监控的核心方法,这是金融风控 AI 岗位的基本功,也是理解银行信贷业务智能化的钥匙。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
信用评分模型流程——特征→模型→评分→风险等级 特征输入:征信+行为+网络多维特征 XGBoost: 梯度提升决策树集成 评分校准:Platt Scaling概率校准 风险等级:A/B/C/D分级授信 Score = f(credit, behavior, network) → P(default) → Grade
评分卡原理
老张的账本上其实藏着一个朴素的数学判断:他嘴上说“这人看着靠谱”,心里算的却是“十次里有九次还上了”。靠谱程度,说到底是一个概率。信用评分卡的第一步,就是把这种直觉翻译成数字语言。
信用评分模型先用历史数据估算每个借款人的违约概率 p,再通过 p 推出“好坏比 odds”。odds 相当于博彩里的赔率:它告诉我们“违约”和“守约”谁更可能发生。p 越大,odds 越大,风险越高。
在实践中,评分卡分为申请评分卡、行为评分卡和催收评分卡三类,分别用在贷前、贷中、贷后。它们的共同点都是“输入特征,输出分数”。早期银行用纸笔打分表,今天用逻辑回归甚至梯度提升树,但底层“概率→分数”的思路从未改变。
老张可能没学过概率论,但他心里那杆秤,就是一台活生生的评分模型——只不过现在,AI 把这杆秤搬进了服务器,能同时给几百万个陌生街坊称重。
- 违约概率 pp 是模型估算的“这个人在未来一段时间赖账的可能性”,取值在 0 到 1 之间,p 越大风险越高。
- 守约概率 1-p既然总共只有守约和违约两种结果,守约的概率就是 1-p,两者相加等于 1。
- 好坏比 odds把违约概率除以守约概率,得到“坏与好的比值”。这个比值后面会通过取对数,变成信用评分卡上的分数刻度。
特征工程
老张观察的“线索”里,有些管用,有些是噪音。“穿得体面”未必代表还得起钱,“每次结账都当天结清”才是硬指标。筛选线索,就是特征工程要干的事。
原始数据五花八门:年龄、收入、负债、逾期次数、查询次数,动辄上百个变量。不能直接塞进模型,要先做数据清洗(处理缺失值和异常值),再把连续变量分箱,然后计算每个分箱的 WOE 值。WOE 的全称是 Weight of Evidence(证据权重),它回答一个问题:这个分组里,好客户相对坏客户有多集中?
入模前,每个变量都用 WOE 值替代原始值,再用 IV(Information Value,信息值)衡量变量预测力——IV 由各分箱 WOE 加权求和而来。经验上 IV 大于 0.1 值得入模,大于 0.3 预测力很强。这一步通常能砍掉一半以上无效变量。
老张的账本里,“赊账后多久结清”这类线索的“IV 值”极高,而“今天穿什么颜色衣服”几乎没有区分力。特征工程,就是把账本里真正会呼吸的线索挑出来,把写在墙上的碎碎念扔进垃圾桶。
- 好客户占比第 i 个分箱中的好客户数量,除以全体好客户总数,衡量好客户在这个分箱里的集中度。
- 坏客户占比同理,用第 i 个分箱的坏客户数除以全体坏客户总数。
- 取自然对数对好占比与坏占比的比值取 ln。比值大于 1 时 WOE 为正,说明该分箱更安全;小于 1 时 WOE 为负,说明该分箱风险更高。
逻辑回归
老张想给自己那杆秤写个公式。他发现每个线索都该有个“分量”:历史逾期要狠狠地扣分,收入稳定稍微加点分。把这些分量的加权和拿出来,就是逻辑回归的雏形。
逻辑回归先把特征线性组合成一个“原始分” z,再用 Sigmoid 函数(一种把任意实数压缩到 0 到 1 之间的 S 形曲线)把它变成概率。这就像老张心里先飞快地心算一个总印象分,再把它翻译成“靠不靠谱”的把握程度。
训练时用极大似然估计:调整所有 β,让“好客户被预测为好、坏客户被预测为坏”的整体概率最大。逻辑回归最大的优点是每个 β 都能直接读出方向——逾期次数的 β 为正,说明逾期越多违约概率越高。
老张的秤上,每个指标的“分量”就是 β。分量一旦定下来,任何人都能照着算,不用猜。这就是传统评分卡几十年不倒的原因:透明、可复核,连村委会主任都能看懂。
- 线性组合 z每个特征 xᵢ 乘以权重 βᵢ,再加偏置 β₀,得到原始得分 z。
- 指数变换 e⁻ᶻ对 z 取负再取指数。z 越大,e⁻ᶻ 越小,分母越接近 1。
- 归一化得到概率用 1 除以 1+e⁻ᶻ,结果必然落在 0 到 1 之间。z 趋于正无穷时 p 趋于 1,z 趋于负无穷时 p 趋于 0。
机器学习模型
老张的儿子小张赶时髦,说“爸,别手动定分量了,让电脑自己从账本里找规律”。于是他请来一群“决策树工人”,每棵树负责从数据里挖一条规律,最后集体投票——这就是随机森林。再进一步,让后一棵树专门纠正前面所有树的错误,这就是 XGBoost 的思路。
XGBoost 像一场“带纠错的接力赛”:第一棵树预测,第二棵树专门学第一棵树的错误,第三棵再学前两棵剩下的错误……每一轮都比上一轮更接近真相。它的目标函数由两部分组成:预测损失和复杂度惩罚。
树模型能自动捕捉非线性关系:比如“年轻+高负债”和“中年+高负债”的风险完全不同,逻辑回归需要手工构造交叉特征,而树模型自己就能分叉出来。但代价是黑盒、难解释。生产环境里,银行常把树模型和逻辑回归做对比择优,再用 SHAP 等技术给树模型补上“解释能力”。
小张的电脑把账本翻了个底朝天,找到“每月 25 号后连续三天不结账的人,下个月大概率也不结”这种人类容易忽略的规律。但老张皱了皱眉:规律好用,可如果有人来问“凭什么不给我赊账”,电脑答得上来吗?这个疑问,引出了后面可解释性的话题。
- 损失项衡量预测值 ŷᵢ 和真实标签 yᵢ 的差距,例如对数损失。差距越小越好。
- 正则项对每棵树的复杂度(叶子数量、叶子权重)做惩罚,逼着模型不敢把训练集整本背下来。
- 目标函数损失与正则之和。梯度提升的每一轮都在最小化这个目标。
分数校准
概率是好东西,但业务方不习惯听“违约概率 0.03”,他们习惯看“分数 680”。老张也把秤改成了 0 到 100 分制,并约定 60 分及格才能赊账。把模型输出的概率换算成业务分数,就是分数校准。
信用评分卡行业的标准做法:把好坏比取对数后做线性变换。注意这里的好坏比用守约概率除以违约概率,数值越大代表越安全。分数越高,风险越低。
校准完成后,分数刻度就固定了:比如 650 分对应的好坏比是 20:1,700 分是 40:1,每 50 分翻一倍。然后风控策略师根据资金成本和风险偏好设定阈值——多少分以上自动通过,多少分以下直接拒绝,中间的人工审核。
老张把秤调成了“0-100 分制”,60 分以上赊账,55 分以下只收现金。一个清晰、好沟通的刻度,让“拒绝赊账”不再是一句伤感情的话,而是一串可以解释的数字。
- 好坏比 odds用守约概率 p_good 除以违约概率 p_bad,值越大说明客户越安全。
- 取对数 ln(odds)把比值压缩成线性刻度,避免概率靠近 0 或 1 时分数剧烈跳动。
- factor 斜率通常设定 pdo=50,意思是“分数每增加 50,好坏比翻倍”,因此 factor 由 pdo 除以 ln2 得到。
- offset 截距决定基准分。例如设定“好坏比等于 50 时,分数为 600”,由此反推出 offset。
模型评估
新刻度上线前,老张得先自证“这套分数真的好用”。他翻出过去五年的旧账本,把老客户按分数排队,看是不是分数越低的人越容易赖账。这套“翻旧账”的体检,对应模型评估中的判别力指标。
最常用的两个判别力指标是 AUC 和 KS。AUC 是 ROC 曲线下的面积,衡量模型把好客户和坏客户分开的能力:0.7 以上可接受,0.8 以上很强。KS 是累计好客户占比与累计坏客户占比的最大差距,一般大于 0.3 就算良好。这两个指标回答的都是同一件事:分数能不能把好人和坏人排开队。
但判别力只代表“现在”,客户群会随时间漂移。上线后必须用 PSI(Population Stability Index,群体稳定性指标)监控分数分布是否和建模时一致:
老张每个月都会把新客户按分数重新排队,和上个月对比——如果某个月高分段突然挤进来一堆人,他就会去查是不是隔壁村新开了工厂,客群结构变了。这就是 PSI 监控的日常版本。
- 实际占比与预期占比把分数等分成 n 个区间,统计当前月份每个区间的人数占比 Aᵢ,以及建模样本中的占比 Eᵢ。
- 占比之差实际占比减去预期占比,代表该区间客户浓度的偏移方向和幅度。
- 对数加权求和乘以 ln(Aᵢ/Eᵢ) 放大差异,最后对所有分箱求和,得到 PSI。
可解释监管
有个街坊被拒绝赊账,去村委会告状。老张不能只说“这是上面定的”,他得拿出理由:你在 2019 年有一笔账拖了 3 个月才还,负债又高,所以分低。把决策原因交代清楚,就是可解释性。
现代做法是用 SHAP(SHapley Additive exPlanations)等技术,把每个特征对预测结果的贡献“分锅到人”。它的核心思想非常朴素:预测值 = 全体客户的基准值 + 每个特征各自的贡献之和。
监管层面,互联网贷款管理办法、个人信息保护相关规范都要求:银行必须能解释授信决策,不得对特定群体产生歧视。因此从业者既要追求精度,也要保住“说得出理由”的能力。实际操作中还要分群检验通过率差异,比如年龄、性别、地域各分群的获批比例不能有明显偏离。
老张最后把那杆 AI 秤换成了“透明玻璃秤”,里面每个零件都看得见转了多少圈。街坊服气,村委会也放心。一个好的信用评分模型,不只是准,还得让人信。
- 基准预测 φ₀全体客户的平均预测值,是所有解释的起点。
- 特征贡献 φᵢ第 i 个特征在本次预测中的边际贡献,来自对所有特征子集的加权平均。
- 可加解释模型 g把基准值和所有特征贡献加起来,就还原出模型的预测值。
AI 应用场景
银行零售信贷的自动化审批
阶段:贷前申请评分
解决的问题:传统人工审批慢、标准不统一,一个客户经理一个尺度。AI 用申请评分卡对每笔贷款自动打分,结合策略规则秒级返回“通过 / 拒绝 / 人工审核”。
具体案例:某消费金融公司每天涌入 10 万笔线上借款申请,过去靠人工初审要 2 天。上线逻辑回归评分卡后,审批压缩到 3 分钟,坏账率下降约 15%,人力成本大幅降低。
存量客户的额度管理与动态定价
阶段:贷中行为评分
解决的问题:客户的还款能力会变化,静态额度跟不上风险变化。行为评分卡利用还款行为、消费流水、多头借贷等数据持续打分,动态调整额度与利率。
具体案例:某互联网银行对小微企业主按日更新行为分:经营旺季自动临时提额,风险信号升高时自动降额,实现“一人一策”的精细化风险管理。
监管报送与模型审计
阶段:模型治理与解释
解决的问题:客户投诉“为什么拒我?”,监管检查“你的模型公平吗?”。用 SHAP 生成每个拒贷决策的可读解释,把“模型说不清楚”变成“每条决策都有据可查”。
具体案例:某股份制银行搭建模型风险管理平台,所有信贷模型上线前必须通过可解释性与公平性测试,拒贷解释报告自动生成,客诉处理效率提升 60%。
Python 演示
import numpy as npimport pandas as pdfrom sklearn.linear_model import LogisticRegression def calc_woe_iv(df, feature, target): """连续特征分箱后计算 WOE 与 IV,变量越能区分好坏客户,IV 越大""" df = df.copy() df['bin'] = pd.qcut(df[feature], 4, duplicates='drop') grouped = df.groupby('bin', observed=False)[target].agg(['sum', 'count']) grouped.columns = ['bad', 'total'] grouped['good'] = grouped['total'] - grouped['bad'] good_pct = grouped['good'] / grouped['good'].sum() bad_pct = grouped['bad'] / grouped['bad'].sum() grouped['woe'] = np.log(good_pct / bad_pct) grouped['iv'] = (good_pct - bad_pct) * grouped['woe'] return grouped def prob_to_score(prob, p0=0.02, score0=600, pdo=50): """概率转分数:分数每高 50,好坏比翻倍""" odds0 = p0 / (1 - p0) factor = pdo / np.log(2) offset = score0 - factor * np.log(odds0) odds = prob / (1 - prob) return np.round(offset + factor * np.log(odds)) def main(): rng = np.random.default_rng(42) n = 2000 income = rng.normal(12000, 4000, n) age = rng.normal(38, 10, n) debt_ratio = rng.uniform(0.1, 0.9, n) late_times = rng.poisson(0.8, n) z = -3 + 0.00012 * income + 0.02 * age - 2.5 * debt_ratio - 0.6 * late_times target = (rng.random(n) < 1 / (1 + np.exp(-z))).astype(int) df = pd.DataFrame({'income': income, 'age': age, 'debt_ratio': debt_ratio, 'late_times': late_times, 'target': target}) features = ['income', 'age', 'debt_ratio', 'late_times'] model = LogisticRegression() model.fit(df[features], df['target']) prob_good = model.predict_proba(df[features])[:, 0] df['score'] = prob_to_score(prob_good) print('逻辑回归系数:', dict(zip(features, model.coef_[0]))) print('分数分位数:', df['score'].quantile([0.25, 0.5, 0.75]).round().to_dict()) print(calc_woe_iv(df, 'debt_ratio', 'target').round(4)) if __name__ == '__main__': main()
model.fit(df[features], df['target'])用历史好坏客户数据训练逻辑回归,让权重自动拟合,就像老张根据旧账本总结经验。prob_good = model.predict_proba(df[features])[:, 0]取出每个客户“守约”的概率,这是分数的原材料。df['score'] = prob_to_score(prob_good)把守约概率换算成 300-850 区间的信用分数,完成分数校准。factor = pdo / np.log(2)设定“每高 50 分好坏比翻倍”的刻度斜率。offset = score0 - factor * np.log(odds0)反推截距,让参考点(odds=50 时 600 分)精确落位。grouped['woe'] = np.log(good_pct / bad_pct)计算每个分箱的 WOE,量化该分箱的风险高低。grouped['iv'] = (good_pct - bad_pct) * grouped['woe']用 IV 值衡量变量区分度,IV 越大越值得入模。
常见误区
误区我信用分 850 分,银行肯定会给我批贷,而且我肯定不会违约。
正解信用分数是违约概率的映射,描述的是统计规律而非确定性结论。850 分对应的是“每 1000 个类似客户里坏账极少”,但落到单一个体,仍存在不确定性。老张说“这人有九成把握还钱”,不代表这人绝对不会赖账。风险管理的本质就是在不确定性中做概率决策。
为何常见:银行的宣传和日常语感把“高信用分”等同于“诚信品德好”,让人误以为分数是确定性判官。
误区XGBoost 和深度学习肯定比逻辑回归准,不用逻辑回归就是落伍。
正解金融场景里逻辑回归因为可解释、稳定、省算力,至今仍是信贷审批的主力模型。树模型精度可能更高,但黑盒特性会带来监管压力和客诉风险。老张选秤也一样:电子秤先进,可街坊看不懂内部构造,反而更信任透明玻璃秤。模型选型是“精度、解释、稳定”的三角权衡。
为何常见:看到 Kaggle 排行榜上复杂模型刷分,误以为竞赛经验直接等价于生产环境经验。
误区把逻辑回归输出的违约概率 0.03 直接拿给业务方,说“这个客户的信用分是 0.03”。
正解概率需要经过 offset 和 factor 的线性映射,才能变成 300-850 的业务分数。概率 0.03 和 0.05 差得很小,但换算成好坏比和分数后差异会被放大,便于设定审批阈值。就像摄氏度和华氏度读数不同,但反映的是同一温度;分数是概率的另一种刻度,不能混用。
为何常见:入门时只学模型原理,没接触过信用评分卡特有的分数刻度设计,容易把“模型输出”和“业务分数”画等号。
误区训练集上 AUC 0.99,觉得自己模型天下无敌,直接上线。
正解训练集 AUC 极高往往意味着过拟合——模型把训练样本里的噪音都背下来了。真正的检验要看验证集 AUC 和上线后的 PSI。如果客群漂移,PSI 爆表,再高的 AUC 也等于零。老张翻旧账时发现“只看训练数据”的秤到了新街坊身上失灵,就是这个道理。
为何常见:新手容易把“训练集拟合程度”和“模型泛化能力”混为一谈,缺少样本外验证的意识。
误区把 200 个原始变量全丢进模型,认为多总比少好。
正解冗余特征会带来共线性和噪音,既拖慢训练,又降低稳定性。标准做法是用 WOE 编码 + IV 筛选,保留预测力强、业务含义清晰的变量。老张的经验里,“结账速度”和“赊账次数”高度相关,留一个就够,全记在本子上反而眼花。
为何常见:很多教程只讲“喂数据给模型”,不讲特征筛选,导致初学者误以为特征工程只是搬运工的工作。
面试题
Q1. WOE 编码中的“好客户占比”指的是?
- A.该分组好客户占全体客户的比例
- B.该分组好客户占全体好客户的比例← 正确答案
- C.全体好客户占该分组客户的比例
- D.全体好客户占全体坏客户的比例
答案:B。WOE 的分子是“该分组好客户数 ÷ 全体好客户数”,衡量好客户在该分箱的集中度,所以 B 正确。A 把分母换成了全体客户,C 颠倒了分子分母,D 比较的是全体好坏客户,均不符合定义,老张账本里“这个月结清的人占全部老熟人的比例”才是 WOE 的直觉。
Q2. 信用评分建模中,常用的特征变量包括哪些?
- A.借款人年龄与收入水平← 正确答案
- B.客户星座与血型
- C.历史逾期还款次数← 正确答案
- D.负债收入比指标← 正确答案
答案:ACD。年龄、收入、逾期次数、负债收入比都与还款能力和意愿强相关,是评分卡常用变量。星座血型没有经济学含义和区分度,属于噪音。变量筛选靠 IV 值说话,就像老张只记录和赊账真正相关的线索,而不是客户的穿着打扮。
Q3. 逻辑回归模型直接输出的核心结果是?
- A.借款人的最终信用评分
- B.借款人的违约概率值← 正确答案
- C.借款人的授信额度
- D.借款人的还款期限
答案:B。逻辑回归通过 Sigmoid 函数把线性组合压缩到 0~1 之间,直接输出违约概率。信用分数是在概率基础上经过 offset/factor 校准得到的;授信额度和期限属于策略层决策,不是模型输出。这和“老张心里先估个把握程度,再决定赊多少”是两步。
Q4. 分数校准公式中,factor 的作用是控制?
- A.训练样本的数据质量
- B.分数随好坏比变化的敏感程度← 正确答案
- C.基准分数对应的好坏比
- D.模型特征数量的多少
答案:B。factor 是分数对 ln(odds) 的斜率,决定了好坏比每变化多少、分数动多少分。pdo 设定为 50 分翻倍时,factor = 50/ln2。它和 offset 配合,把概率映射到业务分数刻度。
Q5. 下列哪些指标用于评估信用评分模型的表现?
- A.页面响应耗时长短
- B.AUC 曲线下方面积← 正确答案
- C.KS 累计分布差距← 正确答案
- D.PSI 分布稳定性← 正确答案
答案:BCD。AUC 和 KS 衡量模型把好坏客户分开的能力,PSI 监控上线后评分分布的稳定性,三者是评分模型“体检”的标准项目。页面响应耗时是工程性能指标,和模型预测能力无关。
Q6. PSI 指标主要用于监测信用评分模型的哪个方面?
- A.训练样本的标注质量
- B.单个特征的重要程度
- C.评分分布随时间的稳定性← 正确答案
- D.审批流程的耗时长短
答案:C。PSI 对比当前分数分布与建模时分布的差异,衡量客群漂移程度,是模型稳定性监控的核心指标。若 PSI > 0.25,说明模型可能失效。它不回答特征重要性(SHAP),也不评估样本标注质量。
Q7. 银行更偏好可解释模型的核心原因是?
- A.可解释模型训练速度更快
- B.满足监管要求并能向客户说明拒贷原因← 正确答案
- C.可解释模型精度一定更高
- D.可解释模型不需要特征工程
答案:B。监管要求信贷决策可解释、可申诉,客户也想知道被拒理由,因此可解释性是刚需。可解释模型不一定更快、更准,更不可能免掉特征工程。老张把秤换成透明玻璃秤,就是为了让人心服口服。
Q8. 关于机器学习模型与逻辑回归,下列说法正确的是?
- A.树模型能自动捕捉非线性关系← 正确答案
- B.逻辑回归系数可直接解释特征方向← 正确答案
- C.树模型在金融场景一定优于逻辑回归
- D.逻辑回归对异常值更敏感← 正确答案
答案:ABD。树模型通过分叉天然处理非线性;逻辑回归的 β 正负直接给出风险方向;逻辑回归基于线性假设,极端异常值会明显拉扯系数。C 错在“一定”——金融场景还要权衡解释性和稳定性,逻辑回归仍是主力。
Q9. 好坏比 odds = p_good / p_bad,当守约概率为 0.9 时,好坏比是?
- A.1,好坏风险完全相当
- B.0.9,数值等于守约概率
- C.9,好客户概率远高于坏客户← 正确答案
- D.0.5,坏客户更占上风
答案:C。守约概率 0.9,违约概率 0.1,odds = 0.9/0.1 = 9,意思是守约可能性是违约的 9 倍。如果 odds 是 1,才是好坏各半。
Q10. 信用评分模型上线后,持续监控系统应关注哪些内容?
- A.分数分布的 PSI 漂移← 正确答案
- B.建模代码的行数长短
- C.策略切点下的拒绝率← 正确答案
- D.好坏客户的分数重叠度← 正确答案
答案:ACD。上线后要持续看 PSI 是否漂移、拒绝率是否符合业务预期、好坏客户分数分布是否仍然可分(对应 AUC/KS 衰减情况)。代码行数属于开发维护范畴,与模型风控表现无关。