使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。

在时间序列分析领域中,数据缺失是一个不可避免的挑战。无论是由于传感器故障、数据传输中断还是设备维护等原因,这些缺失都会对数据分析和预测造成显著影响。传统的处理方法,如前向填充或简单插值,虽然实现简单,但在处理复杂数据时往往表现不足。

具体来说,当时间序列具有以下特征时,传统方法的局限性就会显现:

  • 存在复杂的非线性模式
  • 包含多层次的趋势变化
  • 数据波动性较大

本文将通过实际案例,详细探讨如何运用机器学习技术来解决时间序列的缺失值问题。

数据说明

为了确保研究的可重复性,我们构建了一个模拟的能源生产数据集。这个数据集具有以下特征:

  • 时间范围:2023年1月1日至2023年3月1日
  • 采样频率:10分钟
  • 数据特点:包含真实的昼夜能源生产周期
  • 缺失设置:随机选择10%的数据点作为缺失值

让我们首先看看如何生成这个数据集:

 importpandasaspd  
 importnumpyasnp  
 fromdatetimeimportdatetime  
 importmatplotlib.pyplotasplt  

 # 生成模拟能源生产数据  
 start_date=datetime(2023, 1, 1)  
 end_date=datetime(2023, 3, 1)  
 datetime_index=pd.date_range(start=start_date, end=end_date, freq='10T')  

 # 创建具有昼夜周期的能源生产值  
 np.random.seed(42)  # 设置随机种子以确保可重复性
 base_energy= []  
 fordtindatetime_index:  
     hour=dt.hour  
     if6<=hour<=18:  # 白天时段:较高的能源生产
         energy=np.random.normal(loc=300, scale=30)  
     else:  # 夜间时段:较低的能源生产
         energy=np.random.normal(loc=50, scale=15)  
     base_energy.append(energy)  

 energy_production=pd.Series(base_energy)  

 # 随机引入缺失值  
 num_missing=int(0.1*len(energy_production))  
 missing_indices=np.random.choice(len(energy_production), num_missing, replace=False)  
 energy_production.iloc[missing_indices] =np.nan  

 # 创建数据框架
 mock_energy_data_with_missing=pd.DataFrame({  
     'Datetime': datetime_index,  
     'Energy_Production': energy_production  
 })  

 # 添加时间索引便于后续分析
 data_with_index=mock_energy_data_with_missing.reset_index()  
 data_with_index['Time_Index'] =np.arange(len(data_with_index))  

 # 数据可视化
 plt.figure(figsize=(14, 7))  
 plt.plot(mock_energy_data_with_missing['Datetime'], 
          mock_energy_data_with_missing['Energy_Production'],   
          label='Energy Production (With Missing)', color='blue', alpha=0.7)  
 plt.scatter(mock_energy_data_with_missing['Datetime'], 
             mock_energy_data_with_missing['Energy_Production'],   
             c=mock_energy_data_with_missing['Energy_Production'].isna(), 
             cmap='coolwarm',   
             label='Missing Values', s=10)  
 plt.title('模拟能源生产数据集(10分钟间隔采样)')  
 plt.xlabel('时间')  
 plt.ylabel('能源生产量')  
 plt.legend(['能源生产(含缺失值)', '缺失值'])  
 plt.grid(True)  
 plt.show()

图1:模拟能源生产数据可视化。蓝线表示能源生产数据,散点表示缺失值的位置。

从上图中,我们可以清晰地观察到以下特征:

  1. 数据展现出明显的周期性波动,这反映了能源生产的昼夜变化规律
  2. 缺失值(散点标记)随机分布在整个时间序列中
  3. 能源生产量在白天和夜间有显著的水平差异

这个数据集为我们研究不同补充方法的效果提供了理想的测试基础。在接下来的分析中,我们将详细探讨如何运用机器学习方法来补充这些缺失值。

机器学习在时间序列补充中的应用基础

机器学习方法的优势

在时间序列数据分析中,机器学习方法相比传统补充方法具有独特优势。传统方法通常基于简单的统计假设,而机器学习方法则能够自适应地学习数据中的复杂模式和多维依赖关系。

非线性关系处理:在能源生产等实际场景中,变量之间往往存在复杂的非线性关系。机器学习模型能够自动捕捉这些非线性模式,而无需预先指定关系形式。

多维特征利用:当数据集包含多个相关变量时,机器学习模型可以同时考虑多个特征的影响,从而提供更准确的估计。

大规模缺失处理:对于连续时间段的缺失,机器学习可以通过学习数据的长期模式来提供更可靠的补充值。

异常模式识别:在处理非随机缺失时,机器学习方法表现出较强的鲁棒性,能够识别并适应异常模式。

线性回归补充方法实现

我们首先探讨线性回归这一基础但高效的补充方法。以下是详细的实现步骤:

 importpandasaspd  
 importnumpyasnp  
 fromdatetimeimportdatetime  
 importmatplotlib.pyplotasplt  
 fromsklearn.linear_modelimportLinearRegression  

 # 第一步:数据预处理
 # 将时间索引作为特征,能源生产量作为目标变量
 features=data_with_index[['Time_Index']]  
 target=data_with_index['Energy_Production']  

 # 第二步:分离完整数据和缺失数据
 non_missing_data=data_with_index.dropna(subset=['Energy_Production'])  
 missing_data=data_with_index[data_with_index['Energy_Production'].isna()]  

 # 第三步:模型训练
 # 使用完整数据训练线性回归模型
 regressor=LinearRegression()  
 regressor.fit(non_missing_data[['Time_Index']], non_missing_data['Energy_Production'])  

 # 第四步:缺失值预测
 predicted_values=regressor.predict(missing_data[['Time_Index']])  

 # 第五步:将预测值填充到原始数据集
 filled_data=data_with_index.copy()  
 filled_data.loc[filled_data['Energy_Production'].isna(), 'Energy_Production'] =predicted_values  
 filled_data=filled_data[['Datetime', 'Energy_Production']]  

 # 第六步:结果可视化(展示2023年1月数据)
 start_month=datetime(2023, 1, 1)  
 end_month=datetime(2023, 1, 31)  
 original_month_data=mock_energy_data_with_missing[  
     (mock_energy_data_with_missing['Datetime'] >=start_month) &   
     (mock_energy_data_with_missing['Datetime'] <=end_month)  
 ]  
 imputed_month_data=filled_data[  
     (filled_data['Datetime'] >=start_month) &   
     (filled_data['Datetime'] <=end_month)  
 ]  

 plt.figure(figsize=(14, 7))  
 plt.plot(imputed_month_data['Datetime'], imputed_month_data['Energy_Production'],   
          label='补充后数据', color='green', alpha=0.8)  
 plt.plot(original_month_data['Datetime'], original_month_data['Energy_Production'],   
          label='原始数据(含缺失)', color='red', alpha=0.9)  
 plt.title('原始数据与线性回归补充数据对比(2023年1月)')  
 plt.xlabel('时间')  
 plt.ylabel('能源生产量')  
 plt.legend()  
 plt.grid(True)  
 plt.show()

图2:线性回归补充效果可视化。绿线表示补充后的数据,红线表示原始数据。

补充效果的多维度评估

为了全面评估补充效果,我们需要从多个维度进行分析。以下是详细的评估框架:

 fromstatsmodels.tsa.seasonalimportseasonal_decompose  

 # 统计特征分析
 original_stats=mock_energy_data_with_missing['Energy_Production'].describe()  
 imputed_stats=filled_data['Energy_Production'].describe()  

 # 创建比较表
 stats_comparison=pd.DataFrame({  
     'Metric': original_stats.index,  
     'Original Data': original_stats.values,  
     'Imputed Data (Linear Regression)': imputed_stats.values  
 })  

 # 输出统计比较结果
 print("数据统计特征对比:")
 print(stats_comparison)

这个统计分析揭示了以下关键发现:

  1. 数据完整性:补充后的数据集从7648个观测值增加到8497个,实现了完整覆盖。
  2. 中心趋势:补充后数据的均值(185.07)与原始数据基本一致,表明保持了数据的整体水平。
  3. 离散程度:补充数据的标准差(120.31)略低于原始数据(126.82),表明发生了一定程度的平滑。
  4. 分布特征:虽然最大值和最小值保持不变,但中位数的变化反映出分布形态有所改变。

通过这些初步分析,我们可以看到线性回归方法在保持数据基本特征方面表现良好,但也存在一定的局限性,特别是在处理数据的变异性方面。在下一部分中,我们将进一步探讨更多高级评估指标,以及决策树回归等其他补充方法的表现。

时间序列补充效果的深入评估

在时间序列分析中,仅依靠基本的统计指标是不够的。我们需要特别关注数据的时序特性,包括自相关性、趋势和季节性模式。让我们逐步深入这些关键评估维度。

自相关性分析

自相关性反映了时间序列中相邻观测值之间的依赖关系。保持适当的自相关结构对于确保补充数据的时序特性至关重要。以下是详细的分析过程:

 importstatsmodels.apiassm  

 defplot_acf_comparison(original_series, imputed_series, lags=50):  
     """
     绘制并比较原始数据和补充数据的自相关函数
     参数:
         original_series: 原始时间序列
         imputed_series: 补充后的时间序列
         lags: 滞后阶数
     """
     plt.figure(figsize=(14, 5))  

     # 分析原始数据的自相关性
     plt.subplot(1, 2, 1)  
     sm.graphics.tsa.plot_acf(original_series.dropna(), lags=lags, 
                             ax=plt.gca(), title="原始数据的自相关函数")  
     plt.grid(True)  

     # 分析补充数据的自相关性
     plt.subplot(1, 2, 2)  
     sm.graphics.tsa.plot_acf(imputed_series, lags=lags, 
                             ax=plt.gca(), title="补充数据的自相关函数")  
     plt.grid(True)  

     plt.tight_layout()  
     plt.show()  

 # 执行自相关分析
 plot_acf_comparison(mock_energy_data_with_missing['Energy_Production'], 
                    filled_data['Energy_Production'])

图3:自相关函数对比分析。左图显示原始数据的自相关性,右图显示补充后数据的自相关性。

从自相关分析中,我们可以观察到几个重要特征:

  1. 短期相关性:补充数据在短期滞后期(1-5个lag)的自相关系数与原始数据非常接近,表明短期时间依赖关系得到了良好保持。
  2. 周期性特征:两个图中都清晰显示出规律的波动模式,这反映了数据中的日周期特性被很好地保留。
  3. 相关强度:补充数据的自相关系数整体略低于原始数据,这是线性回归补充过程中不可避免的平滑效应导致的。

时间序列分解分析

为了更深入地理解补充效果,我们使用STL(Seasonal-Trend decomposition using Loess)方法将时间序列分解为趋势、季节性和残差组件:

 # 执行STL分解
 original_series=mock_energy_data_with_missing['Energy_Production']  
 imputed_series=filled_data['Energy_Production']  

 # 考虑每日144个观测值的周期(10分钟采样间隔)
 original_decompose=seasonal_decompose(original_series.interpolate(), 
                                      model='additive', period=144)  
 imputed_decompose=seasonal_decompose(imputed_series.interpolate(), 
                                      model='additive', period=144)  

 # 绘制趋势比较
 plt.figure(figsize=(14, 5))  
 plt.plot(original_decompose.trend, label='原始趋势', color='blue')  
 plt.plot(imputed_decompose.trend, label='补充数据趋势', 
          color='green', linestyle='--')  
 plt.title('趋势组件比较:原始数据 vs 线性回归补充')  
 plt.legend()  
 plt.grid(True)  
 plt.show()  

 # 绘制季节性比较
 plt.figure(figsize=(14, 5))  
 plt.plot(original_decompose.seasonal, label='原始季节性', color='blue')  
 plt.plot(imputed_decompose.seasonal, label='补充数据季节性', 
          color='green', linestyle='--')  
 plt.xlim(0, 4000)  
 plt.title('季节性组件比较:原始数据 vs 线性回归补充')  
 plt.legend()  
 plt.grid(True)  
 plt.show()

图4:趋势组件比较。蓝线表示原始数据趋势,绿虚线表示补充数据趋势。

图5:季节性组件比较。展示了原始数据和补充数据的周期性模式。

通过分解分析我们发现:

趋势组件特征:

  • 补充数据很好地保持了原始数据的长期趋势方向
  • 趋势线的平滑程度增加,这是线性回归方法的特性导致的
  • 关键的趋势转折点得到了准确保持

季节性组件特征:

  • 日内周期的基本模式被准确捕获
  • 补充数据的季节性振幅略有减小,表明极值被部分平滑
  • 周期性的时间点(如日出、日落时段)的变化模式得到保持

这些分析结果提示我们,虽然线性回归方法在保持数据的基本时序特性方面表现不错,但在处理极值和突变点方面可能存在局限,所以我们选用一些更好的模型如决策树回归器,来改善这些方面的表现。

决策树回归方法的应用与评估

在观察到线性回归方法的局限性后,我们引入决策树回归器作为一种更灵活的补充方法。决策树的非线性特性使其能够更好地捕捉数据中的复杂模式。

决策树回归器的实现

让我们首先看看如何使用决策树进行缺失值补充:

 fromsklearn.treeimportDecisionTreeRegressor  

 # 配置并训练决策树模型
 # max_depth=5用于防止过拟合,同时保持足够的模型复杂度
 tree_regressor=DecisionTreeRegressor(max_depth=5, random_state=42)  
 tree_regressor.fit(non_missing_data[['Time_Index']], 
                   non_missing_data['Energy_Production'])  

 # 使用训练好的模型预测缺失值
 tree_predicted_values=tree_regressor.predict(missing_data[['Time_Index']])  

 # 将预测值填充到原始数据集
 tree_filled_data=data_with_index.copy()  
 tree_filled_data.loc[tree_filled_data['Energy_Production'].isna(), 
                     'Energy_Production'] =tree_predicted_values  
 tree_filled_data=tree_filled_data[['Datetime', 'Energy_Production']]  

 # 可视化决策树补充结果
 plt.figure(figsize=(14, 7))  
 plt.plot(tree_imputed_month_data['Datetime'], 
          tree_imputed_month_data['Energy_Production'],   
          label='决策树补充数据', color='orange', alpha=0.8)  
 plt.plot(original_month_data['Datetime'], 
          original_month_data['Energy_Production'],   
          label='原始数据(含缺失)', color='red', alpha=0.9)  
 plt.title('原始数据与决策树补充数据对比(2023年1月)')  
 plt.xlabel('时间')  
 plt.ylabel('能源生产量')  
 plt.legend()  
 plt.grid(True)  
 plt.show()

图6:决策树补充结果可视化。橙线表示决策树补充的数据,红线表示原始数据。

从图中可以直观地看到,决策树方法在保持数据特征方面展现出了以下优势:

  1. 更好地保持了数据的局部变化特征
  2. 对极值的处理更为准确
  3. 补充结果展现出更自然的波动性

补充效果对比分析

让我们通过各项指标来系统比较两种方法的表现:

 # 统计指标比较
 stats_comparison['决策树补充数据'] =tree_filled_data['Energy_Production'].describe()

核心统计指标对比:

 Metric          Original Data    Linear Regression    Decision Tree
 count           7648.000000     8497.000000         8497.000000
 mean            185.073509      185.073842          184.979184
 std             126.816229      120.313162          120.633636
 min             -7.549833       -7.549833           -7.549833
 25%             51.793304       54.186258           53.797479
 50%             256.996772      185.197681          185.545605
 75%             302.217789      298.324435          298.531049
 max             415.581945      415.581945          415.581945

这些数据揭示了一些重要的发现:

分布特征保持:

  • 决策树补充的数据在标准差方面(120.63)比线性回归(120.31)更接近原始数据(126.82)
  • 两种方法都很好地保持了数据的整体范围(最小值和最大值)
  • 决策树在四分位数的保持上表现更好,特别是在中位数方面

自相关性分析:

图7:两种方法的自相关分析对比。

决策树方法在时间依赖性的保持方面表现出明显优势:

  • 更准确地保持了短期相关性强度
  • 更好地捕捉了周期性模式
  • 自相关结构的衰减特征更接近原始数据
  1. 趋势和季节性分解:

图8:趋势组件比较

图9:季节性组件比较

从分解结果可以看出:

  • 决策树方法在保持趋势的细节特征方面表现更好
  • 季节性模式的振幅和相位都得到了更准确的保持
  • 整体而言,决策树补充的数据展现出更自然的时间序列特性

方法优劣势总结与应用建议

基于以上分析,我们可以得出以下结论:

线性回归方法的特点:

  • 优势:计算效率高,实现简单
  • 劣势:对非线性模式的捕捉能力有限
  • 适用场景:数据呈现明显的线性趋势,且波动较为规律

决策树方法的特点:

  • 优势:能更好地处理非线性关系,保持数据的局部特征
  • 劣势:计算复杂度较高,需要更多的参数调优
  • 适用场景:数据具有复杂的非线性模式,需要保持精细的局部特征

实践建议:

  • 对于简单的时间序列,可以优先考虑线性回归方法
  • 在处理复杂模式的数据时,建议使用决策树方法
  • 可以根据具体应用场景的需求(如计算资源限制、精度要求等)来选择合适的方法

本文展示了机器学习方法在时间序列缺失值补充中的有效性,并提供了方法选择的实践指导。这些方法和评估框架可以推广到其他类似的时间序列分析场景中。

https://avoid.overfit.cn/post/12d612023a8d4af6af191f57d4c8c451

作者:Sara Nóbrega

目录
相关文章
|
2天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
4天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
5613 18
|
16天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
8天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
4天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
|
1月前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
8天前
|
Cloud Native Apache 流计算
PPT合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
3477 10
PPT合集|Flink Forward Asia 2024 上海站
|
1天前
|
弹性计算 运维 监控
阿里云云服务诊断工具:合作伙伴架构师的深度洞察与优化建议
作为阿里云的合作伙伴架构师,我深入体验了其云服务诊断工具,该工具通过实时监控与历史趋势分析,自动化检查并提供详细的诊断报告,极大提升了运维效率和系统稳定性,特别在处理ECS实例资源不可用等问题时表现突出。此外,它支持预防性维护,帮助识别潜在问题,减少业务中断。尽管如此,仍建议增强诊断效能、扩大云产品覆盖范围、提供自定义诊断选项、加强教育与培训资源、集成第三方工具,以进一步提升用户体验。
604 242
|
21天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
5931 16
|
4天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
471 37