2、特征工程基础:特征类型、质量评估与缺失值处理

特征工程是风控建模的基石。原始数据通常包含大量噪声、不一致和缺失,直接建模会导致模型偏差大、泛化能力差。本章系统讲解特征类型的识别与处理、特征质量评估的核心指标,以及缺失值处理的标准化流程。

2.1 特征类型与处理策略

风控数据中的特征按测量尺度可分为三类,每类对应不同的预处理方法:

特征类型 典型风控字段 常见问题 处理策略
数值型 收入、年龄、负债率、近6月逾期次数 量纲差异大、长尾分布、异常值 标准化/归一化、对数变换、分箱、截尾
类别型 职业、学历、婚姻状况、地区编码 基数高、稀疏类别、新类别泛化 Label Encoding、One-Hot、Target Encoding、频次编码
时序型 申请时间、最近一次逾期日期、账户开立时间 时间跨度不一致、趋势漂移、周期性 衍生距今天数、滑动窗口统计、时间衰减权重
实战建议:风控场景中,类别型特征建议优先使用 Target Encoding(目标编码),将类别映射为历史坏账率,既能保留类别信息,又避免高基数带来的维度灾难。但需注意在训练集内做交叉验证折叠编码,防止标签泄露。

2.2 特征质量评估体系

特征质量直接影响模型效果。评估需从完整性、区分度、稳定性三个维度展开:

  • 完整性(Coverage): 缺失率 < 5% 为优质特征;5%-20% 需填充;> 50% 建议剔除。
  • 区分度(IV / 信息量): IV < 0.02 为弱预测力;0.02-0.1 中等;0.1-0.3 强;> 0.5 需警惕过拟合。
  • 稳定性(PSI / 群体稳定性指标): PSI < 0.1 稳定;0.1-0.25 需监控;> 0.25 特征漂移严重,需重衍或剔除。
质量评估三原则: 缺失率低 + IV高 + PSI低 = 优质特征。三者缺一不可,尤其风控模型上线后,PSI是监控特征退化的第一道防线。
特征质量评估三维度 特征质量评估 完整性(缺失率) <5% 优质 | 5%-20% 填充 | >50% 剔除 区分度(IV值) <0.02弱 | 0.02-0.3强 | >0.5警惕 稳定性(PSI) <0.1稳定 | 0.1-0.25监控 | >0.25漂移 综合决策:保留 / 填充 / 剔除 ⚠ 风控红线:缺失率 > 50% 或 PSI > 0.25 的特征,无论 IV 多高,均不建议入模 因为缺失和漂移会导致线上模型效果断崖式下跌

2.3 数据清洗与缺失值处理

数据清洗是特征工程中最耗时但最关键的环节。风控数据常见问题包括:重复记录、逻辑矛盾、异常值、缺失值。以下聚焦缺失值处理的标准化流程:

2.3.1 缺失机制分类

缺失机制 含义 风控示例 处理建议
MCAR 完全随机缺失 系统随机丢包导致字段为空 可直接删除或简单填充
MAR 随机缺失(依赖其他变量) 高收入人群更倾向不填职业 用回归/模型预测填充
MNAR 非随机缺失(依赖自身) 逾期用户故意不填联系方式 需单独建模或标记缺失模式

2.3.2 缺失值处理策略矩阵

根据特征类型和缺失率,选择最优填充方法:

  • 数值型特征:
    • 缺失率 < 5%:中位数填充(稳健)或均值填充(正态分布时)
    • 缺失率 5%-20%:KNN填充、随机森林填充、多重插补
    • 缺失率 > 20%:将缺失单独编码为-999或-1,保留缺失模式作为新特征
  • 类别型特征:
    • 缺失率 < 5%:众数填充
    • 缺失率 5%-20%:将“缺失”作为独立类别编码
    • 缺失率 > 20%:结合业务逻辑,若缺失本身有区分度则保留为单独类别
  • 时序型特征:
    • 前向填充(ffill)或后向填充(bfill),适用于时间序列连续缺失
    • 线性插值,适用于趋势稳定的时序字段
⚠ 风控特殊处理: 缺失值在风控中往往携带信息。例如“近6个月逾期次数”为空,可能意味着用户无信贷记录(白户),此时填充0会丢失“白户”这一重要风险信号。建议对缺失值单独编码,并衍生“是否缺失”的0/1标志特征。

2.3.3 数据清洗代码示例

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer

# 加载风控样本数据
df = pd.read_csv('credit_data.csv')

# 1. 删除重复记录
df.drop_duplicates(inplace=True)

# 2. 逻辑矛盾清洗:年龄 < 18 或 > 100 视为异常
df = df[(df['age'] >= 18) & (df['age'] <= 100)]

# 3. 缺失率统计
missing_rate = df.isnull().mean().sort_values(ascending=False)
print("缺失率前5特征:\n", missing_rate.head())

# 4. 按缺失率分层处理
for col in df.columns:
    rate = df[col].isnull().mean()
    if rate == 0:
        continue
    elif rate < 0.05:
        # 低缺失率:中位数填充
        if df[col].dtype in ['int64', 'float64']:
            df[col].fillna(df[col].median(), inplace=True)
        else:
            df[col].fillna(df[col].mode()[0], inplace=True)
    elif rate < 0.2:
        # 中等缺失率:KNN填充(仅数值型)
        if df[col].dtype in ['int64', 'float64']:
            imputer = KNNImputer(n_neighbors=5)
            df[[col]] = imputer.fit_transform(df[[col]])
        else:
            df[col].fillna('MISSING', inplace=True)
    else:
        # 高缺失率:保留缺失标志 + 填充固定值
        df[col + '_is_missing'] = df[col].isnull().astype(int)
        df[col].fillna(-999, inplace=True)

print("清洗完成,剩余样本数:", df.shape[0])
缺失值处理决策流程 原始特征 计算缺失率 缺失率 < 5% 中位数 / 众数填充 5% ≤ 缺失率 ≤ 20% KNN / 模型插补 缺失率 > 20% 单独编码 + 缺失标志 输出:完整特征集

2.4 本章小结

  • 特征类型决定预处理方法:数值型需处理量纲和分布,类别型需解决高基数,时序型需衍生时间窗口特征。
  • 特征质量评估需综合 缺失率、IV值、PSI 三个维度,任何一项不达标都应谨慎入模。
  • 缺失值处理没有银弹,需根据缺失机制和缺失率选择策略,风控场景下建议保留缺失标志特征。
  • 数据清洗代码应形成标准化 pipeline,确保训练集和测试集采用相同的填充逻辑。