时间序列分析入门:手把手教你准备UCR和UEA数据集(附处理好的数据下载)

张开发
2026/4/21 18:25:10 15 分钟阅读

分享文章

时间序列分析入门:手把手教你准备UCR和UEA数据集(附处理好的数据下载)
时间序列分析实战从UCR/UEA数据集处理到模型训练全流程指南时间序列分析在金融预测、工业监测、医疗诊断等领域应用广泛而UCR和UEA数据集作为该领域的基准测试集已成为研究者验证算法性能的黄金标准。但对于刚接触时间序列分类的新手来说从数据获取到最终建模的完整流程往往充满挑战——不同格式的数据文件如何解析多维时间序列怎样可视化哪些预处理步骤必不可少本文将用工程化的视角带你系统掌握时间序列数据分析的全套方法论。1. 核心数据集解析与获取1.1 UCR与UEA数据集全景认知UCR Archive包含128单变量时间序列数据集覆盖设备监测、心电图分类等场景而UEA Repository则专注多元时间序列如动作识别中的多传感器数据。二者共同构成时间序列分类任务的试金石典型数据结构对比特征UCR数据集UEA数据集维度单变量多变量3-100通道样本长度等长/变长多为变长序列标签类型数值型分类文本/数值型标签原始格式TSVARFF提示UEA的ARFF格式包含元数据描述适合Weka等工具直接读取但在Python环境中需要特殊处理注释行。1.2 高效获取数据资源的三种途径官方渠道# UCR数据集下载 wget https://www.cs.ucr.edu/~eamonn/time_series_data_2018/UCRArchive_2018.zip # UEA备用下载官网不稳定时 aria2c -x16 https://cloud.example.com/Multivariate2018_arff.zip预处理版本快捷获取 我们已将所有数据集转换为即用型格式NPZ压缩包适合Python快速加载CSV标准化版本兼容Excel/Pandas可视化专用XLSX含自动生成的时序图表网盘链接见文末附录包含完整的数据字典说明2. 数据格式深度处理实战2.1 TSV到CSV的工业级转换方案原始UCR的TSV文件需处理缺失值和类型转换def convert_tsv_to_csv(tsv_path, csv_dir): 处理包含特殊字符和科学计数法的TSV转换 df pd.read_csv(tsv_path, sep\t, enginepython, na_values[NaN, NA, ?], dtype{sensor_value: np.float32}) # 自动检测时间戳列 if df.iloc[:,0].dtype object: try: df.iloc[:,0] pd.to_datetime(df.iloc[:,0]) except: pass df.to_csv(f{csv_dir}/{Path(tsv_path).stem}.csv, indexFalse, float_format%.6f)关键问题排查遇到UnicodeDecodeError时添加encodingISO-8859-1内存不足时使用chunksize参数分批读取科学计数法转换异常需指定float_precisionhigh2.2 多维时间序列的降维可视化技巧对于UEA的多元数据使用t-SNE和PCA进行可视化前处理from sklearn.manifold import TSNE import plotly.express as px def visualize_multivariate(data): # 数据标准化 scaler StandardScaler() data_scaled scaler.fit_transform(data.reshape(-1, data.shape[-1])) # 三维降维 tsne TSNE(n_components3, perplexity30) embedding tsne.fit_transform(data_scaled) # 交互式可视化 fig px.scatter_3d(embedding, colorlabels, titleUEA数据集t-SNE投影) fig.update_traces(marker_size3) fig.show()实战建议对50维的数据先用PCA降至20维再做t-SNE避免拥挤问题。3. 工程化预处理流水线3.1 自动化的缺失值处理策略时间序列缺失值需要时序感知的填补方法class TimeSeriesImputer: def __init__(self, strategylinear): self.strategy strategy def fit_transform(self, X): if self.strategy spline: return pd.DataFrame(X).interpolate(methodspline, order3).values elif self.strategy ffill: return pd.DataFrame(X).ffill().bfill().values else: # linear by default return pd.DataFrame(X).interpolate().values效果对比方法RMSE保持趋势计算速度线性插值0.12★★★★★★★★☆三次样条0.09★★★★☆★★★前向填充0.25★★☆★★★★★3.2 非等长序列的标准化处理使用动态时间规整(DTW)或统一插值from scipy.interpolate import interp1d def uniform_resample(series, target_length100): original_length len(series) x_original np.linspace(0, 1, original_length) x_new np.linspace(0, 1, target_length) f interp1d(x_original, series, kindquadratic) return f(x_new)注意插值会改变原始数据统计特性建议在模型评估时对比原始结果。4. 从数据到模型的完整Pipeline4.1 特征工程黄金组合时域特征均值、方差、过零率频域特征FFT能量占比非线性特征近似熵、样本熵from tsfresh import extract_features def extract_ts_features(X): settings { mean: None, variance: None, fft_coefficient: [{coeff: 0, attr: abs}], approximate_entropy: [{m: 2, r: 0.2}] } return extract_features(X, default_fc_parameterssettings, n_jobs4)4.2 轻量级建模方案使用Rocket或MiniRocket快速验证from sktime.classification.kernel_based import RocketClassifier rocket RocketClassifier(num_kernels1000) rocket.fit(X_train, y_train) print(f测试准确率{rocket.score(X_test, y_test):.2%})性能基准UCR数据集示例算法准确率训练时间Rocket85.3%2.1minResNet82.7%32minXGBoost79.5%8.4min在项目实践中我们通常会先运行Rocket获取基线性能再根据业务需求选择更复杂的模型。记得始终保留20%的数据作为最终测试集——很多初学者会在这个环节犯错导致过拟合的虚假高准确率。

更多文章