前言
在上本科的时候经常和时间序列模型打交道,一看到它就想到ARMA,ARIMA等一系列模型,算是老相识了,这次好好梳理一下。
一、时间序列问题
1.概念
时间序列问题是指对按时间顺序排列的数据点进行分析和预测的问题,往往用来做未来的趋势预测。比如,基于历史股票每天的股价,预测未来股票的价格走向。
2.常见场景
- 金融领域:股票价格预测、利率变动、汇率预测等。
- 气象领域:温度、降水量、风速等气候指标的预测。
- 销售预测:产品或服务的未来销售额预测。
- 库存管理:预测库存需求,优化库存水平。
- 能源领域:电力需求预测、石油价格预测等。
- 医疗领域:疾病爆发趋势预测、医疗资源需求预测。
3.数据特点
- 时间依赖性:数据点之间存在时间上的连续性和依赖性。
- 非平稳性:数据的统计特性(如均值、方差)随时间变化。
- 季节性:数据表现出周期性的模式,如年度、月度或周度。
- 趋势:数据随时间推移呈现长期上升或下降的趋势。
- 周期性:数据可能存在非固定周期的波动。
- 随机波动:数据可能受到随机事件的影响,表现出不确定性。
二、时间序列预测问题
时间序列预测问题可以通过多种建模方法来解决,包括传统的时间序列模型、机器学习模型和深度学习模型。
1.传统时间序列模型
(1)建模思路
- 基于时间序列数据的统计特性,如自相关性、季节性等。
- 使用ARIMA、季节性ARIMA(SARIMA)、指数平滑等模型。
- 通过识别数据的趋势和季节性成分来构建模型。
(2)优点
- 模型结构简单,易于理解和解释。
- 计算效率高,适合于数据量较小的问题。
- 直接针对时间序列数据设计,能够很好地处理数据的季节性和趋势。
(3)缺点
- 对于非线性模式和复杂的时间序列数据,预测能力有限。
- 需要手动进行参数选择和模型调整。
- 对数据的平稳性有严格要求,非平稳数据需要差分等预处理。
2.机器学习模型
(1)建模思路
- 将时间序列数据转换为监督学习问题,使用历史数据作为特征,未来值作为标签。
- 使用决策树、随机森林、梯度提升树等模型。
- 通过特征工程来提取时间序列数据中的有用信息。
(2)优点
- 能够处理非线性关系和复杂的数据模式。
- 通过特征工程可以引入额外的解释性变量。
- 模型选择多样,可以进行模型融合以提高预测性能。
(3)缺点
- 对于时间序列数据的内在时间结构和季节性可能不够敏感。
- 需要大量的特征工程工作。
- 模型的解释性可能不如传统时间序列模型
3.深度学习模型
(1)建模思路
- 使用循环神经网络(RNN)、长短期记忆网络(LSTM)或一维卷积神经网络(1D-CNN)等模型。
- 能够捕捉时间序列数据中的长期依赖关系。
- 通过训练大量的参数来学习数据的复杂模式。
(2)优点
- 能够处理非常复杂的数据模式和长期依赖关系。
- 适用于大量数据,可以自动提取特征。
- 模型的灵活性和适应性强。
(3)缺点
- 需要大量的数据和计算资源。
- 模型训练和调优可能比较复杂和耗时。
- 模型的解释性较差,难以理解预测结果的原因。
4.对比总结
项目 | 传统时序模型 | 机器学习模型 | 深度学习模型 |
---|---|---|---|
适用性 | 数据量较小、模式简单的问题 | 中等复杂度的问题,可以引入额外变量 | 数据量大、模式复杂的任务 |
解释性 | 较好 | 取决于特征工程 | 较差 |
计算资源 | 效率最高 | 次之 | 需要最多的计算资源 |
预测能力 | 数据量较小或模式较简单时更有效 | 数据量较小或模式较简单时更有效 | 在捕捉复杂模式方面具有优势,但需要大量数据支持 |
三、代码解读
# 1. 导入需要用到的相关库
# 导入 pandas 库,用于数据处理和分析
import pandas as pd
# 导入 numpy 库,用于科学计算和多维数组操作
import numpy as np
# 2. 读取训练集和测试集
# 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
train = pd.read_csv('train.csv')
# 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'train.csv'
test = pd.read_csv('test.csv')
# 3. 计算训练数据最近11-20单位时间内对应id的目标均值
target_mean = train[train['dt']<=20].groupby(['id'])['target'].mean().reset_index()
# 4. 将target_mean作为测试集结果进行合并
test = test.merge(target_mean, on=['id'], how='left')
# 5. 保存结果文件到本地
test[['id','dt','target']].to_csv('submit.csv', index=None)
- 导入库:首先代码导入了需要用到的库,包括 pandas(用于数据处理和分析)。
- 读取数据:代码通过使用 pd.read_csv 函数从文件中读取训练集和测试集数据,并将其存储在 train.csv 和 test.csv 两个数据框中。
- 将用电均值直接作为预测结果:
- 这里使用merge函数根据’id’列将test和target_mean两个DataFrame进行左连接,这意味着测试集的所有行都会保留。
- 保存结果文件到本地:
- 使用to_csv()函数将测试集的’id’、‘dt’和’target’列保存为CSV文件,文件名为’submit.csv’。index=None参数表示在保存时不包含行索引。