3. 数据准备:评分数据与标签数据的获取、数据清洗、训练集与测试集划分

数据准备这步,说白了就是决定你模型上限的关键环节。我见过太多人急着调参,结果数据里一堆脏东西,最后模型效果惨不忍睹。今天咱们就把这块彻底捋清楚。

3.1 评分数据与标签数据的获取

先说说数据来源。评分数据通常来自业务系统,比如用户行为日志、交易流水、申请表单。标签数据呢,得靠历史表现来定义——逾期、坏账、欺诈这些。

我个人习惯把数据源分成三类:

数据类别 典型来源 常见字段
用户画像数据 注册信息、实名认证 年龄、性别、职业、收入
行为数据 APP埋点、浏览日志 登录频次、页面停留时长、点击率
交易数据 支付系统、账务系统 交易金额、交易频次、逾期天数
外部数据 征信机构、黑名单库 征信评分、多头借贷数、法院执行记录

获取标签时有个坑——观察期和表现期必须对齐。比如你用过去6个月的行为预测未来3个月是否逾期,那标签就得取未来3个月的实际表现。我在项目中遇到过有人把时间窗口搞反了,结果模型在线上完全失效,嗯,那叫一个惨。

⚠️ 注意: 标签定义要跟业务方对齐。逾期30天和逾期90天,在风控策略里完全是两码事。别自己闷头定义,回头业务不认。

3.2 数据清洗:别让脏数据毁了你的模型

数据清洗是体力活,但也是最能体现功力的地方。我一般按下面几步走:

  1. 缺失值处理:先看缺失比例。低于5%的直接删除或填充均值;超过30%的字段,我建议直接扔掉,或者单独做缺失标志位。
  2. 异常值检测:用箱线图或3σ原则。比如年龄字段出现200岁,那肯定是脏数据。
  3. 重复数据去重:同一个用户多条记录,保留最新一条。
  4. 逻辑校验:比如注册时间晚于逾期时间,这种明显矛盾的数据要剔除。

给你看段我常用的清洗代码:

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检验或直接画分布图,确保训练集和测试集的特征分布没有显著差异。如果差异大,说明你的划分方式有问题。

下面这张图总结了数据准备的整体流程,你一看就明白:

数据准备核心流程 数据获取 数据清洗 特征工程 训练集 / 验证集 / 测试集 划分 训练集 (80%) 验证集 (10%) 测试集 (10%) 💡 按时间划分:前80%做训练,中间10%做验证,最后10%做测试 避免随机划分导致的时间穿越问题

3.4 避坑指南:我踩过的那些坑

做数据准备这么多年,我总结了几条血泪教训:

  • 别在清洗前做特征工程——我曾经先做了特征衍生,结果发现原始数据有大量缺失,衍生特征全废了,白费功夫。
  • 标签泄露是隐形杀手——比如用"是否提前还款"来预测逾期,这俩在时间上就是重叠的。模型在训练集上表现完美,上线直接崩。
  • 测试集要留到最后一刻——我见过有人反复用测试集调参,最后测试集变成了训练集的一部分,评估结果完全失真。
⚠️ 重要提醒: 数据准备阶段花的时间,至少占整个项目的60%。别嫌麻烦,这一步做扎实了,后面调参、上线都会顺很多。我曾经在一个项目里数据清洗做了两周,但模型上线后几乎没出过问题。

好了,数据准备这块就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量决定了模型的天花板,后面的调优只是在这个天花板下努力而已。