4. 特征工程入门:特征构建思路、时间窗口特征、聚合特征、比率特征

在商户风险评分中,原始数据(如交易流水、商户注册信息)往往无法直接用于模型。特征工程是将原始数据转化为能够有效区分高风险与低风险商户的数值化特征的过程。本章聚焦于四种核心特征构建方法:基础构建思路、时间窗口特征、聚合特征和比率特征。

4.1 特征构建总体思路

特征构建的核心原则是:从业务逻辑出发,量化风险行为模式。构建特征前,需明确以下三个维度:

  • 行为维度:商户的交易行为、登录行为、信息变更行为等。
  • 时间维度:行为发生的时刻、频率、间隔、趋势。
  • 关系维度:商户与关联账户、设备、IP地址之间的关联强度。
避坑提示: 避免直接使用原始字段(如“交易金额”)作为特征。应将其转化为“过去7天交易金额的均值”、“交易金额的日增长率”等具有统计意义的衍生特征。

4.2 时间窗口特征

时间窗口特征是最常用的风险特征之一,用于捕捉商户在特定时间段内的行为变化。窗口类型包括:

窗口类型 定义 风险应用场景
滑动窗口 固定长度的时间段(如过去7天、30天),随时间推移不断更新。 检测近期交易激增、频繁退款等短期异常。
累积窗口 从商户注册或首次交易开始,到当前时间的全部数据。 评估商户全生命周期风险,如累计交易总额、累计投诉次数。
日历窗口 按自然日、周、月划分的固定周期。 对比不同月份的交易活跃度,识别季节性风险。
事件窗口 以特定事件(如密码重置、信息变更)为起点,向后延伸的时间段。 监控事件发生后的风险行为,如变更收款账户后的交易异常。
实战建议: 对于高风险商户,建议使用短窗口(如1小时、24小时)特征;对于低风险商户,长窗口(如90天)特征更具稳定性。通常需要组合多个窗口长度。
时间窗口特征构建流程 原始交易流水 定义窗口类型 计算统计量 滑动窗口 累积窗口 事件窗口 输出:窗口内统计特征 统计量示例: 均值、最大值、标准差

4.3 聚合特征

聚合特征通过对商户的多个维度数据进行分组汇总,将细粒度数据转化为高层次的统计指标。常见的聚合操作包括:

  • 计数聚合:交易笔数、登录次数、退款次数。
  • 金额聚合:交易总额、最大单笔金额、平均金额。
  • 离散度聚合:交易金额标准差、交易时间间隔方差。
  • 唯一值聚合:关联银行卡数、关联IP数、关联设备数。
注意: 聚合特征容易受到极端值影响。在计算均值、标准差前,建议先进行分位数截断(如剔除上下1%的极端值)或使用中位数替代均值。

4.4 比率特征

比率特征通过计算两个相关指标的比值,揭示商户行为的相对强度或异常程度。比率特征能够消除量纲影响,更直观地反映风险倾向。

比率类型 计算公式 风险含义
退款率 退款金额 / 交易总额 高退款率可能暗示虚假交易或商品质量问题。
交易频率 交易笔数 / 活跃天数 频率异常升高可能为刷单或洗钱行为。
大额交易占比 大额交易笔数 / 总交易笔数 占比过高可能涉及非法资金转移。
夜间交易占比 夜间交易金额 / 全天交易金额 夜间交易占比异常可能为自动化脚本操作。
新账户交易占比 新关联账户交易金额 / 总交易金额 占比高可能为账户盗用或团伙欺诈。
实战案例: 某支付平台发现,商户A的退款率从2%突然上升至15%,同时大额交易占比从5%上升至40%。结合时间窗口特征(过去3天交易量激增5倍),模型将该商户风险评分从30分提升至85分,成功拦截了一起团伙欺诈事件。
特征工程核心方法架构 原始商户数据 时间窗口特征 聚合特征 比率特征 组合交叉特征 输出:高区分度风险特征集

4.5 特征构建实战代码示例

以下代码展示了如何使用Python(Pandas)从交易流水表中构建时间窗口特征、聚合特征和比率特征:

import pandas as pd
import numpy as np

# 示例数据:商户交易流水
df = pd.DataFrame({
    'merchant_id': ['M001', 'M001', 'M001', 'M002', 'M002'],
    'trans_date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-10',
                                  '2024-01-01', '2024-01-05']),
    'amount': [100, 200, 5000, 50, 80],
    'is_refund': [0, 0, 1, 0, 0]
})

# 1. 时间窗口特征:过去7天交易总额
df['trans_date'] = pd.to_datetime(df['trans_date'])
df = df.sort_values(['merchant_id', 'trans_date'])
df['amount_7d_sum'] = (df.groupby('merchant_id')['amount']
                       .transform(lambda x: x.rolling(window=7, min_periods=1).sum()))

# 2. 聚合特征:每个商户的交易笔数、平均金额
agg_features = df.groupby('merchant_id').agg(
    total_transactions=('amount', 'count'),
    avg_amount=('amount', 'mean'),
    max_amount=('amount', 'max')
).reset_index()

# 3. 比率特征:退款率
refund_stats = df.groupby('merchant_id')['is_refund'].agg(
    refund_count='sum',
    total_count='count'
).reset_index()
refund_stats['refund_rate'] = refund_stats['refund_count'] / refund_stats['total_count']

# 合并特征
final_features = agg_features.merge(refund_stats[['merchant_id', 'refund_rate']], on='merchant_id')
print(final_features)
讲师提示: 在实际沙盘推演中,建议先构建10-20个基础特征,然后通过特征重要性评估(如随机森林特征重要性、XGBoost增益)筛选出Top 5-10特征,再基于这些特征进行交叉组合,避免特征维度爆炸。