当前位置: 首页 > news >正文

怎么将网站做成公司官网wordpress google 地图插件

怎么将网站做成公司官网,wordpress google 地图插件,团队拓展游戏,百度网站名称及网址背景 这篇文章可以说是基于 现代的一些神经网络的方法去做时间序列预测的一个介绍科普#xff0c;也可以说是一个各种模型对比的案例#xff0c;但也会谈一谈自己做了这么久关于神经网络的时间序列预测的论文#xff0c;其中一些常见的模式及它们存在的问题以及效果#x… 背景 这篇文章可以说是基于 现代的一些神经网络的方法去做时间序列预测的一个介绍科普也可以说是一个各种模型对比的案例但也会谈一谈自己做了这么久关于神经网络的时间序列预测的论文其中一些常见的模式及它们存在的问题以及效果还有在实际生产中去运用究竟会有什么问题 时间序列预测的几种模式 首先我们要知道一个滑动窗口的概念时间序列预测无非就是用之前的数据去预测未来的数据。与传统的机器学习的二维表格不同时间序列最简单的模式就是单变量单步预测。即我们要预测一个变量我们就用这个变量前几期的数据去预测未来下一期的数据例如我们的滑动窗口大小为10也就是说我们用这个变量 Xt-10到Xt 的数据去预测 Xt1 的取值这里就不写latex公式了反正应该也挺通俗易懂的。也就是说在单变量单步预测模型中你的一个X向量就是 Xt-10到Xt 的数据 y标量就是 Xt1 的取值。然后我们可以不停的滑动这个窗口得到很多组X跟y就可以去训练模型了。注意这里的X是三维数据形状为(n,t,p), n为样本量t是时间步长也就是滑动窗口大小p是特征数量这里单变量就是1y形状为(n,1)的向量 现代神经网络基本都是这样做的所以这导致了一个问题我们要预测 Xt2 就没有办法了因为我们不知道 Xt1 的真实值。有的人说可以吧 Xt1 的预测值放进去继续预测确实传统模型都是这样做的但是这样势必又会导致另外一个问题即误差的累计因为 Xt1 的预测值不是真实值所以有误差预测出来的Xt2就是在有误差的数据上预测出来的那效果肯定会更差并且时间步长越久误差越夸张。 根据经验这种方法预测出来到三步五步以后基本都没法看和真实值差距是天涯海角。传统的ARIMA都是这样做的所以基本上很多人用这个模型都会发现他们预测出来的数据就是一条直线.......... 所以这就衍生出了一个问题那我们要做多步预测该怎么办这个也是我们要谈到的神经网络的第二种预测模式即单变量多步预测。既然我们因为不知道Xt1所以没办法预测Xt2那我们干脆直接用 Xt-10到Xt 的数据,去预测出来 Xt1 到 Xt5假设我们要预测5步很多计量经济学和传统统计学的同学要炸毛了因为在传统的统计学模式基本看不到这种y取值是多个的情况在无数的传统统计学和计量的模型以及一些基础的机器学习模型无论是分类还是回归问题我们的y都是一个标量都是一个具体的取值一个数字而不是一个向量。向量也能作为y 在神经网络里面是可以的毕竟深度学习连图片连音频连文本, 视频都可以作为y一个向量作为y是很正常的事情大部分同学做模型的时候连数据的形状都没弄清楚其实这是一个很重要的认知你一定要认清楚你的X跟y是什么形状你才能去用对应的模型。 回到我们的单变量多步预测模型上来我们的X还是之前的X形状为(n,t,p)但是我们的y却不再是一个向量而是一个矩阵形状为(n,T) T为你要预测的时间的步长多步神经网络有2种方法去训练即直接要预测几步, 你的输出层就用几个神经元: outputs Dense(5, activationlinear)(pooled_output) # 输出形状: (n, 5) pooled_output是上一层经过池化 或者是循环神经网络最后一刻的状态有可能是经过展开的mlp反正就是将输入的X从3维变为2维度之后的情况输入的pooled_output是二维数据这样输出的就是一个(n,5)的向量即n个样本每个样本都预测了5步。这种方法直观我目前基本上做的多步预测都是用这个方法。 也可以使用另外一种方法训练使用 TimeDistributed lstm_output LSTM(16, return_sequencesTrue)(inputs) # 输出形状: (n, 10, 16) # 使用 TimeDistributed outputs TimeDistributed(Dense(1, activationlinear))(lstm_output) # 输出形状: (n, 10, 1) 可以看到这里的滑动窗口的时间步长和预测的步长就得是一样的。输入的lstm_output还是三维进去三维出来然后直接直接转为二维y矩阵了。(y就一个特征所以可以直接reshape为(n,10))。所以这种方法不能灵活的控制你的输入滑动窗口的步长跟你要预测的时间步长必须一样。至于精准度和上面的方法比起来我也没试过哪一种好。 讲完了上面的单变量的单步和多步预测下面另外两种模式也更好理解也无非就是X特征变多了是多变量的单步跟多变量的多步预测。 其实思路和训练代码上没有太多差异X形状还是三维形状为(n,t,p), 这里的p就不是1了是2以上。单步预测的y还是(n,1)多步还是(n,T), 只是在构建我们的训练集和测试集的时候需要注意一下这个多维度的时候构建X和y去对数据运用切片索引的问题。 按道理来说以前基于树模型的二维表格的机器学习都是变量越多越好但是在如今的这个循环神经网络里面并不是特征p越多越好。时间序列很看你上一时刻的这些变量的情况有的时间序列特征噪音会特别多而且会突变例如之前的可能取值都是1后面突然一下变成100会对我们要预测的变量造成严重的干扰这个可能也得进行一定的选择。 还有一些别的模式例如用Xt-10到Xt 去预测 Xt8 或者是 Xt9 这种美言自称是多步预测的模式我就不多说了这本质也是单步预测..............都是一个换汤不换药的概念。反正在自己的论文里面咋吹都是合理的 神经网络预测时间序列预测的一些问题 常见的时间序列预测的模式都讲完了下面再来讲一下。这些模式会有哪些问题 首先就是很多新手刚开始做出一个模型预测值和真实值一对比就会有一个滞后性的困惑 所谓滞后性的困惑就是如上图一样我们的预测值看起来就像真实值往后挪了一个时间单位。可能我这个图有点密集画的太小看不清楚但整体而言滞后性的困惑 就是我们预测出来的Xt1的值好像就是上一时刻Xt的值看起来我们的预测无非就是把真实值进行了滞后一期罢了。 很多人不懂为什么我刚开始学的时候也有这个困惑但是后来做多了也就没管了反正大家都这样干我也就这样干吧。但现在我大概明白了里面的这个原理和大家讲一讲。 首先一些正常的时间序列例如股票价格空气质量人体的血糖浓度......都是具有强烈的自相关的序列数据这点是不可否认的即我们的Xt1跟Xt肯定是具有高度的相关性系数并且是线性相关。就例如股价你无论再怎么变你肯定也是昨天价格的±10%的区间不可能离昨天的值差距太远太离谱。所以就造成了这种今天的价格跟昨天的价格是强烈的线性正相关的关系。 我们都知道随机过程中经典的醉汉问题即一个醉汉如果在开始坐标为(0,0)的二维平面上开始进行随机游走每1秒钟走一步那么走了十几个小时或者是一天之后我们在哪里找到这个醉汉的概率最大 答案是原点就是(0,0)的位置因为是随机游走在随机游走中醉汉的每一步移动是独立的且在每个方向上的移动是随机的。假设醉汉在二维平面上每秒钟移动一步每一步在x轴和y轴上的移动是独立的且在每个方向上左、右、上、下的概率相等。他的动向的分布肯定是符合正态的符合均值为零的。 所以再回到我们的时间序列预测问题。我们要预测下一时间的Xt1时间的取值也就是去找可能概率最大的取值其可能性在哪里呢那么就在上 Xt 上也就是Xt的取值是作为Xt1的概率最大所以模型们都很聪明——他们基本都学到了概率最大的情况也就是直接把昨天的值稍微修改那么一点点作为今天的预测值就好了这也是为什么我们用循环神经网络做这种单步预测的时候发现这种有滞后性的困惑的问题。本质就是时间序列的跟上一时刻的强烈的自相关带来的概率化最优的问题。 当然实际上模型肯定不会直接用上一个的取值完全相同作为下一时间的预测值因为有些时间序列的动向变化肯定也不会是完全的概率相同的随机过程。他们神经网络模型肯定还是会根据数据的一些模式例如季节性波动性趋势性学到一点点的修改。但是这种修改到底是好还是坏呢我们肯定是用一些误差指标来进行衡量。然后进行一个对比。 这就引出了第二个问题即 神经网络预测出来的都是类似滞后一期的数据。那我能不能构建一个基准模型——即MA(1)模型直接用Xt 的值作为Xt1的预测值然后在整个样本上计算误差评价指标和神经网络预测出来的预测值进行一个对比我们来看看效果到底行不行。 为什么叫MA(1)模型MA大家都知道是移动平均模型即用前n天的真实值平均一下作为每天的预测值。如果我们极端一点取n等于1 那么就是用前一天的平均值作为下一天的预测值也就是说直接用今天的真实值作为下一天的预测值我们就可以对比——我们花费了无数时间精力学习到构建出来的循环神经网络模型整了一堆乱七八糟的卷积门控注意力机制transformer层和我们最简单的MA(1)模型对比到底到底能够强多少 这就是今天这个案例的目的。 数据介绍 本次用的数据都是之前的案例常用的一些时间序列我懒得找新的了就主要是这5个 每个数据都是两列一列时间一列是它的取值当然它们的时间频率不一样但是无所谓神经网络也不管你是日度还是月度还是季度的还是甚至是秒级的反正都是一样训练。 本次下面演示的就用石油价格这个序列进行划分训练集和测试集构建3维的数据张量进行单变量单步预测。 对比如下的神经网络模型 [Transformer, CNNBiLSTM, BiGRU-Attention,BiLSTM-Attention, BiGRU, BiLSTM, TCN, GRU, CNN, LSTMRNN,MLP, ] 在目前大量外行还在用lstm这种模型发论文的时候我上面就随便这几个模型都可以写一篇普通期刊的论文再缝合一点模态分解优化算法或者损失函数都可以发SCI了。并且他们的构建很简单我全部都统一化和模块化了。 当然需要本次演示的数据和全部代码文件的同学还是可以参考神经网络时间序列 代码实现 导入包我们用keras框架默认TensorFlow后端。3.0以上可以用pytorch作为后端API接口类似。 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import os import time from datetime import datetime import random as rn import scipy.special as sc_special plt.rcParams [font.sans-serif] SimHei #显示中文 plt.rcParams [axes.unicode_minus]False #显示负号from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import mean_absolute_error from sklearn.metrics import mean_squared_error,r2_scoreimport tensorflow as tf import keras import keras.backend as K from keras.models import Model, Sequential from keras.layers import Dense,Input, Dropout, Flatten,MaxPooling1D,Conv1D,SimpleRNN,LSTM,GRU,GlobalMaxPooling1D,Layer from keras.layers import BatchNormalization,GlobalAveragePooling1D,MultiHeadAttention,AveragePooling1D,Bidirectional,LayerNormalization from keras.callbacks import EarlyStopping 这个框架的代码做了太多次了以前的文章也有非常多所以说我也不过多的写解释了下面就简单罗列一下这个过程。都是为了我们要展示一下最终的结果对比罢了。 读取数据 data0pd.read_excel(时间序列测试数据.xlsx,parse_dates[date],sheet_name1).set_index(date).ffill() data0.head() sheet_name1因为我的石油价格是装在第二个sheet里面所以我们用等于一然后把data设置为时间索引。最后的.ffill 是为了防止数据的缺失值就用前一个值进行填充。 展示数据折线图 data0.plot(figsize(12,3)) 构建训练集和测试集 单变量单步模型构建X和y的函数 def build_sequences(text, window_size24):#text:list of capacityx, y [],[]for i in range(len(text) - window_size):sequence text[i:iwindow_size]target text[iwindow_size]x.append(sequence)y.append(target)return np.array(x), np.array(y)def get_traintest(data,train_ratio0.8,window_size24):train_sizeint(len(data0)*train_ratio)traindata[:train_size]testdata[train_size-window_size:]X_train,y_trainbuild_sequences(train,window_sizewindow_size)X_test,y_testbuild_sequences(test,window_sizewindow_size)return X_train,y_train,X_test,y_test 划分训练集和测试集滑动窗口大小为64 train_ratio0.8 #训练集比例 window_size64 #滑动窗口大小即循环神经网络的时间步长 X_train,y_train,X_test,y_testget_traintest(np.array(data0).reshape(-1,),window_sizewindow_size,train_ratiotrain_ratio) print(X_train.shape,y_train.shape,X_test.shape,y_test.shape) 可以看到上面数据X还是2维的下面归一化 #归一化 scaler MinMaxScaler() scaler scaler.fit(X_train) X_trainscaler.transform(X_train) X_testscaler.transform(X_test)y_train_oragey_train.copy() y_scaler MinMaxScaler() y_scaler y_scaler.fit(y_train.reshape(-1,1)) y_trainy_scaler.transform(y_train.reshape(-1,1)) 转为3维 X_trainX_train.reshape(X_train.shape[0],X_train.shape[1],1) X_testX_test.reshape(X_test.shape[0],X_test.shape[1],1) y_testy_test.reshape(-1,1) ; test_sizey_test.shape[0] print(X_train.shape,y_train.shape,X_test.shape,y_test.shape) 画图展示 plt.figure(figsize(10,5),dpi256) plt.plot(data0.index[:-test_size],data0.iloc[:-test_size],labelTrain,color#FA9905) plt.plot(data0.index[-test_size:],data0.iloc[-(test_size):],labelTest,color#FB8498,linestyledashed) plt.legend() plt.ylabel(Predict Series,fontsize16) plt.xlabel(Time,fontsize16) plt.show() 定义评价指标 回归问题总是用这四个指标maermsemapeR2 定义随机数种子和计算评价指标的函数当然我这里就没要R2了用的mse是一样的要用R2就改一下下面的函数就行了。 def set_my_seed():os.environ[PYTHONHASHSEED] 0np.random.seed(1)rn.seed(12345)tf.random.set_seed(123)def evaluation(y_test, y_predict):mae mean_absolute_error(y_test, y_predict)mse mean_squared_error(y_test, y_predict)rmse np.sqrt(mean_squared_error(y_test, y_predict))mape(abs(y_predict -y_test)/ y_test).mean()#r_2r2_score(y_test, y_predict)return mse, rmse, mae, mape 构建ma1模型 ### 基准预测情况 result pd.DataFrame() result[t] pd.Series(data0.iloc[:,0]) # 生成第1列到第10列每一列是t1到t10滑动窗口的值 for i in range(1, 6):result[ft-{i}] result[t].shift(i) resultresult.dropna()for t in result.columns[1:]:scorelist(evaluation(result[t], result[t]))s[round(i,3) for i in score]print(f{t}的预测效果为RMSE:{s[0]},MAE:{s[1]},MAPE:{s[2]},R2:{s[3]}) 可以看到MA1模型的RMSE:1.791,MAE:1.338,MAPE:0.768,R2:0.013很低。 构建模型 下面构建我们的神经网络模型由于要用transformer层所以我们需要自定义很多东西 class AttentionLayer(Layer): #自定义注意力层def __init__(self, **kwargs):super(AttentionLayer, self).__init__(**kwargs)def build(self, input_shape):self.W self.add_weight(nameattention_weight,shape(input_shape[-1], input_shape[-1]),initializerrandom_normal,trainableTrue)self.b self.add_weight(nameattention_bias,shape(input_shape[1], input_shape[-1]),initializerzeros,trainableTrue)super(AttentionLayer, self).build(input_shape)def call(self, x):# Applying a simpler attention mechanisme K.tanh(K.dot(x, self.W) self.b)a K.softmax(e, axis1)output x * areturn outputdef compute_output_shape(self, input_shape):return input_shape#from __future__ import print_function from keras import backend as K from keras.layers import Layer from tensorflow.keras import layers from tensorflow import kerasclass PositionEncoding(Layer):def __init__(self, model_dim, **kwargs):self._model_dim model_dimsuper(PositionEncoding, self).__init__(**kwargs)def call(self, inputs):seq_length inputs.shape[1]position_encodings np.zeros((seq_length, self._model_dim))for pos in range(seq_length):for i in range(self._model_dim):position_encodings[pos, i] pos / np.power(10000, (i-i%2) / self._model_dim)position_encodings[:, 0::2] np.sin(position_encodings[:, 0::2]) # 2iposition_encodings[:, 1::2] np.cos(position_encodings[:, 1::2]) # 2i1position_encodings K.cast(position_encodings, float32)return position_encodingsdef compute_output_shape(self, input_shape):return input_shape class Add(Layer):def __init__(self, **kwargs):super(Add, self).__init__(**kwargs)def call(self, inputs):input_a, input_b inputsreturn input_a input_bdef compute_output_shape(self, input_shape):return input_shape[0]class TransformerEncoder(layers.Layer):def __init__(self, embed_dim, dense_dim, num_heads, **kwargs):super().__init__(**kwargs)self.embed_dim embed_dimself.dense_dim dense_dimself.num_heads num_headsself.attention layers.MultiHeadAttention(num_headsnum_heads, key_dimembed_dim)self.dense_proj keras.Sequential([layers.Dense(dense_dim, activationrelu),layers.Dense(embed_dim),] )self.layernorm_1 layers.LayerNormalization()self.layernorm_2 layers.LayerNormalization()def call(self, inputs, maskNone):if mask is not None:mask mask[:, tf.newaxis, :]attention_output self.attention(inputs, inputs, attention_maskmask)proj_input self.layernorm_1(inputs attention_output)proj_output self.dense_proj(proj_input)return self.layernorm_2(proj_input proj_output)def get_config(self):config super().get_config()config.update({embed_dim: self.embed_dim,num_heads: self.num_heads,dense_dim: self.dense_dim,})return config 构建模型函数 def build_model(X_train,modeLSTM,hidden_dim[64,32]):set_my_seed()if modeMLP:model Sequential()model.add(Flatten())model.add(Dense(hidden_dim[0],activationrelu,input_shape(X_train.shape[-2],X_train.shape[-1])))model.add(Dense(hidden_dim[1],activationrelu))#model.add(Dense(16,activationrelu))model.add(Dense(1))elif modeRNN:model Sequential()model.add(SimpleRNN(hidden_dim[0],return_sequencesTrue, input_shape(X_train.shape[-2],X_train.shape[-1])))model.add(Dropout(0.2))model.add(SimpleRNN(hidden_dim[1])) model.add(Dropout(0.2))model.add(Dense(1))elif modeCNN:model Sequential()model.add(Conv1D(hidden_dim[0],X_train.shape[-2]-2,activationrelu,input_shape(X_train.shape[-2],X_train.shape[-1])))model.add(GlobalMaxPooling1D())model.add(Dense(hidden_dim[1],activationrelu))model.add(Dense(1))elif modeLSTM:model Sequential()model.add(LSTM(hidden_dim[0],return_sequencesTrue, input_shape(X_train.shape[-2],X_train.shape[-1])))model.add(Dropout(0.2))model.add(LSTM(hidden_dim[1]))model.add(Dropout(0.2))model.add(Dense(1))elif modeGRU:model Sequential()model.add(GRU(hidden_dim[0],return_sequencesTrue, input_shape(X_train.shape[-2],X_train.shape[-1])))model.add(Dropout(0.2))model.add(GRU(hidden_dim[1]))model.add(Dropout(0.2))model.add(Dense(1))elif modeBiLSTM:model Sequential()model.add(Bidirectional(LSTM(hidden_dim[0],return_sequencesTrue, input_shape(X_train.shape[-2],X_train.shape[-1]))))model.add(Dropout(0.2))model.add(Bidirectional(LSTM(hidden_dim[1])))model.add(Dropout(0.2))model.add(Dense(1))elif modeBiGRU:model Sequential()model.add(Bidirectional(GRU(hidden_dim[0],return_sequencesTrue, input_shape(X_train.shape[-2],X_train.shape[-1]))))model.add(Dropout(0.2))model.add(Bidirectional(GRU(hidden_dim[1])))model.add(Dropout(0.2))model.add(Dense(1))elif mode BiGRU-Attention:model Sequential()model.add(GRU(hidden_dim[0], return_sequencesTrue, input_shape(X_train.shape[-2], X_train.shape[-1])))model.add(AttentionLayer())# Adding normalization and dropout for better training stability and performancemodel.add(LayerNormalization())#model.add(Dropout(0.1))model.add(GRU(hidden_dim[1]))model.add(Dense(1))elif mode BiLSTM-Attention:model Sequential()model.add(Bidirectional(LSTM(hidden_dim[0], return_sequencesTrue), input_shape(X_train.shape[-2], X_train.shape[-1])))model.add(AttentionLayer())model.add(LayerNormalization())model.add(Dropout(0.2))model.add(Bidirectional(LSTM(hidden_dim[1])))#model.add(Flatten())model.add(Dense(hidden_dim[1],activationrelu))model.add(Dense(1))elif modeCNNBiLSTM: model Sequential()model.add(Conv1D(filtershidden_dim[0], kernel_size3, paddingsame,activationrelu))model.add(MaxPooling1D(pool_size2))model.add(Bidirectional(LSTM(hidden_dim[1])))model.add(Dense(1))elif mode TCN:model Sequential()for dilation_rate in [1, 2]:model.add(Conv1D(filtershidden_dim[0], kernel_size2, dilation_ratedilation_rate, paddingcausal, activationrelu, input_shape(X_train.shape[-2], X_train.shape[-1])))model.add(Flatten())model.add(Dense(1))elif modeTransformer:model Sequential()inputs Input(shape[X_train.shape[-2],X_train.shape[-1]], nameinputs)encodings PositionEncoding(32)(inputs)encodings Add()([inputs, encodings])x TransformerEncoder(32, hidden_dim[1], 2)(encodings) #嵌入维度全连接层神经元数多头数x GlobalAveragePooling1D()(x)#x Dropout(0.2)(x)#x Dense(32, activationrelu)(x)outputs Dense(1)(x)model Model(inputs[inputs], outputsoutputs)else:raise ValueError(Unsupported mode: mode)model.compile(optimizerAdam, lossmse ,metrics[tf.keras.metrics.RootMeanSquaredError(),mape,mae])return model 定义一些画图展示用的函数 def plot_loss(hist,imfname):plt.subplots(1,4,figsize(16,2))for i,key in enumerate(hist.history.keys()):nint(str(14)str(i1))plt.subplot(n)plt.plot(hist.history[key], k, labelfTraining {key})plt.title(f{imfname} Training {key})plt.xlabel(Epochs)plt.ylabel(key)plt.legend()plt.tight_layout()plt.show() def plot_fit(y_test, y_pred):plt.figure(figsize(4,2))plt.plot(y_test, colorred, labelactual)plt.plot(y_pred, colorblue, labelpredict)plt.title(f拟合值和真实值对比)plt.xlabel(Time)plt.ylabel(power)plt.legend()plt.show() 定义训练函数初始化两个数据框用于储存我们的误差评价指标和预测值我们会在序列函数里面进行模型的训练预测误差评价指标的计算以及储存。 df_eval_allpd.DataFrame(columns[MSE,RMSE,MAE,MAPE]) df_preds_allpd.DataFrame() def train_fuc(modeLSTM,batch_size32,epochs50,hidden_dim[32,16],verbose0,show_lossTrue,show_fitTrue):#构建模型s time.time()set_my_seed()modelbuild_model(X_trainX_train,modemode,hidden_dimhidden_dim)earlystop EarlyStopping(monitorloss, min_delta0, patience5)histmodel.fit(X_train, y_train,batch_sizebatch_size,epochsepochs,callbacks[earlystop],verboseverbose)if show_loss:plot_loss(hist)#预测y_pred model.predict(X_test)y_pred y_scaler.inverse_transform(y_pred)#print(f真实y的形状{y_test.shape},预测y的形状{y_pred.shape})if show_fit:plot_fit(y_test, y_pred)etime.time()print(f运行时间为{round(e-s,3)})df_preds_all[mode]y_pred.reshape(-1,)slist(evaluation(y_test, y_pred))df_eval_all.loc[f{mode},:]ss[round(i,3) for i in s]print(f{mode}的预测效果为MSE:{s[0]},RMSE:{s[1]},MAE:{s[2]},MAPE:{s[3]})print(运行结束)return s[0] 初始化参数 window_size64 batch_size32 epochs50 hidden_dim[32,16]verbose0 show_fitTrue show_lossTrue modeLSTM #MLP,GRU 模型训练 构建MLP模型 train_fuc(modeMLP,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) 上面4个小图分别是训练时候的不同损失的下降情况可以看到基本上40轮以后肯定都收敛了。下面是真实值和预测值对比然后会打印这些误差指标以及运行时间。 构建RNN模型 train_fuc(modeRNN,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) 就不展示那么多了下面我们把所有的模型都一起训练然后所有的误差指标都会储存起来我们后面一起查看就可以了。 train_fuc(modeCNN,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeTCN,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeGRU,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeLSTM,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeBiGRU,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeBiLSTM,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeCNNBiLSTM,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeBiLSTM-Attention,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeBiGRU-Attention,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) train_fuc(modeTransformer,batch_sizebatch_size,epochsepochs,hidden_dimhidden_dim) 有的同学可能惊讶于我不同模型就修改一个mode参数就行了其他全自动 我知道大部分同学写代码都是东拼西凑而且没有很好的编码风格也不规范所以说会花费大量的时间在于人的手工调整以及修改中。优雅的写法当然是只修改一个参数就可以把所有重复的过程都再进行一遍这就是函数的封装性和简洁性的妙用重复的代码绝对不会重写重复的工作绝对不会重做。 因为我们写文章无非都是训练不同的模型预测结果进行评价对比这都是重复的工作只是说模型不一样罢了。所有的过程都是重复性的过程自然就要用代码去消灭这些重复性的工作就得把他们封装的特别好简洁和易用。 查看评价指标 我们直接按照MSE排个序 df_eval_all.loc[MA1,:]evaluation(result[t], result[t-1]) df_eval_all.sort_values(MSE,ascendingTrue).style.bar(colorpink) 可以看到MA1模型误差最低不直观的话可以进行可视化 bar_width 0.4 colors[c, orange,g, tomato,b, m, y, lime, k,orange,pink,grey,tan] fig, ax plt.subplots(2,2,figsize(8,6),dpi128) for i,col in enumerate(df_eval_all.columns):nint(str(22)str(i1))plt.subplot(n)df_coldf_eval_all[col]m np.arange(len(df_col))plt.bar(xm,heightdf_col.to_numpy(),widthbar_width,colorcolors)##plt.xlabel(Methods,fontsize12)namesdf_col.indexplt.xticks(range(len(df_col)),names,fontsize10)plt.xticks(rotation90)plt.ylabel(col,fontsize14)plt.tight_layout() #plt.savefig(柱状图.jpg,dpi512) plt.show() 什么结果不用多说了吧虽然transformer是所有神经网络里面表现效果最好的模型mse最小也符合常理。但是所有的神经网络都没有MA1模型的误差低。也就是说我们费尽千辛万苦各种复杂的结构层算法构建出来的神经网络居然都不如直接用Xt 的值作为Xt1的预测值这种最简单的MA1模型 是不是颠覆三观了也就是说这么多充斥在学术界和研究界的用神经网络去做时间序列预测的模型的水论文研究基本上都是无用功。当然更高级的模型我没试过不知道不乱说 但是没什么人来指出这个问题听说最近国外在顶会上有人针对这种神经网络预测长时间序列提出了一系列的问题但是他们的聚焦点还是在于这些误差评价指标不适用于时间序列预测中并没有意识到神经网络用于时间序列目前的这个构建方法是存在问题的。 好在我们不用那么悲观虽然没意义但是90%的论文谁不是为了水论文呢谁又真的拿去实际生产模型中去部署调用呢更重要的是所谓的专家学者老师导师审稿人都对这些一窍不通也没人发现这其中的问题。 当然我为什么选着这个油价数据是因为他是最具有代表性的。我测试了在其他数据上的这些模型的对比表现我发现ma1模型并不总是最好的但是它总是能够获得一个中等偏上的水平也就是说他总能够打败60%以上的神经网络模型如果你的数据有的还挺适合神经网络的那就还可以用神经网络做一些有价值的工作吧。 但是一般来说频率很高的这种强自相关的数据ma1效果都挺好的。 最后再画一个不同模型预测出来的序列结果的对比图这也是水文章里面常用的 总结 神经网络做时间序列预测主要有单变量单步预测单变量多步预测多变量单步预测多变量多步预测 本次演示的是最简单的单变量单步预测对比了10种神经网络模型。[Transformer, CNNBiLSTM, BiGRU-Attention,BiLSTM-Attention, BiGRU, BiLSTM, TCN, GRU, CNN, LSTMRNN,MLP, ]然后发现所有的神经网络都没有MA1模型的误差低。也就是说我们费尽千辛万苦各种复杂的结构层算法构建出来的神经网络居然都不如直接用Xt 的值作为Xt1的预测值这种最简单的MA1模型。 但是也不用太悲观在有的数据上表现ma1不一定最好并且大部分专家审稿人导师都不懂国内也没有人指出这个问题所以目前水论文还是可以随便放心的用。并且知道这个东西没啥意义就好要是真的以为自己做了个模型能够产生多少价值跟收益那可太天真了。 各种模态分解优化算法损失函数缝合不同的神经网络预测时间序列的模型在往期文章中都有 Python数据分析案例24——基于深度学习的锂电池寿命预测_锂离子电池寿命预测 Python数据分析案例25——海上风力发电预测多变量循环神经网络 Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测 Python数据分析案例42——基于Attention-BiGRU的时间序列数据预测 Python数据分析案例44——基于模态分解和深度学习的电负荷量预测(VMDBiGRU注意力) Python数据分析案例50——基于EEMD-LSTM的石油价格预测 Python数据分析案例52——基于SSA-LSTM的风速预测(麻雀优化) 怎么水论文里面也写的非常清楚。代码都是类似的框架高度封装换个数据就能用不需要怎么修改。 随便组合缝合都能发SCI毕业真的太容易了有木有。 创作不易看官觉得写得还不错的话点个关注和赞吧本人会持续更新python数据分析领域的代码文章~(需要定制类似的代码可私信)
http://www.hkea.cn/news/14472654/

相关文章:

  • 电商 网站 降低 跳出率 措施 效果免费网站制造
  • 搭建网站不用服务器吗网页设计图片显示不出来
  • 网站dns解析免费做手机网站
  • 怎么添加网站关键词互联网信息平台
  • 网站模板制作教程郑州建站以来
  • 哪里做公司网站比较好网页设计培训推荐
  • 做网站怎么注册域名腾讯云10g数字盘做网站够么
  • 潮州seo建站saas系统
  • 个人网站用什么建站程序书法网站建站目标
  • 淘客做网站有必要吗济南做网站优化价格
  • 自己做网站跟域名怎样做阿里云域名价格
  • vs2013如何做网站男科医院和正规医院哪家好
  • 都江堰网站建设公司海外购物网站排名
  • 怎样在建设部网站查资质证书猪八戒网站做软件
  • 比较有特色的网站长沙网红打卡点
  • 怎么做自己的免费网站seo教程视频
  • 什么网站教人做3d效果图惠州手工外发加工网
  • 没技术怎么做网站江苏高效网站制作机构
  • 国内永久免费建站上海的所有公司
  • 英语培训网站模板asp 建站
  • 长治市住房保障和城乡建设管理局网站做一款网站
  • 铁道部售票网站多少钱建设公司网站建设模板下载
  • 凌云网站e时代速递搜索引擎网站建设
  • 怎么做网络销售的网站跳转短链接生成
  • 免费网站建设价格wordpress顶部图片大小
  • 百度网站收录提交入口在哪信息造价网
  • 做设计什么设计比较好的网站刚刚深圳出的大事
  • 企业网站推广的实验内容源码站
  • 网站维护怎么收费做网站的公司天津
  • 什么是网站的tdk深圳百度推广联系方式