使用Infomer进行简单的预测(股票预测,碳排放预测)

1.代码与论文

Informer论文链接:arxiv.org/pdf/1706.03762.pdficon-default.png?t=N7T8https://arxiv.org/pdf/1706.03762.pdf

Informer代码链接:GitHub - zhouhaoyi/Informer2020: The GitHub repository for the paper "Informer" accepted by AAAI 2021.icon-default.png?t=N7T8https://github.com/zhouhaoyi/Informer2020

2.训练

Informer的github仓库下有原文作者自己制作的时序预测数据集,百度网盘链接如下:百度网盘 请输入提取码 (baidu.com),提取码为6gan。

参数设置

主要参数设置都在main_informer.py文件中,下面进行主要需要调整的参数介绍

# 选择模型,我使用的Informer原始模型,Informerstack是在Informer的基础上增加了一个stack encoder,可以处理更长的输入序列,Informerlight(TBD)为轻量化Informer
parser.add_argument('--model', type=str, default='informer',help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')
# 选择数据类型,这里有ETTh1,ETTh2,ETTm1,ETTm2,WTH和custom的选择,其中前几个为官方给的数据类型,如果使用自己的数据集训练,则可选择custom,但需要在本文件下面定义custom
parser.add_argument('--data', type=str, default='custom', help='data')
# 选择数据位置,这里的是相对根目录的相对路径
parser.add_argument('--root_path', type=str, default='./data/', help='root path of the data file')
# 数据名称
parser.add_argument('--data_path', type=str, default='train.csv', help='data file')
# 选择进行时序预测的类型,M为使用多变量时间序列作为输入,预测多变量的时间序列作为输出;S为使用单变量时间序列作为输入,预测单变量的时间序列作为输出;MS为使用多变量的时间序列作为输入,预测单变量的时间序列作为输出;
parser.add_argument('--features', type=str, default='MS', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
# 这里的target参数即为在你的csv数据中你想预测的变量,比如我想预测开盘价,我的csv文件中为open,这里则是open
parser.add_argument('--target', type=str, default='open', help='target feature in S or MS task')
# 设置时间特征编码,可以根据你训练集中的时间间隔设置,我这里设置的是天
parser.add_argument('--freq', type=str, default='d', help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
# 权重保存位置
parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints')
# 下面的参数设置部分我按照的原作者的设置,只有在batch size进行了更改,如果使用的是笔记本的显卡来训练,则可以将batch size适当调小,比如1,2,4...
# 所使用数据集设置,在--data的参数可以调为下面的名称,即可直接使用下面所定义的

data_parser = {
    'ETTh1':{'data':'ETTh1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
    'ETTh2':{'data':'ETTh2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
    'ETTm1':{'data':'ETTm1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
    'ETTm2':{'data':'ETTm2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
    'WTH':{'data':'WTH.csv','T':'WetBulbCelsius','M':[12,12,12],'S':[1,1,1],'MS':[12,12,1]},
    'ECL':{'data':'ECL.csv','T':'MT_320','M':[321,321,321],'S':[1,1,1],'MS':[321,321,1]},
    'Solar':{'data':'solar_AL.csv','T':'POWER_136','M':[137,137,137],'S':[1,1,1],'MS':[137,137,1]},
    # custom是我定义的自己训练的数据集,其中“open”为我所预测的变量,后面拿M:[7,7,7]举例,为用七个特征作为输入,预测7个特征的输出
    'custom':{'data':'train.csv','T':'open','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]}
}

数据调整好后,即可开始训练,本人进行了一个简单的股票预测和碳排放预测(下载的数据已上传,应该能看到,我忘记在哪个网址下的了,也可以去Carbon monitor 这里找),在这里我只采用了美国2019-2023的碳排放数据作为训练集,由于碳排放只有简简单单的一列co2排放量(--features选择S),导致预测的效果很差,趋势图更是惨不忍睹(建议有这个想法的最好把数据集弄好,要有几列相关联的数据,效果会更好),图如下:

由此可以看出碳排放趋势变化不大,但是预测趋势却起伏不定。下面是我用股票数据集(这个数据不能公开)进行预测后绘制的图像(--features选择MS)。

由于Informer有一个early stop机制,当训练过程中的loss值不在下降时,则会主动停止,这也是目前很多新的时序预测模型训练带的一个机制(比如Timesnet),如果大家想不那么早停止,epoch和patience都可以调大一点。

parser.add_argument('--patience', type=int, default=3, help='early stopping patience')

输出:

若想输出对训练时间之后的预测结果,可以把下面的store_true改为store_false,即可在./results/中的一个文件夹中找的real_prediction.npy文件,这里面存储的就是对未来的预测结果。

parser.add_argument('--do_predict', action='store_false', help='whether to predict unseen future data')

下面是绘制上述对比图的python代码:

import matplotlib.pyplot as plt
import numpy as np

setting = 'informer_custom_ftMS_sl96_ll48_pl24_dm512_nh8_el2_dl1_df2048_atprob_fc5_ebtimeF_dtTrue_mxTrue_test_0'
pred = np.load('./results/'+setting+'/pred.npy')
true = np.load('./results/'+setting+'/true.npy')
print(pred.shape)
print(true.shape)


plt.figure()
plt.plot(true[0,:,-1], label='GroundTruth')
plt.plot(pred[0,:,-1], label='Prediction')
plt.legend()
plt.show()

这里的setting即为./results中的文件夹名字。

3.指标

初始的main_informer中的指标只有mse和mae两个,若想做一篇论文可能还是略有欠缺,下面是我添加的几个指标,都是在时序预测中可以作为评判标准的:

def RMSE(pred, true):
    return np.sqrt(MSE(pred, true))

def MAPE(pred, true):
    return np.mean(np.abs((pred - true) / true))

def MSPE(pred, true):
    return np.mean(np.square((pred - true) / true))

def r(preds, trues):
    preds = np.squeeze(preds)
    trues = np.squeeze(trues)
    return np.corrcoef(preds, trues)[0, 1]

def metric(pred, true):
    # 计算指标
    mae = calculate_mae(pred, true)
    mse = calculate_mse(pred, true)
    rmse = calculate_rmse(pred, true)
    mape = calculate_mape(pred, true)
    mspe = calculate_mspe(pred, true)
    rse = RSE(pred, true)

    return mae, mse, rmse, mape, mspe, rse

然后再在exp_informer中更改test部分的函数:
 

    def test(self, setting):
        test_data, test_loader = self._get_data(flag='test')
        
        self.model.eval()
        
        preds = []
        trues = []
        
        for i, (batch_x,batch_y,batch_x_mark,batch_y_mark) in enumerate(test_loader):
            pred, true = self._process_one_batch(
                test_data, batch_x, batch_y, batch_x_mark, batch_y_mark)
            preds.append(pred.detach().cpu().numpy())
            trues.append(true.detach().cpu().numpy())

        preds = np.array(preds)
        trues = np.array(trues)
        print('test shape:', preds.shape, trues.shape)

        preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])
        trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1])
        print('test shape:', preds.shape, trues.shape)

        # result save
        folder_path = './results/' + setting +'/'
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)

        mae, mse, rmse, mape, mspe, rse = metric(preds, trues)
        print('mse:{}, mae:{}, rmse: {}, mape: {}, rse: {}'.format(mse, mae, rmse, mape, rse))

        np.save(folder_path+'metrics.npy', np.array([mae, mse, rmse, mape, mspe]))
        np.save(folder_path+'pred.npy', preds)
        np.save(folder_path+'true.npy', trues)

        return

这样在预测中,就可以显示mse(均方误差),mae(平均绝对误差),rmse(均方根误差),mape(平均绝对百分比误差),rse(残差标准误差)

4.总结

其实在近几年流行的这几个时序预测模型(Informer,Timesnet,LSTM,Transformer)中,最适合的应该是Informer,个人试了以上几种网络,Timesnet对显存的要求太高,得租用服务器才能进行训练,而LSTM和Transformer时间又有点久远,且不如Informer,所以进行时序预测可以对Informer下手。

Informer作为2021年AAAI会议上的最佳论文,其创新性也非常强,在他的ProbSparse self-attention和生成式解码器机制上做文章也是十分不错。

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Informer是一种用于股票预测的模型。该模型使用Transformer结构,它可以处理序列数据。在训练Informer模型时,通常需要提供一对输入和输出序列作为训练数据。例如,在股价预测任务中,输入序列是过去一段时间的股价,输出序列是未来一段时间的股价预测。编码器的输入为过往股价,解码器的输入为预测股价,并且解码器的输出也是预测股价。因此,训练数据集是一对对应的数据,而不是单一类别的数据。 股票市场是金融市场中不可或缺的组成部分。准确预测股票趋势对于投资者和市场参与者具有重要意义,因为它们可以指导投资决策、优化投资组合以及降低金融风险。而且可以提升国家国际地位以及金融风险控制能力,还可以促进股票市场发展以及资源优化利用。股票趋势预测算法作为时间序列预测领域的重要分支,在其他时序预测分支上也具备通用性。 对于Informer股票预测,可以使用模型的predict()方法进行预测。该方法可以直接预测所有数据后面的未知数据。在预测过程中,需要指定预测的长度,例如预测后5天的收盘价走势。预测的结果会保存在指定的路径下的文件中。 在过去的研究中,已经使用了各种传统统计学和机器学习方法来分析过去的股票趋势和预测未来的股票价格。传统统计方法包括差分整合移动自回归平均模型(ARIMA)和简单指数平滑法(SES),而机器学习方法包括支持向量机(SVM)、随机森林(RF)和人工神经网络(ANN)。在这些方法中,机器学习模型通常在预测股票走势应用方面优于ARIMA等统计学模型。 综上所述,Informer是一种用于股票预测的模型,它使用Transformer结构并处理序列数据。它可以通过训练一对对应的输入和输出序列来进行预测。在预测过程中,可以使用模型的predict()方法来预测未知数据。此外,机器学习模型通常在股票预测中表现优于传统统计学模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值