UCR时间序列数据集全攻略从批量下载到Python实战处理在机器学习项目中最令人头疼的往往不是模型调参而是获取高质量、有代表性的数据集。特别是对于时间序列分类任务自己生成的数据往往缺乏多样性和真实场景的复杂性。UCR时间序列分类数据集库作为该领域的黄金标准包含了128个经过严格筛选的数据集覆盖了从医疗监测到工业设备振动分析的广泛场景。1. UCR数据集概览与下载技巧UCR数据集库自2002年首次发布以来已成为时间序列分析领域的基准测试集。最新版本包含的数据集主要来自以下几个领域医疗健康心电图(ECG)、脑电图(EEG)等生物信号工业设备传感器监测数据如电机振动、温度变化运动识别人体动作捕捉与手势识别图像轮廓基于形状的分类任务环境监测气候、电力消耗等时序数据每个数据集都经过标准化处理包含以下关键特征特征说明示例值时间步长单个样本的时间点数量24-2844不等类别数分类任务的类别数量2-60类训练集大小训练样本数量16-8926条测试集大小测试样本数量20-16500条批量下载技巧访问UCR官网(通过搜索引擎查找最新地址)寻找Download all 128 datasets的压缩包链接推荐使用wget或curl命令进行稳定下载wget -c https://www.cs.ucr.edu/~eamonn/time_series_data_2018/UCRArchive_2018.zip解压后会得到一个按数据集名称组织的文件夹结构注意部分防病毒软件可能误报压缩包内的.tsv文件下载前建议临时关闭安全扫描。2. Python高效加载与预处理实战面对128个数据集的批量处理我们需要建立系统化的加载流程。以下是一个完整的Python处理方案2.1 文件结构解析典型的UCR数据集文件结构如下UCRArchive_2018/ Adiac/ Adiac_TRAIN.tsv Adiac_TEST.tsv ArrowHead/ ArrowHead_TRAIN.tsv ArrowHead_TEST.tsv ...(其他数据集)2.2 核心加载函数实现import numpy as np import pandas as pd from pathlib import Path def load_ucr_dataset(dataset_name, data_dirUCRArchive_2018): 加载指定UCR数据集的训练集和测试集 返回: (X_train, y_train, X_test, y_test) base_path Path(data_dir) / dataset_name # 加载训练集 train_data pd.read_csv(base_path/f{dataset_name}_TRAIN.tsv, sep\t, headerNone) X_train train_data.iloc[:, 1:].values y_train train_data.iloc[:, 0].values # 加载测试集 test_data pd.read_csv(base_path/f{dataset_name}_TEST.tsv, sep\t, headerNone) X_test test_data.iloc[:, 1:].values y_test test_data.iloc[:, 0].values return X_train, y_train, X_test, y_test2.3 批量处理与缓存机制对于需要处理多个数据集的情况建议实现缓存机制import joblib from sklearn.preprocessing import LabelEncoder def preprocess_and_cache(dataset_names, cache_dirucr_cache): Path(cache_dir).mkdir(exist_okTrue) results {} for name in dataset_names: cache_file Path(cache_dir) / f{name}.pkl if cache_file.exists(): data joblib.load(cache_file) else: X_train, y_train, X_test, y_test load_ucr_dataset(name) # 标准化标签编码 le LabelEncoder() y_train le.fit_transform(y_train) y_test le.transform(y_test) # 标准化数据(按特征) mean, std X_train.mean(axis1, keepdimsTrue), X_train.std(axis1, keepdimsTrue) X_train (X_train - mean) / (std 1e-8) X_test (X_test - mean) / (std 1e-8) data (X_train, y_train, X_test, y_test) joblib.dump(data, cache_file) results[name] data return results3. 数据集特性分析与选择策略3.1 关键统计指标对比我们通过分析所有128个数据集总结出以下选择维度复杂度指标类别平衡度计算最小类别占比序列长度变异系数评估时间步长变化信噪比估计通过平滑前后差异计算实用筛选表需求场景推荐筛选条件适用数据集示例快速原型开发样本量500, 类别数2GunPoint, Beef深度学习测试序列长度1000ElectricDevices, StarLightCurves多分类研究类别数≥10FiftyWords, Symbols小样本学习训练样本100SyntheticControl, ToeSegmentation13.2 可视化分析方法使用Python快速生成数据集概览报告import matplotlib.pyplot as plt def plot_dataset_stats(datasets): fig, axes plt.subplots(2, 2, figsize(12, 10)) # 类别数量分布 class_counts [len(np.unique(y_train)) for _, y_train, _, _ in datasets.values()] axes[0,0].hist(class_counts, bins20) axes[0,0].set_title(Class Distribution) # 序列长度分布 lengths [X_train.shape[1] for X_train, _, _, _ in datasets.values()] axes[0,1].hist(lengths, bins30) axes[0,1].set_title(Sequence Length) # 样本量分布 train_sizes [X_train.shape[0] for X_train, _, _, _ in datasets.values()] axes[1,0].hist(train_sizes, bins30) axes[1,0].set_title(Train Set Size) # 测试/训练比例 test_ratios [X_test.shape[0]/X_train.shape[0] for X_train, _, X_test, _ in datasets.values()] axes[1,1].hist(test_ratios, bins20) axes[1,1].set_title(Test/Train Ratio) plt.tight_layout() return fig4. 与主流框架的集成方案4.1 scikit-learn兼容处理UCR数据集可直接用于sklearn的分类器from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score def sklearn_example(dataset_name): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) # 转换为sklearn需要的2D格式 X_train_2d X_train.reshape(X_train.shape[0], -1) X_test_2d X_test.reshape(X_test.shape[0], -1) clf RandomForestClassifier(n_estimators100) clf.fit(X_train_2d, y_train) preds clf.predict(X_test_2d) acc accuracy_score(y_test, preds) print(f{dataset_name} Accuracy: {acc:.3f})4.2 PyTorch数据管道构建对于深度学习应用建议创建自定义Dataset类import torch from torch.utils.data import Dataset, DataLoader class UCRDataset(Dataset): def __init__(self, X, y): self.X torch.FloatTensor(X).unsqueeze(1) # (N,1,L) self.y torch.LongTensor(y) def __len__(self): return len(self.X) def __getitem__(self, idx): return self.X[idx], self.y[idx] def create_dataloaders(dataset_name, batch_size32): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) train_ds UCRDataset(X_train, y_train) test_ds UCRDataset(X_test, y_test) train_loader DataLoader(train_ds, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_ds, batch_sizebatch_size) return train_loader, test_loader4.3 TensorFlow/Keras适配方案对于TensorFlow用户可以使用以下数据管道import tensorflow as tf def tf_data_pipeline(dataset_name, batch_size32): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) # 扩展维度以匹配CNN输入要求 X_train np.expand_dims(X_train, axis-1) # (N,L,1) X_test np.expand_dims(X_test, axis-1) train_ds tf.data.Dataset.from_tensor_slices((X_train, y_train)) test_ds tf.data.Dataset.from_tensor_slices((X_test, y_test)) train_ds train_ds.shuffle(1000).batch(batch_size).prefetch(tf.data.AUTOTUNE) test_ds test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE) return train_ds, test_ds在处理特别长的时间序列时可以考虑添加滑动窗口预处理def sliding_window(X, window_size, stride1): num_windows (X.shape[1] - window_size) // stride 1 windows np.zeros((X.shape[0], num_windows, window_size)) for i in range(num_windows): start i * stride end start window_size windows[:, i, :] X[:, start:end] return windows
别再自己造数据了!UCR时间序列分类数据集128个打包下载与Python加载实战
UCR时间序列数据集全攻略从批量下载到Python实战处理在机器学习项目中最令人头疼的往往不是模型调参而是获取高质量、有代表性的数据集。特别是对于时间序列分类任务自己生成的数据往往缺乏多样性和真实场景的复杂性。UCR时间序列分类数据集库作为该领域的黄金标准包含了128个经过严格筛选的数据集覆盖了从医疗监测到工业设备振动分析的广泛场景。1. UCR数据集概览与下载技巧UCR数据集库自2002年首次发布以来已成为时间序列分析领域的基准测试集。最新版本包含的数据集主要来自以下几个领域医疗健康心电图(ECG)、脑电图(EEG)等生物信号工业设备传感器监测数据如电机振动、温度变化运动识别人体动作捕捉与手势识别图像轮廓基于形状的分类任务环境监测气候、电力消耗等时序数据每个数据集都经过标准化处理包含以下关键特征特征说明示例值时间步长单个样本的时间点数量24-2844不等类别数分类任务的类别数量2-60类训练集大小训练样本数量16-8926条测试集大小测试样本数量20-16500条批量下载技巧访问UCR官网(通过搜索引擎查找最新地址)寻找Download all 128 datasets的压缩包链接推荐使用wget或curl命令进行稳定下载wget -c https://www.cs.ucr.edu/~eamonn/time_series_data_2018/UCRArchive_2018.zip解压后会得到一个按数据集名称组织的文件夹结构注意部分防病毒软件可能误报压缩包内的.tsv文件下载前建议临时关闭安全扫描。2. Python高效加载与预处理实战面对128个数据集的批量处理我们需要建立系统化的加载流程。以下是一个完整的Python处理方案2.1 文件结构解析典型的UCR数据集文件结构如下UCRArchive_2018/ Adiac/ Adiac_TRAIN.tsv Adiac_TEST.tsv ArrowHead/ ArrowHead_TRAIN.tsv ArrowHead_TEST.tsv ...(其他数据集)2.2 核心加载函数实现import numpy as np import pandas as pd from pathlib import Path def load_ucr_dataset(dataset_name, data_dirUCRArchive_2018): 加载指定UCR数据集的训练集和测试集 返回: (X_train, y_train, X_test, y_test) base_path Path(data_dir) / dataset_name # 加载训练集 train_data pd.read_csv(base_path/f{dataset_name}_TRAIN.tsv, sep\t, headerNone) X_train train_data.iloc[:, 1:].values y_train train_data.iloc[:, 0].values # 加载测试集 test_data pd.read_csv(base_path/f{dataset_name}_TEST.tsv, sep\t, headerNone) X_test test_data.iloc[:, 1:].values y_test test_data.iloc[:, 0].values return X_train, y_train, X_test, y_test2.3 批量处理与缓存机制对于需要处理多个数据集的情况建议实现缓存机制import joblib from sklearn.preprocessing import LabelEncoder def preprocess_and_cache(dataset_names, cache_dirucr_cache): Path(cache_dir).mkdir(exist_okTrue) results {} for name in dataset_names: cache_file Path(cache_dir) / f{name}.pkl if cache_file.exists(): data joblib.load(cache_file) else: X_train, y_train, X_test, y_test load_ucr_dataset(name) # 标准化标签编码 le LabelEncoder() y_train le.fit_transform(y_train) y_test le.transform(y_test) # 标准化数据(按特征) mean, std X_train.mean(axis1, keepdimsTrue), X_train.std(axis1, keepdimsTrue) X_train (X_train - mean) / (std 1e-8) X_test (X_test - mean) / (std 1e-8) data (X_train, y_train, X_test, y_test) joblib.dump(data, cache_file) results[name] data return results3. 数据集特性分析与选择策略3.1 关键统计指标对比我们通过分析所有128个数据集总结出以下选择维度复杂度指标类别平衡度计算最小类别占比序列长度变异系数评估时间步长变化信噪比估计通过平滑前后差异计算实用筛选表需求场景推荐筛选条件适用数据集示例快速原型开发样本量500, 类别数2GunPoint, Beef深度学习测试序列长度1000ElectricDevices, StarLightCurves多分类研究类别数≥10FiftyWords, Symbols小样本学习训练样本100SyntheticControl, ToeSegmentation13.2 可视化分析方法使用Python快速生成数据集概览报告import matplotlib.pyplot as plt def plot_dataset_stats(datasets): fig, axes plt.subplots(2, 2, figsize(12, 10)) # 类别数量分布 class_counts [len(np.unique(y_train)) for _, y_train, _, _ in datasets.values()] axes[0,0].hist(class_counts, bins20) axes[0,0].set_title(Class Distribution) # 序列长度分布 lengths [X_train.shape[1] for X_train, _, _, _ in datasets.values()] axes[0,1].hist(lengths, bins30) axes[0,1].set_title(Sequence Length) # 样本量分布 train_sizes [X_train.shape[0] for X_train, _, _, _ in datasets.values()] axes[1,0].hist(train_sizes, bins30) axes[1,0].set_title(Train Set Size) # 测试/训练比例 test_ratios [X_test.shape[0]/X_train.shape[0] for X_train, _, X_test, _ in datasets.values()] axes[1,1].hist(test_ratios, bins20) axes[1,1].set_title(Test/Train Ratio) plt.tight_layout() return fig4. 与主流框架的集成方案4.1 scikit-learn兼容处理UCR数据集可直接用于sklearn的分类器from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score def sklearn_example(dataset_name): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) # 转换为sklearn需要的2D格式 X_train_2d X_train.reshape(X_train.shape[0], -1) X_test_2d X_test.reshape(X_test.shape[0], -1) clf RandomForestClassifier(n_estimators100) clf.fit(X_train_2d, y_train) preds clf.predict(X_test_2d) acc accuracy_score(y_test, preds) print(f{dataset_name} Accuracy: {acc:.3f})4.2 PyTorch数据管道构建对于深度学习应用建议创建自定义Dataset类import torch from torch.utils.data import Dataset, DataLoader class UCRDataset(Dataset): def __init__(self, X, y): self.X torch.FloatTensor(X).unsqueeze(1) # (N,1,L) self.y torch.LongTensor(y) def __len__(self): return len(self.X) def __getitem__(self, idx): return self.X[idx], self.y[idx] def create_dataloaders(dataset_name, batch_size32): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) train_ds UCRDataset(X_train, y_train) test_ds UCRDataset(X_test, y_test) train_loader DataLoader(train_ds, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_ds, batch_sizebatch_size) return train_loader, test_loader4.3 TensorFlow/Keras适配方案对于TensorFlow用户可以使用以下数据管道import tensorflow as tf def tf_data_pipeline(dataset_name, batch_size32): X_train, y_train, X_test, y_test load_ucr_dataset(dataset_name) # 扩展维度以匹配CNN输入要求 X_train np.expand_dims(X_train, axis-1) # (N,L,1) X_test np.expand_dims(X_test, axis-1) train_ds tf.data.Dataset.from_tensor_slices((X_train, y_train)) test_ds tf.data.Dataset.from_tensor_slices((X_test, y_test)) train_ds train_ds.shuffle(1000).batch(batch_size).prefetch(tf.data.AUTOTUNE) test_ds test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE) return train_ds, test_ds在处理特别长的时间序列时可以考虑添加滑动窗口预处理def sliding_window(X, window_size, stride1): num_windows (X.shape[1] - window_size) // stride 1 windows np.zeros((X.shape[0], num_windows, window_size)) for i in range(num_windows): start i * stride end start window_size windows[:, i, :] X[:, start:end] return windows