信用评分概述与特征工程重要性
信用评分卡,说白了就是银行或者金融公司用来决定“借不借钱给你”的一套打分系统。你想想看,一个人来申请贷款,你总得有个客观依据吧?不能拍脑袋说“这人看起来挺靠谱”就批了。评分卡就是把这个决策变成数学公式。
我个人习惯把评分卡分成两块:模型本身和输入的数据。模型大家都懂,逻辑回归、XGBoost都行。但真正决定模型上限的,其实是那些特征——你喂给模型的数据质量。我记得刚入行带我的老工程师说过一句话:“垃圾进,垃圾出。”你特征没做好,再牛的算法也救不了。
特征工程之所以重要,就是因为它能把原始数据里藏着的规律“挖”出来,让模型看得更清楚。下面这张图总结了评分卡开发的典型流程,你可以看到特征工程处于最核心的位置:
传统评分卡的问题
早些年的评分卡是怎么做的?很多团队直接拿原始字段硬上:收入、年龄、负债比……分个箱就算特征了。我在项目中遇到过这样的案例——特征只有十几个,用逻辑回归也能跑,但KS值始终上不去,也就0.3出头。原因很简单:字段之间会有交叉效应,比如“低收入+高负债”组合的风险远大于两者单独加起来。传统办法很难捕捉这种非线性。
另一个坑是缺失值。我记得有一次上线后业务方反馈:“为什么这个客户明明月薪两万,评分却很低?”查了半天,原来是收入字段为空,系统直接填充了均值,把人家当成了普通人。你看,缺失值处理不当,在业务上就会变成“错杀”。
我把传统做法和加过特征工程的做法做了个对比,你一看就明白:
| 维度 | 无特征工程 | 有特征工程 |
|---|---|---|
| 变量数量 | 10~20个原始字段 | 50~200个衍生特征 |
| 缺失值处理 | 删除或简单均值填充 | 分类+统计+模型预测填充 |
| 非线性捕捉 | 差(靠模型自身) | 强(分箱、交叉、WOE编码) |
| 模型KS | 0.25~0.35 | 0.35~0.55 |
| 业务可解释性 | 一般 | 好(可对应业务规则) |
避坑指南:我曾经犯过一个错误——一股脑生成300个特征,然后丢给模型做自动特征选择。结果模型过拟合得一塌糊涂,回测漂亮,上线马上崩。后来我学乖了:特征工程不是越多越好,而是有业务依据的衍生才有价值。每生成一个新特征,都要问自己一句:“这条特征在风控业务上说得通吗?”
特征工程在信用评分中的关键作用
信用评分模型特别依赖特征的稳定性和单调性。什么意思呢?你做的特征不能今天跟违约率正相关,下个月又变负相关了。我在做跨时间验证时,就曾发现某个“转账次数”特征,上半年的坏账率是随次数增加而升高,下半年却因为政策调整反而降低——这种特征直接废掉。
特征工程另一个重要作用是变量降维和融合。征信报告里可能有上千个字段,你不能直接用。需要把它们聚合转换成几百个强特征,比如“近6个月平均逾期天数”、“多头借贷平台数”。我习惯先做数据探索,画出每个字段的分布和IV值,再决定是否保留。
下面是一个简化的特征工程流程,我用代码展示了一个最基础的缺失值处理和分箱:
import pandas as pd
import numpy as np
# 原始数据
df = pd.DataFrame({
'age': [25, 33, np.nan, 45, 28],
'income': [5000, 12000, 8000, np.nan, 7000],
'loan_cnt': [0, 3, 1, 5, 2]
})
# 1. 缺失值处理:用中位数填充
df['age'].fillna(df['age'].median(), inplace=True)
df['income'].fillna(df['income'].median(), inplace=True)
# 2. 分箱(简单等频分3箱)
df['age_bin'] = pd.qcut(df['age'], q=3, labels=['青年','中年','老年'])
# 3. 计算WOE和IV(示意)
# 实际需要标签变量,此处省略
print(df.head())
说到底,特征工程就是把原始数据里的“脏数据”变干净,把“弱信号”变强,把“混乱关系”变清晰。没有这一步,评分卡就像用沙子盖大楼,底层不稳,上层再漂亮也没用。我个人做了七八个评分卡项目,每一次回头看,效果提升最大的环节永远是特征工程,而不是调参或换模型。
好了,第一讲的核心就这些。你心里得有个数:后面几章我们会深入讲具体的特征处理方法,但不管学多少技巧,都要回到业务需求上来——你做的每一条特征,最后是要给风控审批员一个合理的理由。