3、特征工程基础:基础统计特征、时间序列特征、业务衍生特征
大家好,我是你们的老朋友。今天咱们聊聊特征工程里最基础、也最实用的一块——怎么从原始交易数据里,挖出那些能“说话”的特征。
说实话,我见过不少新人一上来就堆模型,结果效果差得离谱。为什么?因为特征没做好。你想想看,模型再牛,喂进去的是垃圾,出来的只能是更精致的垃圾。所以,特征工程这事儿,值得咱们花功夫。
3.1 基础统计特征:均值、方差、分位数
基础统计特征,说白了就是描述数据“长什么样”的指标。它们简单,但非常有效。
3.1.1 均值(Mean)
均值就是平均值。在异常交易里,均值能帮我们快速定位“异常高”或“异常低”的行为。
举个例子,一个用户过去30天平均每天交易5笔。如果某天突然交易了50笔,那均值就告诉你——这不对劲。
3.1.2 方差(Variance)与标准差(Std)
方差衡量数据的波动程度。标准差是方差的平方根,更直观。
我在项目中遇到过这样一个坑:有个用户的交易笔数均值正常,但方差特别大。什么意思?他平时可能一天0笔,突然一天100笔,然后又0笔。这种“脉冲式”行为,往往是盗刷的典型特征。
3.1.3 分位数(Quantile)
分位数比均值更稳健。比如中位数(50%分位数),它不受极端值影响。
我个人习惯用四分位数(Q1、Q2、Q3)来构建特征。比如:
- 交易金额的90%分位数:如果某笔交易金额超过了这个值,那它属于“大额交易”的概率很高。
- 交易时间的25%分位数:如果用户在凌晨3点交易,而历史数据显示他95%的交易都在白天,那这个时间点就值得怀疑。
嗯,这里要注意:分位数特征在构建时,一定要用滑动窗口来计算,不能直接用全量数据。否则会有未来信息泄露的问题。
3.2 时间序列特征:差分、滑动平均
交易数据天然是时间序列。时间序列特征能捕捉到“趋势”和“周期性”。
3.2.1 差分(Differencing)
差分就是当前值减去上一个值。它能消除趋势,让数据变得平稳。
举个例子,用户A的交易金额一直在增长,从100到200到300。差分后就是100、100、100。这样模型就能更关注“变化量”,而不是绝对值。
# 一阶差分示例
import pandas as pd
df['amount_diff'] = df['amount'].diff(1)
我曾经在反欺诈项目里用过二阶差分。当时有个团伙作案,他们故意让交易金额缓慢增长,一阶差分看不出来。但二阶差分一算,增长加速度异常,直接暴露了。
3.2.2 滑动平均(Moving Average)
滑动平均能平滑短期波动,突出长期趋势。常用的有简单滑动平均(SMA)和指数加权滑动平均(EWMA)。
我个人更推荐EWMA。为什么?因为它给近期的数据更高的权重,对变化更敏感。在异常检测里,我们往往更关心“最近发生了什么”。
# 指数加权滑动平均示例
df['amount_ewma'] = df['amount'].ewm(span=7, adjust=False).mean()
你想想看,如果一个用户过去7天的滑动平均交易金额是500,今天突然变成5000,那这个偏离度就是一个非常强的特征。
3.3 业务衍生特征
这部分最考验对业务的理解。说白了,就是要把业务知识“翻译”成模型能懂的数值。
3.3.1 时间窗口特征
比如“过去1小时内交易次数”、“过去24小时内交易总金额”。这些特征能捕捉到“短时间内高频交易”这种异常行为。
我记得有一次,一个用户过去30天每天交易不超过3笔。但某天他在10分钟内交易了15笔。这个“过去10分钟交易次数”特征,直接让模型给出了99%的异常概率。
3.3.2 比率特征
比率特征能消除量纲影响。比如:
- 交易金额 / 账户余额:如果这个比率接近1,说明用户几乎把全部余额都转走了,这很可疑。
- 交易次数 / 登录次数:如果用户登录一次就交易很多笔,可能是机器在操作。
3.3.3 设备与行为特征
比如“是否使用新设备”、“IP地址是否在常用城市”。这些特征虽然简单,但往往能直接命中异常。
我曾经遇到过一个案例:用户A的账号在1分钟内,从北京和纽约同时发起交易。这个“IP距离”特征,直接锁定了盗刷行为。
3.4 知识体系总览
下面这张图,是我自己总结的特征工程核心框架。你可以把它当作一个检查清单,做特征时对照着看,不容易漏。
3.5 实战建议
最后,给你几个我在实战中总结的经验:
- 先做基础统计特征,它们计算快、解释性强,能快速验证你的数据质量。
- 时间序列特征要配合窗口大小。窗口太小,噪声大;窗口太大,反应慢。我一般从7天、30天开始试。
- 业务衍生特征要跟业务方对齐。别自己闷头造特征,多问问运营同学“你们平时怎么判断异常?”他们的经验往往能直接转化成特征。
好了,这一章的内容就到这里。特征工程是门手艺活,多练、多总结,你也能成为高手。