别再到处找数据了!手把手教你用Python下载和预处理UCR/UEA时间序列数据集
从零到实战:Python高效获取与处理UCR/UEA时间序列数据全指南
时间序列分析作为机器学习的重要分支,在金融预测、工业设备监测、医疗诊断等领域应用广泛。而UCR/UEA数据集作为该领域的黄金标准,包含158个经过严格标注的单变量与多变量数据集,是算法验证不可或缺的资源。但许多开发者首次接触时会遇到三大痛点:官网访问受限、数据格式复杂、预处理流程繁琐。本文将用纯Python方案一站式解决这些问题,包含国内镜像源加速、自动化预处理流水线以及5个避坑技巧。
1. 环境配置与数据获取
1.1 搭建基础环境
推荐使用conda创建专属环境,避免依赖冲突:
conda create -n ts_analysis python=3.9 conda activate ts_analysis pip install tslearn pandas requests scikit-learn关键库作用说明:
tslearn:提供现成的UCR/UEA数据加载接口requests:处理HTTP请求下载原始数据scikit-learn:用于数据标准化与分割
1.2 国内镜像加速方案
由于官方服务器位于海外,直接访问常出现超时。这里提供两种稳定获取方式:
方法一:通过清华镜像站下载
import os from tslearn.datasets import UCR_UEA_datasets os.environ['TSLEARN_DATASETS_PATH'] = '/tmp/ts_data' # 设置缓存路径 # 强制使用镜像源 UCR_UEA_datasets.MIRROR = "https://mirrors.tuna.tsinghua.edu.cn/tslearn/" datasets = UCR_UEA_datasets().list_datasets()[:5] # 获取前5个数据集方法二:手动下载+本地加载
import pandas as pd # 从国内网盘下载后加载 def load_local_ucr(data_path): train_data = pd.read_csv(f"{data_path}_TRAIN.tsv", sep='\t', header=None) test_data = pd.read_csv(f"{data_path}_TEST.tsv", sep='\t', header=None) return train_data.iloc[:, 1:].values, train_data.iloc[:, 0].values, test_data.iloc[:, 1:].values, test_data.iloc[:, 0].values提示:完整数据集列表可通过
UCR_UEA_datasets().list_datasets()获取,包含128个单变量和30个多变量数据集
2. 数据预处理实战
2.1 统一长度处理
UCR数据集存在变长问题,使用滑动窗口标准化:
from tslearn.preprocessing import TimeSeriesResampler X_train, y_train, X_test, y_test = UCR_UEA_datasets().load_dataset("ECG200") resampler = TimeSeriesResampler(sz=100) # 统一到100长度 X_train = resampler.fit_transform(X_train) X_test = resampler.transform(X_test)2.2 缺失值处理方案
针对传感器数据常见的NaN值,推荐三种处理方式:
| 方法 | 代码实现 | 适用场景 |
|---|---|---|
| 线性插值 | pd.DataFrame(X_train).interpolate() | 连续小段缺失 |
| 前向填充 | pd.DataFrame(X_train).fillna(method='ffill') | 实时流数据 |
| 均值填充 | pd.DataFrame(X_train).fillna(X_train.mean()) | 随机缺失 |
2.3 数据增强技巧
小样本数据集可通过以下方法扩增:
from tslearn.utils import to_time_series_dataset from tslearn.preprocessing import TimeSeriesWarping # 时间扭曲增强 def time_warp_augment(X, n=5): warper = TimeSeriesWarping(n_splits=3) return to_time_series_dataset([warper.fit_transform(X) for _ in range(n)])3. 特征工程专项
3.1 时域特征提取
使用tsfresh自动生成特征:
from tsfresh import extract_features df = pd.DataFrame(X_train[0]).T features = extract_features(df, column_id="id", default_fc_parameters=EfficientFCParameters())3.2 频域特征转换
快速傅里叶变换实现:
import numpy as np def fft_transform(series): fft = np.fft.rfft(series) return np.abs(fft)[:10] # 取前10个频率分量3.3 多变量数据融合
对于UEA多变量数据集,采用通道堆叠:
X_multi = np.stack([X_train[:,:,i] for i in range(X_train.shape[2])], axis=-1)4. 建模与评估闭环
4.1 基准模型构建
以ROCKET算法为例:
from sklearn.linear_model import RidgeClassifierCV from tslearn.piecewise import PiecewiseAggregateApproximation paa = PiecewiseAggregateApproximation(n_segments=10) X_train_paa = paa.fit_transform(X_train) clf = RidgeClassifierCV().fit(X_train_paa[:,:,0], y_train)4.2 评估指标选择
不同场景的指标对照表:
| 任务类型 | 推荐指标 | 实现代码 |
|---|---|---|
| 分类任务 | Balanced Accuracy | sklearn.metrics.balanced_accuracy_score |
| 聚类任务 | Davies-Bouldin Index | sklearn.metrics.davies_bouldin_score |
| 异常检测 | AUC-ROC | sklearn.metrics.roc_auc_score |
4.3 结果可视化
使用plotly动态展示:
import plotly.express as px fig = px.line(x=range(100), y=X_train[0].ravel(), title="ECG200 Sample Visualization") fig.show()5. 工业级应用建议
在实际项目中遇到样本不均衡时,可采用代价敏感学习:
from sklearn.utils.class_weight import compute_class_weight classes = np.unique(y_train) weights = compute_class_weight('balanced', classes=classes, y=y_train) model = LogisticRegression(class_weight=dict(zip(classes, weights)))对于实时性要求高的场景,建议将预处理流程封装为Pipeline:
from sklearn.pipeline import make_pipeline pipeline = make_pipeline( TimeSeriesResampler(sz=100), PiecewiseAggregateApproximation(n_segments=10), RidgeClassifierCV() )