特征工程:IP特征、时间特征、请求特征提取与选择

做异常访问识别,选好特征比算法本身更重要。

我入行那会儿,有个同事花三个月调模型,最后发现是特征没选对,全白干了。特征工程说白了,就是把你手里的原始数据转化成模型能听懂的语言。这个环节要是偷懒,后面的模型再花哨也白搭。

特征工程的核心目标

我们做异常检测,特征工程要达到三个目的:

  • 区分性:正常和异常在特征空间里要能拉开距离
  • 稳定性:特征分布不会三天两头变
  • 可解释性:出问题了,你得能说清楚为什么这个请求被判异常

我个人习惯,每个特征建完之后都会先画个分布图看看。如果正常样本和异常样本的特征分布完全重叠,那这个特征基本就是废的。

特征工程流程 原始访问日志 数据分流 分流(实时/离线) IP 特征提取 时间特征提取 请求特征提取 特征合并与编码 特征选择 核心要点 1. 原始日志需先分流 2. 三类特征分别提取 3. 合并后进行编码 4. 最终做特征筛选

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、随机森林训练即选择依赖模型假设

我的建议:不要迷信任何一种方法。先把能用到的特征都造出来,用过滤式快速筛一遍,再用树模型跑重要性排序,最后结合业务场景做判断。特征工程不是一锤子买卖,需要反复迭代。

好了,特征提取和选择这块就聊到这儿。记住一个原则:特征不在多,在于精。一个高质量的特征,顶得上一堆凑数的特征。