4. 特征工程基础:特征类型分类、缺失值处理、异常值检测与处理、特征编码

在构建行情坏账率哨兵模型时,原始数据通常包含大量噪声、缺失值和格式不统一的字段。特征工程是将原始数据转化为模型可理解、可学习的数值特征的关键步骤。本章将系统讲解特征工程中的四大核心环节:特征类型分类、缺失值处理、异常值检测与处理、特征编码。

4.1 特征类型分类

金融数据中的特征通常分为三类,不同类型的特征需要采用不同的处理方法:

特征类型 定义 金融场景示例 处理方式
数值型特征 连续或离散的数值,具有大小和顺序意义 贷款金额、用户年龄、历史逾期次数、月收入 标准化、归一化、分箱、对数变换
分类型特征 有限个类别,无大小顺序关系 性别、职业、所在城市、婚姻状况 独热编码、标签编码、目标编码
有序型特征 有限个类别,具有内在顺序关系 信用评级(A>B>C)、教育程度(博士>硕士>本科) 顺序编码、标签编码(保留顺序)
实战提示:在行情坏账率场景中,数值型特征(如行情波动率、历史坏账率)通常对模型贡献最大,但分类型特征(如行业分类、地区)往往能捕捉到群体性风险,不可忽视。

4.2 缺失值处理

金融数据中缺失值普遍存在,原因包括数据采集失败、用户未填写、系统故障等。缺失值处理不当会导致模型偏差或信息损失。常见处理方法如下:

  1. 删除法:直接删除包含缺失值的样本或特征。适用于缺失比例极低(<5%)或特征重要性低的情况。
  2. 均值/中位数填充:用该特征的均值或中位数填充缺失值。适用于数值型特征,对异常值不敏感时优先用中位数。
  3. 众数填充:用该特征出现频率最高的值填充。适用于分类型特征。
  4. 前向/后向填充:用时间序列中相邻时刻的值填充。适用于时序数据,如连续多日的行情指标。
  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%分位数)。
  • 删除:确认异常值由错误产生时直接删除。
  • 单独建模:将异常样本单独分析,不参与主模型训练。
注意:在坏账率预测中,不要盲目删除所有异常值。某些异常值(如突发性高坏账率)可能代表真实风险信号,建议先标记异常值来源,再决定处理方式。
异常值检测与处理流程 原始特征数据 Z-Score 法 IQR 四分位距法 孤立森林 业务规则 是否判定为异常值? 截尾处理(Winsorization) 删除异常样本 标记为独立类别 清洗后的特征数据

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 目标编码或频次编码 独热编码会导致特征维度过高
有序分类 任意 标签编码(保留顺序) 利用顺序信息
特征编码方法对比 原始分类特征 独热编码 每个类别一个二进制列 标签编码 每个类别一个整数标签 目标编码 用目标均值替换类别 数值型特征矩阵 维度可控,信息保留 数值型特征矩阵 保留顺序信息 数值型特征矩阵 与目标强相关 编码选择建议 • 类别数少(<10)且无序 → 独热编码 • 类别数多(>50)或有序 → 目标编码或标签编码 • 目标编码必须配合交叉验证,防止过拟合

4.5 特征工程实战流程总结

在行情坏账率哨兵项目中,建议按以下顺序执行特征工程:

  1. 数据加载与概览:读取原始数据,查看特征数量、类型、缺失率。
  2. 特征类型分类:将特征分为数值型、分类型、有序型,分别记录。
  3. 缺失值处理:按缺失率分层处理,优先使用中位数/众数填充。
  4. 异常值检测:使用IQR法或孤立森林检测异常值,结合业务判断处理方式。
  5. 特征编码:对分类型特征选择合适的编码方法,避免维度灾难。
  6. 特征缩放(可选):XGBoost对特征尺度不敏感,但标准化有助于加速收敛。
核心原则:特征工程的目标不是“完美数据”,而是“模型友好数据”。在坏账率场景中,保留业务可解释性比追求统计完美更重要。每一步处理都应记录日志,便于后续回溯和调优。