3、数据采集与预处理:数据源类型、清洗与特征提取

数据采集和预处理,说白了就是给信任评分模型「喂饭」。饭好不好,直接决定模型能不能干活。我见过太多项目,算法选得天花乱坠,最后栽在数据质量上——嗯,这章咱们就把这顿饭怎么做透。

3.1 数据源类型:日志、行为、身份

信任评分需要三类数据源。我个人习惯把它们比作「三维画像」:

  • 日志数据:系统留下的痕迹。比如登录时间、IP地址、操作记录。
  • 行为数据:用户怎么用系统。比如点击路径、停留时长、输入节奏。
  • 身份数据:你是谁。比如账号、设备指纹、生物特征。

我在项目中遇到过一个问题:只采了日志数据,结果模型把凌晨3点的批量任务全判成异常。为什么?因为没引入行为上下文。你想想看,运维脚本凌晨跑是常态,但用户凌晨手动操作就值得怀疑。所以三类数据必须配合。

核心原则:日志定「发生了什么」,行为定「怎么发生的」,身份定「是谁干的」。缺一个,信任评分就瘸腿。

下面这张图展示了三类数据源如何汇聚到预处理管道:

数据源汇聚与预处理流程 日志数据 登录/操作/网络流 行为数据 点击/路径/节奏 身份数据 账号/设备/生物特征 数据采集与汇聚层 清洗 → 标准化 → 特征提取 三类数据缺一不可 否则模型会「偏食」

3.2 数据清洗与标准化

数据进了管道,第一件事就是洗。我曾经接手过一个项目,原始数据里时间戳格式有5种:Unix毫秒、Unix秒、ISO8601、YYYYMMDD、甚至还有「2024/1/1 12:00」。你想想看,这种数据直接喂模型,结果能好吗?

3.2.1 常见脏数据类型

脏数据类型 典型表现 处理方式
缺失值 字段为空或NULL 填充默认值/插值/删除
重复记录 同一条数据出现多次 去重(保留最新或最完整)
格式不一致 时间、IP、手机号格式混乱 统一格式转换
异常值 登录次数=999999 截断/分箱/标记为异常
噪声数据 乱码、特殊字符 正则过滤/规则清洗

避坑指南:我曾经在清洗阶段直接把缺失值全删了,结果模型训练完发现样本量少了30%,而且删掉的都是夜间低频用户的数据。后来我改成按业务场景分策略填充——高频用户用均值,低频用户用中位数,冷启动用户用默认值。效果好了很多。

3.2.2 标准化方法

标准化说白了就是把不同量纲的数据拉到同一个尺度。我常用的方法有三种:

  • Min-Max归一化:把数据映射到[0,1]区间。适合有明确上下界的特征,比如年龄、评分。
  • Z-Score标准化:减去均值除以标准差。适合数据分布近似正态的场景,比如登录频率。
  • Robust标准化:用中位数和四分位距。适合有异常值的数据——嗯,安全数据里异常值特别多,这个我常用。

举个例子,假设我们要标准化「每日登录次数」:

# 原始数据:登录次数 [1, 3, 5, 100, 2, 4]
# 100 明显是异常值(可能是扫描攻击)

# Min-Max 归一化(受异常值影响大)
# 100 被映射到 1.0,其他值被压缩到 0~0.04

# Robust 标准化(推荐)
# 中位数=3.5, Q1=2, Q3=5, IQR=3
# 100 标准化后 ≈ (100-3.5)/3 ≈ 32.2
# 正常值标准化后 ≈ (-0.5 ~ 0.5)
# 异常值仍然突出,但不会被「压扁」

我的习惯:安全场景优先用Robust标准化。为什么?因为攻击行为本身就是异常值,你把它归一化到正常范围,模型就学不到异常模式了。

3.3 特征提取方法

特征提取,就是从原始数据里挖出对信任评分有用的信息。我个人把它分成三类:统计特征、时序特征、行为特征。

3.3.1 统计特征

最基础,也最有效。比如:

  • 过去24小时登录次数
  • 过去7天失败登录占比
  • 操作金额的均值、标准差、最大值
  • IP地址的地理位置变化次数

这些特征计算简单,但信息量很大。我记得有一次做金融风控,光是一个「过去1小时交易金额标准差」就帮我们抓到了80%的盗刷行为——因为盗刷者通常会在短时间内频繁小额测试。

3.3.2 时序特征

用户行为是有时间模式的。我常用的时序特征包括:

特征类型 示例 业务含义
周期性 是否在工作时间登录 识别非正常时段操作
趋势 登录频率是否突然上升 检测账号被盗后的批量操作
间隔 两次操作之间的时间差 人类操作 vs 脚本操作的差异
序列模式 操作顺序是否异常 正常用户先看余额再转账,攻击者可能直接转账

关键洞察:时序特征对信任评分特别重要。为什么?因为攻击行为往往在时间维度上留下「痕迹」——要么太快(脚本),要么太慢(潜伏),要么时间不对(凌晨3点)。

3.3.3 行为特征

这部分最考验经验。我常用的行为特征提取方法:

  • 鼠标轨迹:人类鼠标移动有加速度,脚本是直线。提取轨迹的曲率、速度变化率。
  • 键盘节奏:按键间隔、击键时长。每个人打字节奏不同,可以用于身份验证。
  • 浏览路径:用户从A页面到B页面的跳转方式。正常用户会按导航走,攻击者可能直接跳转到敏感URL。
  • 设备指纹:屏幕分辨率、浏览器插件列表、字体列表。这些组合起来可以唯一标识设备。

我曾经遇到一个案例:攻击者用脚本批量登录,但脚本的鼠标轨迹是完美的直线。我们提取了鼠标轨迹的「抖动率」特征,直接把这个攻击模式识别出来了。嗯,这就是行为特征的价值。

3.4 特征工程避坑指南

我曾经踩过的坑:

  1. 特征冗余:同时用了「登录次数」和「登录频率」,结果模型学到的是两者的线性组合,白白增加计算量。后来我用相关性矩阵做预筛选,相关系数>0.9的只保留一个。
  2. 特征泄露:用未来数据构造特征。比如用「当天是否被锁定」来预测「当天是否异常」——这不叫预测,叫事后诸葛亮。一定要确保特征只依赖历史数据。
  3. 过度离散:把连续特征分箱分得太细,比如年龄按1岁一档。结果模型学到了噪声,泛化能力变差。我一般控制在5-10个分箱。

数据采集和预处理,说到底就是「垃圾进,垃圾出」的反面——好数据进,好模型出。这三步走扎实了,后面的信任评分模型才能站得住脚。