数据预处理:数据清洗、缺失值处理、异常值检测、数据标准化

大家好,我是你们的老朋友。今天咱们聊聊数据预处理。

说实话,我在AI运维这行干了快十年,见过太多「模型训练三天,上线就崩」的惨案。追根溯源,十有八九是数据预处理没做好。你想想看,垃圾进,垃圾出——这个道理谁都懂,但真正动手时,很多人还是图省事。

我个人习惯,花在数据预处理上的时间,至少占整个项目周期的60%。别嫌多,这钱花得值。

核心观点:数据预处理不是「体力活」,而是决定模型上限的关键步骤。模型算法再牛,也救不了脏数据。

1. 数据清洗:先把「垃圾」筛出去

数据清洗,说白了就是给数据「洗澡」。我遇到过最夸张的一次,某监控系统采集的CPU使用率,居然出现了-999%的值。嗯,这明显是传感器抽风了。

清洗主要做三件事:

  • 去重:重复的时间序列数据,会严重干扰模型对时间规律的判断。我一般用pandas.DataFrame.drop_duplicates(),但要注意按时间戳排序后再去重。
  • 格式统一:时间戳格式五花八门——有人用"2024-01-01 00:00:00",有人用"2024/01/01"。我习惯统一转为Unix时间戳,方便计算。
  • 范围校验:比如内存使用率,正常范围是0-100%。超出这个范围的,直接标记为异常。
import pandas as pd

# 示例:清洗CPU使用率数据
df = pd.read_csv('cpu_metrics.csv')
df = df.drop_duplicates(subset=['timestamp'])
df = df[(df['cpu_usage'] >= 0) & (df['cpu_usage'] <= 100)]

我的小技巧:清洗时别急着删数据。先标记,再分析,最后决定是删还是修。我曾经因为手快删了一批「异常值」,后来发现那是业务高峰期的真实数据——模型直接废了。

2. 缺失值处理:别让「空」坑了你

缺失值在运维数据里太常见了。网络抖动、采集器宕机、存储延迟——任何一个环节出问题,数据就断了。

处理缺失值,我一般分三步走:

  1. 先看缺失比例:如果某列缺失超过50%,我建议直接扔掉。别心疼,留着也是祸害。
  2. 再看缺失模式:是随机缺失,还是连续缺失?连续缺失往往意味着系统故障,需要特别关注。
  3. 最后选填充方法:
缺失类型 推荐方法 适用场景
随机缺失(<5%) 前向填充(ffill) CPU、内存等缓慢变化指标
随机缺失(5%-20%) 线性插值 网络流量、请求量等趋势明显的数据
连续缺失 模型预测填充 关键指标,且缺失段有规律
大量缺失(>50%) 直接删除该列 非核心特征
# 前向填充示例
df['cpu_usage'].fillna(method='ffill', inplace=True)

# 线性插值示例
df['network_traffic'].interpolate(method='linear', inplace=True)

注意:千万别用均值填充时间序列数据!我曾经见过有人用全局均值填充CPU使用率,结果模型把「正常波动」全学成了「一条直线」——预测结果毫无意义。

3. 异常值检测:揪出「害群之马」

异常值检测,是数据预处理里最考验经验的环节。为什么?因为「异常」的定义,在不同场景下完全不同。

举个例子:某电商大促期间,QPS冲到10万,这在平时是异常,但在大促当天是正常。所以,我一般会结合业务知识来设定检测规则。

常用的方法有三种:

  • 3σ原则:适用于正态分布的数据。超出均值±3倍标准差的值,视为异常。简单粗暴,但有效。
  • IQR(四分位距)法:适用于非正态分布。Q1-1.5*IQR 到 Q3+1.5*IQR 之外的值,视为异常。我在处理延迟数据时常用这个。
  • 孤立森林(Isolation Forest):适用于高维数据。我一般在做根因分析时用,能快速定位异常维度。
from sklearn.ensemble import IsolationForest

# 孤立森林示例
model = IsolationForest(contamination=0.05)
df['anomaly'] = model.fit_predict(df[['cpu_usage', 'memory_usage', 'disk_io']])

避坑指南:我曾经用3σ原则检测磁盘IO异常,结果发现所有「异常」都发生在凌晨的备份任务期间。后来我加了时间窗口过滤——白天用3σ,凌晨用5σ。效果好了很多。

4. 数据标准化:让所有特征「平起平坐」

标准化,说白了就是把不同量纲的数据拉到同一个尺度上。你想想看,CPU使用率是0-100,内存使用量是GB级别,如果不标准化,模型会天然认为「内存更重要」——这显然不对。

我常用的标准化方法:

  • Z-score标准化:适用于数据近似正态分布。公式:(x - μ) / σ。处理后均值为0,标准差为1。
  • Min-Max归一化:适用于有边界的数据。公式:(x - min) / (max - min)。处理后范围在[0,1]之间。
  • RobustScaler:适用于有异常值的数据。使用中位数和IQR,对异常值不敏感。我在处理网络延迟数据时特别喜欢用这个。
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

# Z-score标准化
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['cpu_usage', 'memory_usage']])

# Min-Max归一化
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df[['disk_io', 'network_traffic']])

重要提醒:标准化参数(均值、标准差、min、max等)一定要在训练集上计算,然后应用到验证集和测试集。千万别用全局数据计算——否则会造成数据泄露,模型评估结果会虚高。

知识体系总览

下面这张图,是我自己梳理的数据预处理全流程。每次做项目前,我都会对照着走一遍,确保没有遗漏。

数据预处理知识体系 原始数据 数据清洗 缺失值处理 异常值检测 数据标准化 干净数据 模型训练 去重 · 格式统一 · 范围校验 前向填充 · 线性插值 · 模型预测 3σ · IQR · 孤立森林 Z-score · Min-Max · RobustScaler

这张图把整个流程串起来了。你从原始数据出发,经过清洗、缺失值处理、异常值检测,最后标准化,得到干净数据,才能放心地喂给模型。

嗯,数据预处理这块,说白了就是「磨刀不误砍柴工」。我见过太多人急着调模型参数,结果数据一塌糊涂——最后花三天调参,不如花三小时洗数据。你自己品品,是不是这个理?


专注资料整理