3. 数据准备:评分数据与标签数据的获取、数据清洗、训练集与测试集划分
数据准备这步,说白了就是决定你模型上限的关键环节。我见过太多人急着调参,结果数据里一堆脏东西,最后模型效果惨不忍睹。今天咱们就把这块彻底捋清楚。
3.1 评分数据与标签数据的获取
先说说数据来源。评分数据通常来自业务系统,比如用户行为日志、交易流水、申请表单。标签数据呢,得靠历史表现来定义——逾期、坏账、欺诈这些。
我个人习惯把数据源分成三类:
| 数据类别 | 典型来源 | 常见字段 |
|---|---|---|
| 用户画像数据 | 注册信息、实名认证 | 年龄、性别、职业、收入 |
| 行为数据 | APP埋点、浏览日志 | 登录频次、页面停留时长、点击率 |
| 交易数据 | 支付系统、账务系统 | 交易金额、交易频次、逾期天数 |
| 外部数据 | 征信机构、黑名单库 | 征信评分、多头借贷数、法院执行记录 |
获取标签时有个坑——观察期和表现期必须对齐。比如你用过去6个月的行为预测未来3个月是否逾期,那标签就得取未来3个月的实际表现。我在项目中遇到过有人把时间窗口搞反了,结果模型在线上完全失效,嗯,那叫一个惨。
⚠️ 注意: 标签定义要跟业务方对齐。逾期30天和逾期90天,在风控策略里完全是两码事。别自己闷头定义,回头业务不认。
3.2 数据清洗:别让脏数据毁了你的模型
数据清洗是体力活,但也是最能体现功力的地方。我一般按下面几步走:
- 缺失值处理:先看缺失比例。低于5%的直接删除或填充均值;超过30%的字段,我建议直接扔掉,或者单独做缺失标志位。
- 异常值检测:用箱线图或3σ原则。比如年龄字段出现200岁,那肯定是脏数据。
- 重复数据去重:同一个用户多条记录,保留最新一条。
- 逻辑校验:比如注册时间晚于逾期时间,这种明显矛盾的数据要剔除。
给你看段我常用的清洗代码:
import pandas as pd
import numpy as np
def clean_data(df):
# 1. 删除全空列
df = df.dropna(axis=1, how='all')
# 2. 缺失值处理
for col in df.columns:
missing_rate = df[col].isnull().mean()
if missing_rate > 0.3:
df.drop(col, axis=1, inplace=True)
elif missing_rate > 0.05:
df[col].fillna(df[col].median(), inplace=True)
else:
df.dropna(subset=[col], inplace=True)
# 3. 异常值截断(以年龄为例)
q_low = df['age'].quantile(0.01)
q_high = df['age'].quantile(0.99)
df['age'] = df['age'].clip(q_low, q_high)
return df
💡 小技巧: 我曾经在清洗时发现某个字段缺失率高达80%,本来想直接删掉。后来跟业务一聊,发现这个字段恰恰是高风险用户的特征——因为只有高风险用户才会触发这个字段的采集。所以,缺失本身也可能是信息。
3.3 训练集与测试集划分
划分数据集,核心原则就一条:测试集要能模拟真实上线环境。
我推荐按时间划分,而不是随机划分。为什么?因为风控模型上线后,面对的是未来的数据。如果随机划分,训练集和测试集可能混着时间信息,模型会"偷看"到未来的模式,导致评估结果虚高。
具体做法:
- 按时间排序,比如前80%的数据做训练,后20%做测试
- 如果数据量小,可以用时间序列交叉验证
- 注意类别平衡——如果坏样本只有5%,测试集里也要保持这个比例
代码实现很简单:
from sklearn.model_selection import train_test_split
# 假设df已经按时间排序
train_size = int(len(df) * 0.8)
train_df = df.iloc[:train_size]
test_df = df.iloc[train_size:]
# 分离特征和标签
X_train = train_df.drop('label', axis=1)
y_train = train_df['label']
X_test = test_df.drop('label', axis=1)
y_test = test_df['label']
🔑 关键点: 划分后一定要检查分布一致性。用KS检验或直接画分布图,确保训练集和测试集的特征分布没有显著差异。如果差异大,说明你的划分方式有问题。
下面这张图总结了数据准备的整体流程,你一看就明白:
3.4 避坑指南:我踩过的那些坑
做数据准备这么多年,我总结了几条血泪教训:
- 别在清洗前做特征工程——我曾经先做了特征衍生,结果发现原始数据有大量缺失,衍生特征全废了,白费功夫。
- 标签泄露是隐形杀手——比如用"是否提前还款"来预测逾期,这俩在时间上就是重叠的。模型在训练集上表现完美,上线直接崩。
- 测试集要留到最后一刻——我见过有人反复用测试集调参,最后测试集变成了训练集的一部分,评估结果完全失真。
⚠️ 重要提醒: 数据准备阶段花的时间,至少占整个项目的60%。别嫌麻烦,这一步做扎实了,后面调参、上线都会顺很多。我曾经在一个项目里数据清洗做了两周,但模型上线后几乎没出过问题。
好了,数据准备这块就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量决定了模型的天花板,后面的调优只是在这个天花板下努力而已。