第二章:数据准备与探索
数据准备,说白了就是风控建模的「地基」。
我见过太多团队,模型算法选得花里胡哨,结果数据源一塌糊涂,最后模型上线就崩。嗯,这章咱们就聊聊怎么打好这个地基。
2.1 数据源介绍
金融欺诈数据,来源其实挺固定的。我个人习惯把它们分成三类:
- 内部业务数据:用户注册信息、交易流水、历史借贷记录。这是最核心的,因为真实、可控。
- 外部征信数据:央行征信、百行征信、同盾等第三方数据。用来补充用户在其他平台的信用表现。
- 行为与设备数据:IP地址、设备指纹、操作轨迹。这块容易被忽略,但抓欺诈团伙特别管用。
我在项目中遇到过一家P2P公司,内部数据很干净,但欺诈率还是高。后来一查,发现他们没接设备指纹数据,团伙用同一台手机注册了几百个账号。你想想看,这数据源缺了,模型再强也白搭。
核心原则:数据源不是越多越好,而是「能用、可信、合规」。
2.2 数据采集策略
采集策略,说白了就是「怎么把数据拿回来,还不惹麻烦」。
我建议按这个顺序来:
- 明确采集字段:先列清单,哪些是建模必须的,哪些是可选的。别一股脑全拉,数据量大还容易出隐私问题。
- 确定采集频率:交易数据实时采集,征信数据按天或按周。频率太高,存储扛不住;频率太低,模型滞后。
- 合规审查:用户授权了吗?数据脱敏了吗?我曾经有个项目,因为没拿到用户授权书,模型上线当天就被监管叫停。嗯,这坑我踩过。
小技巧:采集时加个「数据血缘标签」,记录每一条数据从哪来、谁处理的。后面排查问题会省很多时间。
2.3 数据质量检查
数据质量,是风控建模的「命门」。
我一般会检查这几个维度:
| 检查维度 | 具体内容 | 常见问题 |
|---|---|---|
| 完整性 | 缺失率、空值比例 | 用户收入字段缺失30%以上 |
| 准确性 | 数值范围、格式校验 | 年龄出现200岁,手机号少一位 |
| 一致性 | 跨表字段逻辑是否矛盾 | 注册时间晚于交易时间 |
| 时效性 | 数据是否滞后 | 征信报告是3个月前的 |
举个例子,我检查过一份数据,用户「年龄」字段居然有-5岁。这种数据不清理,模型学出来的东西你敢信?
注意:缺失率超过50%的字段,建议直接剔除。别想着用均值填充,那会引入偏差。
2.4 EDA(探索性数据分析)实战
EDA,说白了就是「先看看数据长什么样」。
我习惯用Python做EDA,核心就三步:
2.4.1 单变量分析
先看每个字段的分布。连续变量看均值、中位数、标准差;分类变量看频次、占比。
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
df = pd.read_csv('fraud_data.csv')
# 连续变量描述统计
print(df['transaction_amount'].describe())
# 分类变量频次
print(df['channel'].value_counts())
为什么会这样?因为单变量分析能快速发现异常值。比如交易金额字段,如果最大值是1亿,那大概率是录入错误。
2.4.2 双变量分析
看特征和目标变量(是否欺诈)的关系。连续变量用箱线图,分类变量用堆叠柱状图。
# 连续变量与目标
df.boxplot(column='transaction_amount', by='is_fraud')
# 分类变量与目标
pd.crosstab(df['channel'], df['is_fraud'])
我记得有一次,发现「夜间交易」这个特征,欺诈率是白天的3倍。嗯,这个特征后来成了模型里的重要变量。
2.4.3 缺失值与相关性
最后看缺失值热力图和相关性矩阵。缺失值多的字段,要么补要么删;相关性高的特征,容易导致模型过拟合。
# 缺失值热力图
import seaborn as sns
sns.heatmap(df.isnull(), cbar=False)
# 相关性矩阵
corr = df.corr()
sns.heatmap(corr, annot=True)
实战建议:EDA不是一次性工作。我习惯每拿到一批新数据,都跑一遍EDA。数据质量会变,模型也得跟着调。
2.5 本章知识体系
下面这张图,是我自己总结的数据准备与探索流程。你照着走,基本不会漏。
这张图的核心逻辑是:数据源→采集→质量检查→EDA→清洗→再检查,直到数据干净为止。别想着一步到位,数据准备就是个迭代活。
一句话总结:数据准备占风控建模60%的时间,但值得。数据干净了,模型自然就稳了。
公众号:蓝海资料掘金营,微信deep3321