特征工程:IP特征、时间特征、请求特征提取与选择
做异常访问识别,选好特征比算法本身更重要。
我入行那会儿,有个同事花三个月调模型,最后发现是特征没选对,全白干了。特征工程说白了,就是把你手里的原始数据转化成模型能听懂的语言。这个环节要是偷懒,后面的模型再花哨也白搭。
特征工程的核心目标
我们做异常检测,特征工程要达到三个目的:
- 区分性:正常和异常在特征空间里要能拉开距离
- 稳定性:特征分布不会三天两头变
- 可解释性:出问题了,你得能说清楚为什么这个请求被判异常
我个人习惯,每个特征建完之后都会先画个分布图看看。如果正常样本和异常样本的特征分布完全重叠,那这个特征基本就是废的。
IP 特征提取
IP特征是做异常检测最基础的特征。你想想看,一个IP在短时间内发出几百次请求,这正常吗?
我记得有一次线上告警,某个IP一小时内请求了3000多次。查了半天,发现是个爬虫在扫我们的订单接口。
基础IP特征
- 地理位置:IP所属的国家、城市、运营商。业务主要在国内,突然冒出来个海外IP,就得留意了。
我曾经处理过一个案例:某IP来自南美一个小国,但我们业务根本没在那里开展。这种IP基本可以判定为异常。
- 历史行为:这个IP在过去24小时、7天、30天内的访问次数。如果突然暴增,很可能是机器在扫。
- IP类型:是家庭宽带、数据中心、还是VPN/代理?数据中心IP和代理IP是异常访问的高发区。
衍生IP特征
基础特征好理解,但有时候不够用。我个人习惯会再加工一下:
| 特征名称 | 计算方式 | 业务含义 |
|---|---|---|
| IP访问频次 | 单位时间内请求次数 | 判断是否爬虫/扫接口 |
| IP分散度 | 该IP访问了多少不同URL | 正常用户访问集中,爬虫到处乱点 |
| IP关联账号数 | 该IP绑定了多少个账号 | 一个IP对应几十个账号,典型异常 |
实际经验:IP特征有个坑——NAT环境下,多个真实用户共享同一个公网IP。这时候单纯看IP频次会误杀。我一般会加个端口号做辅助判断,同一个IP但端口范围分散的,更像是正常用户。
时间特征提取
时间特征是我觉得最有意思的一块。异常行为在时间上常常有规律,或者说,有反规律。
时间窗口统计
说白了,就是把时间切成段,看每个段里的行为模式:
- 固定窗口:比如1分钟、5分钟、1小时内请求数。适合检测突发流量。
- 滑动窗口:每10秒统计最近1分钟的数据。比固定窗口更灵敏。
- 时段对比:凌晨2点到5点的请求占比。正常用户这个时段几乎不活动,但爬虫可不管白天黑夜。
我做过一个实验:把凌晨时段的请求单独拎出来,异常比例是白天时段的15倍。这个特征在模型里权重特别高。
时间间隔特征
这个很多人会忽略,但其实特别好用:
- 请求间隔的均值与方差:机器人的请求间隔通常非常均匀,比如每500ms一次。人类操作则是随机的,有时快有时慢。
- 相邻请求的时间差:如果连续10个请求的时间差都在50ms以内,基本可以判定是脚本在跑。
避坑指南:时间特征容易受网络延迟影响。我记得有一次模型把某些正常用户判成异常,排查发现是5G网络波动导致请求间隔异常稳定。后来我加了个平滑处理——取中位数而不是平均值,效果就好多了。
请求特征提取
请求特征是承载业务语义最丰富的部分。一个请求里包含了用户想干什么、用什么干的、怎么干的。
URL 特征
- URL 长度:正常请求的URL通常比较短,异常请求有时会带很长的参数。
- 参数数量:一个接口正常情况下参数个数是固定的,突然多出来几个,可能是在试探。
- 路径层级:深度遍历目录结构,是爬虫的典型行为。
User-Agent 特征
这里有个小技巧:看 User-Agent 的多样性。
正常用户的 UA 五花八门,Windows/Mac/iOS/Android什么都有。如果一个 IP 发出的所有请求 UA 都一样,或者好几天都不变,你想想看,这合理吗?
请求参数特征
参数特征是判定注入攻击的关键:
- 是否包含 SQL 关键字(select、union、drop 等)
- 是否包含敏感路径(../../etc/passwd 这种)
- 参数值是否为异常类型(本该传数字,传了个字符串)
重点:我见过一个案例,某 IP 发送的请求里 user_id 参数一直是 "admin" 或 "root"。这种特征一提取,模型立刻就能识别出来。说白了,异常行为在请求参数上往往会留下痕迹。
特征选择方法
特征造了一大堆,不是全扔进模型就完了。特征选择这步,能帮你省时间、提效果。
过滤式方法
先算特征和目标变量的相关性,留下相关性高的:
- 方差阈值:方差太小的特征,所有样本取值都差不多,这种特征没什么区分度。
- 卡方检验:适合分类问题,看看特征和类别是不是独立。
- 互信息:衡量特征对类别的不确定性减少程度。
包裹式方法
把特征子集拿去跑模型,看效果。效果好就留,不好就扔。
这种方法计算量大,但结果通常更好。我个人习惯是先拿随机森林跑一轮特征重要性排序,然后再用包裹式方法精细调整。
嵌入式方法
训练过程中自动完成特征选择。像 Lasso 回归、树模型都有这种能力。
我通常的做法是:先用树模型跑一轮,挑出重要性排名前20的特征,再结合业务经验做人工筛选。
| 方法类型 | 代表算法 | 优点 | 缺点 |
|---|---|---|---|
| 过滤式 | 卡方、互信息 | 速度快,适合大规模数据 | 忽略特征间交互 |
| 包裹式 | 递归特征消除 | 考虑特征组合 | 计算开销大 |
| 嵌入式 | Lasso、随机森林 | 训练即选择 | 依赖模型假设 |
我的建议:不要迷信任何一种方法。先把能用到的特征都造出来,用过滤式快速筛一遍,再用树模型跑重要性排序,最后结合业务场景做判断。特征工程不是一锤子买卖,需要反复迭代。
好了,特征提取和选择这块就聊到这儿。记住一个原则:特征不在多,在于精。一个高质量的特征,顶得上一堆凑数的特征。