数据采集与预处理:多源数据采集、清洗与特征工程

设备画像这件事,说白了就是给设备做「体检报告」。但报告好不好,全看原始数据靠不靠谱。我见过太多项目,算法模型调得再漂亮,数据源头一塌糊涂,最后全是白费功夫。这一章,咱们就聊聊怎么把那些乱七八糟的原始数据,变成能用的「干净料」。

多源数据采集:日志、指标、事件

设备的数据源,我习惯分成三大类。你想想看,一台设备从开机到报废,无非就是这三样东西在记录它的「一生」。

数据源类型 典型内容 采集方式 数据量级
日志(Log) 系统日志、应用日志、操作日志 Filebeat / Fluentd 实时采集 GB ~ TB/天
指标(Metric) CPU 使用率、内存、磁盘 IO、网络流量 Prometheus / Telegraf 轮询拉取 MB ~ GB/天
事件(Event) 设备重启、告警触发、配置变更 SNMP Trap / Webhook 推送 KB ~ MB/天

我个人习惯,先把日志和指标分开存。日志用 Elasticsearch,指标用时序数据库。事件呢?我一般把它当成「触发信号」——事件一来,立刻去查对应时间窗口的日志和指标。这样查问题,效率高得多。

一个小技巧: 采集日志时,记得带上设备 ID 和时间戳。我遇到过有人只采了日志内容,没采设备标识,结果一堆日志混在一起,根本分不清是哪台设备出的问题。那叫一个头疼。

数据清洗与标准化

数据采回来了,但问题也来了。不同厂商的设备,日志格式五花八门。有的用 JSON,有的用纯文本,还有的用自定义二进制。指标的单位也不统一——有的用毫秒,有的用微秒,有的干脆不写单位。

嗯,这里要注意。清洗这一步,我一般分三步走:

  1. 格式统一:所有日志转成 JSON 结构。字段名统一用下划线命名法,比如 device_id、timestamp、log_level。
  2. 缺失值处理:数值型指标缺了,用前一个时间点的值填充。文本型字段缺了,直接标记为 unknown。千万别用 0 去填充缺失的 CPU 使用率——那会误导模型。
  3. 异常值过滤:比如 CPU 使用率突然变成 999%,这明显是采集器抽风了。我一般设个合理范围,超出范围的直接丢弃。
避坑指南: 我曾经接手过一个项目,数据清洗时把「设备离线」的日志全删了,理由是「数据不完整」。结果模型死活学不会离线检测。后来才发现,离线本身就是一种状态,不能随便删。清洗时一定要想清楚:这个字段的缺失,是不是本身就代表某种含义?

标准化这块,我推荐用 Z-score 或 Min-Max 归一化。具体用哪个?看场景。如果数据分布比较正态,用 Z-score。如果数据范围固定(比如 CPU 使用率 0~100%),用 Min-Max 更直观。

# 一个简单的标准化示例(Python 伪代码)
import numpy as np

def z_score_normalize(series):
    mean = np.mean(series)
    std = np.std(series)
    return (series - mean) / std

def min_max_normalize(series):
    min_val = np.min(series)
    max_val = np.max(series)
    return (series - min_val) / (max_val - min_val)

特征工程初步

数据洗干净了,接下来就是特征工程。这一步,说白了就是「从原始数据里挖金子」。我一般从三个维度入手:

  • 统计特征:均值、方差、最大值、最小值、分位数。这些能反映设备的「稳态」和「波动」。
  • 时序特征:滑动窗口均值、差分值、自相关系数。这些能捕捉设备状态的变化趋势。
  • 业务特征:设备型号、固件版本、部署位置。这些是「元信息」,但往往对异常定位有奇效。

举个例子。我做过一个硬盘故障预测的项目。原始指标只有 IOPS 和延迟。后来我加了一个特征:「延迟的 5 分钟滑动窗口标准差」。结果模型准确率直接提升了 15%。为什么?因为硬盘快坏的时候,延迟会变得忽高忽低,这个波动特征比原始值更敏感。

核心思路: 特征工程不是越多越好。我见过有人一口气造了 200 个特征,结果模型训练时间翻了三倍,效果反而下降了。我的原则是:先理解业务,再动手造特征。每个特征都要能讲出「为什么有用」。

下面这张图,是我做设备画像时常用的数据采集与预处理流程。你可以看看数据是怎么一步步从原始状态变成可用特征的。

数据采集与预处理流程 数据采集与预处理流程 日志数据 指标数据 事件数据 Filebeat / Fluentd Prometheus / Telegraf SNMP Trap / Webhook 数据清洗与标准化 格式统一 → 缺失值处理 → 异常值过滤 → Z-score / Min-Max 归一化 特征工程 统计特征(均值/方差) → 时序特征(滑动窗口/差分) → 业务特征(型号/版本) 说明:数据从多源采集后,经过清洗标准化,最终生成可用于模型训练的特征

你看,整个流程其实不复杂。但每一步都有坑。我刚开始做的时候,总觉得采集工具越全越好,结果数据量太大,存储成本直接爆了。后来学乖了——先搞清楚你要分析什么问题,再决定采什么数据。数据不是越多越好,够用就行。

特征工程这块,我再多说一句。很多人喜欢用自动化特征生成工具,一键生成几百个特征。但说实话,我很少这么干。为什么?因为那些工具不懂业务。你想想看,一个不懂设备原理的工具,怎么可能造出「硬盘延迟波动标准差」这种特征?好的特征,一定来自对业务的理解。