4. 特征工程基础:特征类型分类、缺失值处理、异常值检测与处理、特征编码
在构建行情坏账率哨兵模型时,原始数据通常包含大量噪声、缺失值和格式不统一的字段。特征工程是将原始数据转化为模型可理解、可学习的数值特征的关键步骤。本章将系统讲解特征工程中的四大核心环节:特征类型分类、缺失值处理、异常值检测与处理、特征编码。
4.1 特征类型分类
金融数据中的特征通常分为三类,不同类型的特征需要采用不同的处理方法:
| 特征类型 | 定义 | 金融场景示例 | 处理方式 |
|---|---|---|---|
| 数值型特征 | 连续或离散的数值,具有大小和顺序意义 | 贷款金额、用户年龄、历史逾期次数、月收入 | 标准化、归一化、分箱、对数变换 |
| 分类型特征 | 有限个类别,无大小顺序关系 | 性别、职业、所在城市、婚姻状况 | 独热编码、标签编码、目标编码 |
| 有序型特征 | 有限个类别,具有内在顺序关系 | 信用评级(A>B>C)、教育程度(博士>硕士>本科) | 顺序编码、标签编码(保留顺序) |
实战提示:在行情坏账率场景中,数值型特征(如行情波动率、历史坏账率)通常对模型贡献最大,但分类型特征(如行业分类、地区)往往能捕捉到群体性风险,不可忽视。
4.2 缺失值处理
金融数据中缺失值普遍存在,原因包括数据采集失败、用户未填写、系统故障等。缺失值处理不当会导致模型偏差或信息损失。常见处理方法如下:
- 删除法:直接删除包含缺失值的样本或特征。适用于缺失比例极低(<5%)或特征重要性低的情况。
- 均值/中位数填充:用该特征的均值或中位数填充缺失值。适用于数值型特征,对异常值不敏感时优先用中位数。
- 众数填充:用该特征出现频率最高的值填充。适用于分类型特征。
- 前向/后向填充:用时间序列中相邻时刻的值填充。适用于时序数据,如连续多日的行情指标。
- 模型预测填充:将缺失特征作为目标变量,用其他特征训练模型预测缺失值。精度高但计算成本大。
坏账率场景推荐策略:
- 缺失率 < 5%:中位数填充(数值型)或众数填充(分类型)。
- 缺失率 5%~30%:结合业务逻辑填充(如收入缺失用行业平均收入)。
- 缺失率 > 30%:考虑删除该特征,或将其作为独立类别(“未知”)处理。
4.3 异常值检测与处理
异常值会严重干扰XGBoost模型的训练,导致树结构偏向极端值。在金融风控中,异常值可能代表欺诈、数据录入错误或极端市场行情。常用检测方法包括:
| 检测方法 | 原理 | 适用场景 | 阈值示例 |
|---|---|---|---|
| Z-Score法 | 计算数据点与均值的标准差倍数 | 近似正态分布的数据 | |Z| > 3 视为异常 |
| IQR四分位距法 | 基于Q1和Q3的间距判断离群点 | 偏态分布或含异常值的数据 | 超出 [Q1-1.5×IQR, Q3+1.5×IQR] |
| 孤立森林 | 通过随机划分特征空间,异常点更容易被孤立 | 高维数据、非线性分布 | 异常得分 > 0.6 |
| 业务规则 | 基于领域知识设定合理范围 | 有明确业务约束的场景 | 年龄 > 120 或 < 0 |
处理异常值的常用策略:
- 截尾处理(Winsorization):将异常值替换为阈值(如1%和99%分位数)。
- 删除:确认异常值由错误产生时直接删除。
- 单独建模:将异常样本单独分析,不参与主模型训练。
注意:在坏账率预测中,不要盲目删除所有异常值。某些异常值(如突发性高坏账率)可能代表真实风险信号,建议先标记异常值来源,再决定处理方式。
4.4 特征编码
XGBoost只能处理数值型输入,因此所有非数值特征必须转换为数值形式。特征编码是将分类型和有序型特征转化为模型可理解数值的过程。
4.4.1 独热编码(One-Hot Encoding)
将每个类别扩展为一个二进制特征(0或1)。适用于类别数较少(通常 < 20)的分类型特征。
# 示例:将"城市"特征进行独热编码
# 原始:["北京", "上海", "广州"]
# 编码后:
# 北京 → [1, 0, 0]
# 上海 → [0, 1, 0]
# 广州 → [0, 0, 1]
4.4.2 标签编码(Label Encoding)
为每个类别分配一个整数标签。适用于有序型特征(如信用评级A→1, B→2, C→3)。对于无序分类型特征,标签编码会引入虚假顺序关系,需谨慎使用。
4.4.3 目标编码(Target Encoding)
用目标变量(坏账率)的统计量(如均值)替换类别值。能有效捕捉类别与目标的关系,但容易过拟合,需配合交叉验证使用。
# 目标编码示例(Python伪代码)
# 对于特征"行业",计算每个行业的平均坏账率
# 行业A坏账率均值 = 0.05
# 行业B坏账率均值 = 0.12
# 将行业A编码为0.05,行业B编码为0.12
编码选择速查表:
| 特征类型 | 类别数量 | 推荐编码方式 | 原因 |
|---|---|---|---|
| 无序分类 | < 10 | 独热编码 | 避免引入虚假顺序 |
| 无序分类 | 10~50 | 目标编码 + 交叉验证 | 避免维度爆炸 |
| 无序分类 | > 50 | 目标编码或频次编码 | 独热编码会导致特征维度过高 |
| 有序分类 | 任意 | 标签编码(保留顺序) | 利用顺序信息 |
4.5 特征工程实战流程总结
在行情坏账率哨兵项目中,建议按以下顺序执行特征工程:
- 数据加载与概览:读取原始数据,查看特征数量、类型、缺失率。
- 特征类型分类:将特征分为数值型、分类型、有序型,分别记录。
- 缺失值处理:按缺失率分层处理,优先使用中位数/众数填充。
- 异常值检测:使用IQR法或孤立森林检测异常值,结合业务判断处理方式。
- 特征编码:对分类型特征选择合适的编码方法,避免维度灾难。
- 特征缩放(可选):XGBoost对特征尺度不敏感,但标准化有助于加速收敛。
核心原则:特征工程的目标不是“完美数据”,而是“模型友好数据”。在坏账率场景中,保留业务可解释性比追求统计完美更重要。每一步处理都应记录日志,便于后续回溯和调优。