3. 数据采集与特征工程基础:内部数据与外部数据源、数据清洗与缺失值处理、特征构造方法(聚合、衍生、交叉)、特征选择(IV值、相关性分析)
在授信决策引擎的构建中,数据是模型的生命线。本章将系统讲解从数据采集、清洗、特征构造到特征选择的完整流程,确保后续模型训练能够基于高质量、高区分度的特征进行。
3.1 数据源体系:内部数据与外部数据
授信模型的数据来源主要分为内部数据和外部数据两大类。内部数据通常具有高准确性和强相关性,而外部数据则用于补充信息维度,提升模型的覆盖面和预测能力。
| 数据类别 | 典型数据源 | 核心字段示例 | 优势与挑战 |
|---|---|---|---|
| 内部数据 | 核心系统、交易流水、历史信贷记录、客户关系管理(CRM) | 客户ID、申请金额、历史还款行为、逾期天数、账户余额、交易频次 | 优势:准确度高、实时性强、合规风险低 挑战:数据孤岛、历史数据缺失、样本偏差 |
| 外部数据 | 央行征信、百行征信、第三方数据(运营商、电商、社保、税务) | 征信报告、多头借贷记录、消费行为、收入验证、黑名单 | 优势:丰富维度、覆盖长尾客群 挑战:成本高、数据质量参差、合规与隐私风险 |
实践建议:在授信决策中,内部数据应作为核心基础,外部数据作为补充增强。优先确保内部数据的完整性和一致性,再根据业务场景选择性价比最高的外部数据源。
3.2 数据清洗与缺失值处理
原始数据通常包含噪声、异常值和缺失值,必须经过清洗才能用于建模。数据清洗是特征工程中最耗时但最重要的环节。
3.2.1 数据清洗核心步骤
- 格式标准化:统一日期格式(如 YYYY-MM-DD)、金额单位(元/万元)、分类编码。
- 异常值检测与处理:使用箱线图(IQR)或 Z-Score 识别异常值,根据业务逻辑进行截尾或剔除。
- 重复记录去重:基于唯一标识(如客户ID、申请编号)删除完全重复或高度相似的记录。
- 逻辑校验:检查字段间的逻辑一致性,如“申请日期”不应晚于“审批日期”。
3.2.2 缺失值处理策略
| 缺失率 | 推荐策略 | 适用场景 |
|---|---|---|
| < 5% | 直接删除(行删除)或均值/中位数填充 | 缺失完全随机,样本量充足 |
| 5% - 30% | 统计量填充(均值/中位数/众数)、模型预测填充(KNN、回归) | 缺失与其它特征相关,有预测能力 |
| > 30% | 单独作为一类(如“未知”类别)、或删除该特征 | 缺失可能包含信息,或特征重要性低 |
代码示例:缺失值处理(Python)
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
# 示例数据
df = pd.DataFrame({
'age': [25, np.nan, 35, 40, np.nan],
'income': [5000, 8000, np.nan, 12000, 15000],
'loan_amount': [10000, 20000, 15000, np.nan, 25000]
})
# 数值型特征:使用中位数填充
num_imputer = SimpleImputer(strategy='median')
df[['age', 'income']] = num_imputer.fit_transform(df[['age', 'income']])
# 分类型特征:使用众数填充
cat_imputer = SimpleImputer(strategy='most_frequent')
df[['loan_amount']] = cat_imputer.fit_transform(df[['loan_amount']])
print(df)
3.3 特征构造方法
特征构造是将原始数据转化为更能体现业务规律和预测能力的特征的过程。常用的方法包括聚合特征、衍生特征和交叉特征。
3.3.1 聚合特征
基于时间窗口或分组进行统计计算,常用于交易流水、行为日志等明细数据。
- 时间窗口聚合:近3个月、6个月、12个月的交易总额、交易次数、最大单笔金额。
- 分组聚合:按客户ID分组,计算平均消费金额、消费频次标准差。
- 比率特征:近3个月逾期次数 / 总借款次数(逾期率)。
3.3.2 衍生特征
基于业务逻辑对现有字段进行变换或组合,挖掘深层信息。
- 时间衍生:年龄(出生日期→当前日期)、账户开立时长、距离上次还款天数。
- 文本衍生:职业编码映射为收入等级、公司名称提取行业类别。
- 数学变换:对数变换(处理长尾分布)、平方根变换、分箱(如年龄分段)。
3.3.3 交叉特征
将两个或多个特征组合,捕捉交互效应,提升模型非线性表达能力。
- 笛卡尔积:性别 × 职业类别 → 生成“男性-工程师”、“女性-医生”等组合。
- 数值乘积:收入 × 信用评分(综合还款能力指标)。
- 多项式特征:年龄²、收入 × 年龄。
注意:交叉特征会显著增加特征维度,容易导致过拟合。建议结合业务经验筛选有意义的交叉组合,或使用树模型自动学习交互关系。
3.4 特征选择:IV值与相关性分析
特征构造完成后,通常会产生大量候选特征。特征选择旨在剔除冗余、无关或噪声特征,提升模型性能、降低过拟合风险并增强可解释性。
3.4.1 IV值(Information Value)
IV值用于衡量特征对二元目标变量(如“好客户”vs“坏客户”)的区分能力。在信用评分卡模型中,IV值是特征筛选的核心指标。
| IV值范围 | 预测能力 | 处理建议 |
|---|---|---|
| < 0.02 | 无预测能力 | 建议剔除 |
| 0.02 - 0.10 | 弱预测能力 | 可保留,但需结合业务判断 |
| 0.10 - 0.30 | 中等预测能力 | 推荐保留 |
| 0.30 - 0.50 | 强预测能力 | 优先保留 |
| > 0.50 | 极强(需警惕过拟合) | 需验证稳定性,防止过拟合 |
IV值计算步骤:
- 将连续特征分箱(如等频分箱或决策树分箱)。
- 计算每个分箱的好客户占比(%Good)和坏客户占比(%Bad)。
- 计算WOE(Weight of Evidence):WOE = ln(%Good / %Bad)。
- 计算IV值:IV = Σ[(%Good - %Bad) × WOE]。
import pandas as pd
import numpy as np
def calc_iv(df, feature, target):
# 分箱(此处使用等频分箱示例)
df['bin'] = pd.qcut(df[feature], q=10, duplicates='drop')
grouped = df.groupby('bin')[target].agg(['count', 'sum'])
grouped.columns = ['total', 'bad']
grouped['good'] = grouped['total'] - grouped['bad']
grouped['pct_good'] = grouped['good'] / grouped['good'].sum()
grouped['pct_bad'] = grouped['bad'] / grouped['bad'].sum()
grouped['woe'] = np.log(grouped['pct_good'] / grouped['pct_bad'])
grouped['iv'] = (grouped['pct_good'] - grouped['pct_bad']) * grouped['woe']
return grouped['iv'].sum()
# 示例调用
# iv_value = calc_iv(df, 'income', 'default_flag')
# print(f'IV = {iv_value:.4f}')
3.4.2 相关性分析
相关性分析用于检测特征之间的线性或单调关系,避免多重共线性影响模型稳定性。
- 皮尔逊相关系数:衡量线性相关性,取值范围[-1, 1]。|r| > 0.7 视为强相关,建议保留其中一个或进行降维。
- 斯皮尔曼秩相关系数:衡量单调关系,适用于非线性但单调的场景。
- 方差膨胀因子(VIF):VIF > 10 表示存在严重多重共线性,需处理。
| 方法 | 适用场景 | 阈值 | 处理方式 |
|---|---|---|---|
| 皮尔逊相关系数 | 连续变量,线性关系 | |r| > 0.7 | 删除其中一个或使用PCA |
| 斯皮尔曼相关系数 | 连续/有序变量,单调关系 | |ρ| > 0.7 | 删除其中一个或保留业务意义更强的 |
| 方差膨胀因子(VIF) | 线性回归模型 | VIF > 10 | 逐步剔除VIF最高的特征 |
最佳实践:特征选择应结合IV值和相关性分析。先使用IV值筛选出预测能力强的特征,再通过相关性分析剔除冗余特征,最终保留一组高区分度、低冗余的特征子集。