4. 单变量特征构造:数值型、类别型、时间型

单变量特征构造是授信决策引擎中最基础、最高频的操作。原始字段(如交易金额、职业、申请日期)往往不能直接用于模型,需要经过变换、编码或派生才能转化为有效特征。本章按数据类型分别讲解核心构造方法,并给出实战中的避坑指南。

核心原则:单变量构造的目标是提升特征的区分度(IV)与稳定性(PSI),同时保持业务可解释性。不要为了复杂度而构造冗余特征。
单变量特征构造全景图 原始字段 数值型特征 金额:log、分箱、截尾 比率:负债率、收入比 差值:额度-已用、距上次 类别型特征 WOE编码:证据权重 One-Hot:虚拟变量 Label Encoding:序数映射 时间型特征 距今天数:逾期天数 月份:季节性效应 星期:还款行为模式

4.1 数值型特征构造

数值型特征(金额、比率、差值)是信用评分模型的主力。原始数值往往存在长尾分布、量纲差异或非线性关系,需要针对性变换。

4.1.1 金额类特征

  • 对数变换(Log Transform):对收入、额度、交易金额等右偏分布做 log(1+x) 变换,使分布接近正态,提升线性模型拟合效果。
  • 分箱(Binning):将连续金额离散化为等距箱、等频箱或最优分箱(基于IV最大化)。分箱后可直接作为类别特征或计算WOE。
  • 截尾处理(Winsorization):对极端值按 1%/99% 分位数截断,防止离群点主导模型。

4.1.2 比率类特征

比率特征天然消除量纲,反映客户的偿债能力和资金效率。常用比率包括:

比率名称计算公式业务含义
负债收入比(DTI)月总负债 / 月收入偿债压力,越高风险越大
额度使用率已用额度 / 授信总额度资金紧张程度,>80% 为高风险信号
收入稳定性比近6月收入标准差 / 均值收入波动性,越高越不稳定
还款金额比实际还款额 / 应还最低额还款意愿,<1 为逾期预警

4.1.3 差值类特征

  • 额度差值:授信总额度 - 已用额度,反映可用资金空间。
  • 距上次还款天数:当前日期 - 最近一次还款日期,间隔越长逾期概率越高。
  • 收入-支出差值:月收入 - 月固定支出,衡量可支配现金流。
实战建议:构造比率和差值时,注意分母不能为零(加极小值平滑),且差值特征通常需要做标准化或分箱后再入模。

4.2 类别型特征编码

类别型特征(职业、学历、地区、婚姻状况)不能直接输入模型,必须转换为数值。三种主流编码方式各有适用场景。

4.2.1 WOE编码(Weight of Evidence)

WOE编码是信用评分领域最推荐的类别编码方式,它直接与目标变量(好坏客户)的分布挂钩,具有天然的排序和单调性优势。

# WOE编码计算示例(Python伪代码)
import numpy as np

def calc_woe(df, feature, target):
    # target: 1=坏客户, 0=好客户
    total_good = df[target].sum()
    total_bad = len(df) - total_good
    woe_dict = {}
    for cat in df[feature].unique():
        sub = df[df[feature] == cat]
        good_cnt = sub[target].sum()
        bad_cnt = len(sub) - good_cnt
        # 平滑处理避免除零
        good_dist = (good_cnt + 0.5) / (total_good + 0.5)
        bad_dist = (bad_cnt + 0.5) / (total_bad + 0.5)
        woe = np.log(good_dist / bad_dist)
        woe_dict[cat] = woe
    return woe_dict
编码方式适用场景优点缺点
WOE编码逻辑回归、评分卡与目标单调相关、可解释性强、处理缺失值对低频类别敏感,需合并
One-Hot编码树模型、神经网络无顺序假设、完整保留类别信息维度爆炸、稀疏矩阵
Label Encoding有序类别(学历、评级)节省内存、保留序数关系无序类别会引入虚假顺序

4.2.2 One-Hot编码

将每个类别扩展为一个二元虚拟变量(0/1)。适用于类别数较少(通常 < 20)且无自然顺序的场景,如婚姻状况、产品类型。注意:当类别过多时会导致维度灾难,建议先做低频合并。

4.2.3 Label Encoding

将类别映射为整数(如小学=1、初中=2、高中=3)。仅适用于有序类别,如学历等级、信用评级。对无序类别(如职业、城市)使用Label Encoding会误导模型认为类别间存在数值大小关系,应避免。

常见错误:对无序类别(如省份、职业)使用Label Encoding后直接入模,导致模型学到错误的数值顺序。正确做法:无序类别用WOE或One-Hot,有序类别才用Label Encoding。

4.3 时间型特征构造

时间型特征(申请日期、还款日、出生日期)不能直接作为数值输入,需要转化为有意义的派生特征。时间特征能捕捉季节性、行为周期和时效性。

4.3.1 距今天数(Recency)

最常用的时间派生特征,反映事件距今的远近。典型应用:

  • 距最近逾期天数:距离最近一次逾期记录的天数,越近风险越高。
  • 账户开立天数:从开户到当前日期的天数,衡量信用历史长度。
  • 距上次申请天数:多次申请间隔,频繁申请(短间隔)是资金紧张信号。

4.3.2 月份与季节

提取申请或交易发生的月份(1-12),用于捕捉季节性效应。例如:春节前后消费贷需求上升,年底逾期率通常偏高。月份特征可作为类别特征(WOE编码)或循环特征(sin/cos变换)入模。

4.3.3 星期与工作日

提取星期几(0-6)或是否为工作日/周末。行为模式差异:周末申请贷款的用户逾期率可能高于工作日申请的用户;还款日落在周末的还款延迟概率更高。

# 时间特征构造示例(Python)
import pandas as pd
from datetime import datetime

def create_time_features(df, date_col):
    df['申请日期'] = pd.to_datetime(df[date_col])
    ref_date = datetime.now()  # 或使用固定参考日期
    df['距今天数'] = (ref_date - df['申请日期']).dt.days
    df['申请月份'] = df['申请日期'].dt.month
    df['申请星期'] = df['申请日期'].dt.weekday
    df['是否周末'] = df['申请星期'].isin([5,6]).astype(int)
    return df
时间型特征构造流程 原始时间字段 距今天数 距逾期天数 账户开立天数 月份/季节 季节性效应 年底逾期率上升 星期/工作日 周末申请行为 还款日落在周末

4.4 单变量构造避坑清单

数据类型常见错误正确做法
数值型(金额)直接使用原始金额,忽略长尾分布做log变换或分箱,截尾处理极端值
数值型(比率)分母可能为零导致无穷值加极小值(如0.001)平滑处理
类别型(无序)使用Label Encoding引入虚假顺序使用WOE编码或One-Hot编码
类别型(低频)低频类别单独成箱,WOE不稳定合并到“其他”类别,或做频次阈值过滤
时间型直接使用日期字符串或时间戳转化为距今天数、月份、星期等派生特征
时间型(星期)将星期作为数值0-6直接入模做One-Hot或sin/cos循环编码
本章小结:单变量特征构造是特征工程的基石。数值型特征重变换与分箱,类别型特征重编码选择,时间型特征重派生与周期捕捉。掌握这三种数据类型的构造方法,能为后续多变量交叉特征和模型训练打下坚实基础。