2. 数据准备
做评分卡模型,数据就是弹药。很多人一上来就调包、跑算法,结果跑完才发现数据一堆坑——说白了,白费功夫。我个人的习惯是,拿到数据集先花半天时间摸清它的底细。这一章我们就来干这件事。
2.1 获取信贷数据集
课程用的数据集是 Kaggle 上的经典案例——Give Me Some Credit。这是一个二元分类问题,预测借款人未来两年内是否会经历严重财务困境(拖欠 90 天以上或更糟)。
下载方式: Kaggle 搜 "Give Me Some Credit" 就能找到。文件只有一个
cs-training.csv,大约 15 万条样本,12 个字段。如果网速慢,我提前帮你备了一份百度云链接(见课程附件)。
加载数据很简单,Pandas 一行搞定:
import pandas as pd
df = pd.read_csv('cs-training.csv')
print(df.head())
2.2 字段解释
字段一共 12 个,不过有些名字起得挺绕。我帮你翻译成人话,顺便标出我踩过的坑:
| 字段名 | 中文含义 | 注意 |
|---|---|---|
SeriousDlqin2yrs |
目标变量:是否违约(0/1) | 正样本比例不到 7%,严重不平衡 |
RevolvingUtilizationOfUnsecuredLines |
信用卡及个人信贷额度使用率 | 容易有极端值,有些人超过 1(额度不够刷爆了) |
age |
借款人年龄(岁) | 有小于 18 岁或大于 100 岁的异常值,我直接过滤掉了 |
NumberOfTime30-59DaysPastDueNotWorse |
过去 2 年逾期 30-59 天的次数 | 最大值 98?明显是异常,这个字段坑很多 |
DebtRatio |
每月债务支出 / 月收入 | 有人 Debt Ratio 几千?多半是收入为0 |
MonthlyIncome |
月收入 | 缺失严重,约 30% 空值 |
NumberOfOpenCreditLinesAndLoans |
开放信贷及贷款笔数 | 范围正常,但可以做分箱 |
NumberOfTimes90DaysLate |
逾期 90 天以上的次数 | 同样有异常值 98 |
NumberRealEstateLoansOrLines |
房贷笔数 | 有人 32 笔?太离谱了 |
NumberOfTime60-89DaysPastDueNotWorse |
逾期 60-89 天的次数 | 同上异常模式 |
NumberOfDependents |
家属人数 | 缺失不多,可以填 0 |
我曾经遇到一个项目: 对
NumberOfTime30-59DaysPastDueNotWorse 没做处理,直接丢进模型,结果评分卡分档全乱套。后来发现这列存在 98 这种异常值,其实是数据录入错误或特殊标记。一定要先查分布!
2.3 数据初步探索
拿到数据别急着建模,先跑几个基础检查。我习惯用 .info() 和 .describe() 快速扫一眼。
# 数据规模、类型、缺失情况
df.info()
# 数值统计概览
df.describe().T
从 .info() 你能看到:
- 总样本 150,000 条
- 缺失字段:
MonthlyIncome(约 30% 空)、NumberOfDependents(少量) - 所有字段除目标变量外都是 float64 或 int64,没有 object 类型,省了编码步骤
.describe() 则暴露了更多问题。你看 RevolvingUtilizationOfUnsecuredLines 的最大值是 507?这显然是异常。还有 age 的最小值 0?不可能有 0 岁的借款人。这些数据必须清洗。
核心发现:
- 目标变量严重不平衡(正样本仅 6.7%)
- 多个字段存在异常极大值(98、507、3298 等)
- 月收入缺失 20% 以上,不能直接丢掉
2.4 缺失值检查
缺失值处理是评分卡建模的必修课。我一般先用热力图可视化缺失情况,不过这一节我们先看数字。
miss = df.isnull().sum()
miss_pct = miss / len(df) * 100
miss_df = pd.DataFrame({'缺失数': miss, '缺失率%': miss_pct})
print(miss_df[miss_df['缺失数'] > 0])
结果一目了然:MonthlyIncome 缺失 29,731 条,占比 19.8%;NumberOfDependents 缺失 1,924 条,占比 1.3%。
缺失率低于 5% 的可以用众数或中位数填补,但这里是 20%。怎么办?
- 直接删除会损失大量样本(尤其正样本本来就少)
- 用中位数填补?可能会扭曲收入分布
- 我常用的方案:先对收入做对数变换,再用回归模型预测缺失值,或者用 KNN 填补
具体怎么做我们放在数据清洗章节细讲。现在你只需要知道:缺失值不是洪水猛兽,但一定要排查清楚。
一个小技巧: 检查缺失值的时候顺带看一眼缺失模式。比如
MonthlyIncome 缺失是否与 DebtRatio 异常有关?我见过很多案例,收入缺失的人往往债务比例也畸形。这能帮你决策填补策略。