SMD/SMAP/MSL/SWaT/WADI 5大异常检测数据集:Python 3步标准化处理与格式统一

📅 2026/7/6 0:23:52 👁️ 阅读次数 📝 编程学习
SMD/SMAP/MSL/SWaT/WADI 5大异常检测数据集:Python 3步标准化处理与格式统一

多变量时间序列异常检测数据集标准化处理实战指南

1. 五大核心数据集解析与预处理要点

在工业设备监控和物联网领域,多变量时间序列异常检测已成为保障系统稳定运行的关键技术。SMD、SMAP、MSL、SWaT和WADI这五大数据集因其丰富的多维特征和精确的异常标注,成为算法验证的黄金标准。让我们深入剖析每个数据集的技术特性:

1.1 SMD数据集技术细节

  • 数据构成:28台服务器机器5周内的38维指标(CPU负载、内存使用等),采样间隔1分钟
  • 特殊优势:提供异常贡献维度标注(interpretation_label)
  • 预处理难点
    def process_smd(file_path): data = pd.read_csv(file_path, header=None) # 自动生成特征列名 features = [f'metric_{i}' for i in range(data.shape[1]-1)] data.columns = ['timestamp'] + features + ['label'] return data.set_index('timestamp')

1.2 航天器数据集(SMAP/MSL)特性

特性SMAPMSL
实体数量55个通道27个通道
维度25维55维
数据范围[0,1]标准化[0,1]标准化
异常类型point/contextualpoint/contextual

特别注意:command相关变量为二元值(0/1),需单独处理

2. 标准化处理流水线设计

2.1 统一目录结构规范

processed_datasets/ ├── dataset_name/ │ ├── entity_1/ │ │ ├── train.csv │ │ └── test.csv │ └── entity_2/ │ ├── train.csv │ └── test.csv

2.2 时间戳处理最佳实践

def normalize_timestamp(df): if 'datetime' in df.columns: df['timestamp'] = pd.to_datetime(df['datetime']) elif 'timestamp' not in df.columns: df['timestamp'] = df.index return df.drop(columns=['datetime'], errors='ignore')

2.3 特征标准化策略

  • 连续变量:RobustScaler(应对异常值)
  • 分类变量:OneHotEncoder
  • 混合类型
    from sklearn.compose import ColumnTransformer preprocessor = ColumnTransformer([ ('num', RobustScaler(), numeric_cols), ('cat', OneHotEncoder(), categorical_cols) ])

3. 工程化实现方案

3.1 自动化处理流水线

class DatasetProcessor: def __init__(self, output_dir='processed_data'): self.output_dir = Path(output_dir) def process_all(self): for dataset in ['SMD', 'SMAP', 'MSL', 'SWaT', 'WADI']: processor = getattr(self, f'_process_{dataset.lower()}') processor() def _process_smd(self): # 实现SMD特有处理逻辑 pass

3.2 内存优化技巧

  • 分块处理pandas.read_csv(chunksize=10000)
  • 类型转换
    dtype_dict = {f'col_{i}': 'float32' for i in range(38)} pd.read_csv(..., dtype=dtype_dict)

3.3 并行处理实现

from concurrent.futures import ThreadPoolExecutor def parallel_process(files, func): with ThreadPoolExecutor(max_workers=4) as executor: executor.map(func, files)

4. 质量验证体系

4.1 数据完整性检查

def validate_dataset(df): assert not df.duplicated().any(), "存在重复记录" assert df.isna().sum().sum() == 0, "存在缺失值" if 'label' in df.columns: assert set(df['label'].unique()).issubset({0,1}), "标签值非法"

4.2 特征分布可视化

import seaborn as sns def plot_feature_dist(df, col): plt.figure(figsize=(10,4)) sns.histplot(df[col], kde=True) if 'label' in df.columns: sns.boxplot(x='label', y=col, data=df) plt.savefig(f'dist_{col}.png')

5. 实战应用案例

5.1 与PyOD集成示例

from pyod.models.iforest import IForest def train_model(train_path): train_data = pd.read_csv(train_path) clf = IForest(contamination=0.1) clf.fit(train_data.drop(columns=['label'])) return clf

5.2 性能基准测试

数据集处理时间(s)内存峰值(MB)文件大小(MB)
SMD42.71200310
SMAP18.385095
WADI76.52100480

6. 高级技巧与陷阱规避

6.1 时间序列特有处理

  • 滚动窗口统计
    df['rolling_mean'] = df['value'].rolling(60).mean() # 1小时窗口
  • 季节性分解
    from statsmodels.tsa.seasonal import seasonal_decompose result = seasonal_decompose(df['value'], period=1440) # 日周期

6.2 常见错误解决方案

  1. 内存溢出:使用dask.dataframe替代pandas
  2. 时间对齐问题df.asfreq('1T', method='pad')
  3. 特征尺度差异:分实体进行标准化

在处理WADI数据集时发现,新版数据的时间戳格式存在异常,通过以下方式修正:

wadi_train = wadi_train.merge(time_ref, on='Row').drop(columns=['Row'])

7. 扩展应用场景

7.1 实时检测系统集成

class StreamingProcessor: def __init__(self, window_size=60): self.buffer = deque(maxlen=window_size) def process(self, new_point): self.buffer.append(new_point) if len(self.buffer) == self.buffer.maxlen: return self._detect_anomaly() return None

7.2 自动化监控方案

# 使用cron定时执行数据更新 0 * * * * /usr/bin/python3 /path/to/process.py --dataset SMD --update