- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Keras 中使用 LSTM 实现了一个预测模型。数据集间隔 15 分钟,我预测 future 的 12 个步骤。
该模型对问题表现良好。但是做出的预测有一个小问题。它显示出小的偏移效果。要获得更清晰的图片,请参见下面的附图。
如何处理这个问题。?必须如何转换数据才能处理此类问题。?
下面给出了我使用的模型
init_lstm = RandomUniform(minval=-.05, maxval=.05)
init_dense_1 = RandomUniform(minval=-.03, maxval=.06)
model = Sequential()
model.add(LSTM(15, input_shape=(X.shape[1], X.shape[2]), kernel_initializer=init_lstm, recurrent_dropout=0.33))
model.add(Dense(1, kernel_initializer=init_dense_1, activation='linear'))
model.compile(loss='mae', optimizer=Adam(lr=1e-4))
history = model.fit(X, y, epochs=1000, batch_size=16, validation_data=(X_valid, y_valid), verbose=1, shuffle=False)
我是这样预测的
my_forecasts = model.predict(X_valid, batch_size=16)
使用此函数将时间序列数据转换为有监督数据以提供给 LSTM
# convert time series into supervised learning problem
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
super_data = series_to_supervised(data, 12, 1)
我的时间序列是多变量的。 var2
是我需要预测的那个。我放弃了 future 的 var1
就像
del super_data['var1(t)']
分开的火车和这样有效
features = super_data[feat_names]
values = super_data[val_name]
ntest = 3444
train_feats, test_feats = features[0:-n_test], features[-n_test:]
train_vals, test_vals = values [0:-n_test], values [-n_test:]
X, y = train_feats.values, train_vals.values
X = X.reshape(X.shape[0], 1, X.shape[1])
X_valid, y_valid = test_feats .values, test_vals .values
X_valid = X_valid.reshape(X_valid.shape[0], 1, X_valid.shape[1])
我没有让这个预测的数据固定下来。我也尝试了差异化并尽可能使模型静止,但问题仍然存在。
我还为最小-最大缩放器尝试了不同的缩放范围,希望它能对模型有所帮助。但预测越来越糟。
Other Things I have tried
=> Tried other optimizers
=> Tried mse loss and custom log-mae loss functions
=> Tried varying batch_size
=> Tried adding more past timesteps
=> Tried training with sliding window and TimeSeriesSplit
我知道模型正在向它复制最后一个已知值,从而尽可能地减少损失
在整个训练过程中,验证和训练损失保持足够低。这让我思考是否需要为此目的提出新的损失函数。
有这个必要吗?如果是这样,我应该使用什么损失函数。?
我已经尝试了我偶然发现的所有方法。我根本找不到任何指向此类问题的资源。这是数据的问题吗?这是因为这个问题很难被 LSTM 学习吗?
最佳答案
您在以下位置寻求我的帮助:
stock prediction : GRU model predicting same given values instead of future stock price
希望不会迟到。您可以尝试的是您可以转移特征的数值显式。让我解释一下:
类似于我在上一个主题中的回答;回归算法将使用您提供的时间窗口中的值作为样本,以最小化错误。假设您正在尝试预测 BTC 在时间 t 的收盘价。您的一个特征包括之前的收盘价,并且您给出了从 t-20 到 t-1 的最后 20 个输入的时间序列窗口。 回归器可能会学习在时间步长 t-1 或 t-2 或关闭值中选择关闭值,在这种情况下,作弊。可以这样想:如果 t-1 时的收盘价为 6340 美元,则预测 6340 美元或 t+1 时的收盘价将使误差最小化。但实际上算法并没有学习任何模式;它只是复制,所以它基本上除了完成其优化任务外什么都不做。
从我的例子中类比地思考:通过转移显性,我的意思是:不要直接给出收盘价,而是缩放它们或者根本不使用显性的。不要使用任何明确显示算法收盘价的特征,不要在每个时间步使用开盘价、最高价、最低价等。您需要在这里发挥创造力,设计功能以摆脱显式功能;您可以给出平方差(回归器仍然可以通过线性差异和经验从过去窃取),它与体积的比率。或者,可以通过以一种对使用有意义的方式将特征数字化来使特征分类。 重点是不要给出它应该预测什么的直接直觉,只提供算法的工作模式。
根据您的任务,可能会建议更快的方法。如果预测标签的变化百分比对你来说足够了,你可以进行多类分类,只是要注意类不平衡的情况。如果仅上/下波动对您来说就足够了,您可以直接进行二元分类。 复制或转移问题仅在回归任务中出现,前提是您没有将数据从训练集泄漏到测试集。如果可能,摆脱时间序列窗口应用程序的回归。
如果有任何误解或遗漏,我会在附近。希望我能帮上忙。祝你好运。
关于python - 如何处理预测值的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52252442/
我正在使用 R 预测包拟合模型,如下所示: fit <- auto.arima(df) plot(forecast(fit,h=200)) 打印原始数据框和预测。当 df 相当大时,这
我正在尝试预测自有住房的中位数,这是一个行之有效的例子,给出了很好的结果。 https://heuristically.wordpress.com/2011/11/17/using-neural-ne
type="class"函数中的type="response"和predict有什么区别? 例如: predict(modelName, newdata=testData, type = "class
我有一个名为 Downloaded 的文件夹,其中包含经过训练的 CNN 模型必须对其进行预测的图像。 下面是导入图片的代码: import os images = [] for filename i
关于预测的快速问题。 我尝试预测的值是 0 或 1(它设置为数字,而不是因子),因此当我运行随机森林时: fit , data=trainData, ntree=50) 并预测: pred, data
使用 Python,我尝试使用历史销售数据来预测产品的 future 销售数量。我还试图预测各组产品的这些计数。 例如,我的专栏如下所示: Date Sales_count Department It
我是 R 新手,所以请帮助我了解问题所在。我试图预测一些数据,但预测函数返回的对象(这是奇怪的类(因子))包含低数据。测试集大小为 5886 obs。 160 个变量,当预测对象长度为 110 时..
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
下面是我的神经网络代码,有 3 个输入和 1 个隐藏层和 1 个输出: #Data ds = SupervisedDataSet(3,1) myfile = open('my_file.csv','r
我正在开发一个 Web 应用程序,它具有全文搜索功能,可以正常运行。我想对此进行改进并向其添加预测/更正功能,这意味着如果用户输入错误或结果为 0,则会查询该输入的更正版本,而不是查询结果。基本上类似
我对时间序列还很陌生。 这是我正在处理的数据集: Date Price Location 0 2012-01-01 1771.0
我有许多可变长度的序列。对于这些,我想训练一个隐马尔可夫模型,稍后我想用它来预测(部分)序列的可能延续。到目前为止,我已经找到了两种使用 HMM 预测 future 的方法: 1) 幻觉延续并获得该延
我正在使用 TensorFlow 服务提供初始模型。我在 Azure Kubernetes 上这样做,所以不是通过更标准和有据可查的谷歌云。 无论如何,这一切都在起作用,但是我感到困惑的是预测作为浮点
我正在尝试使用 Amazon Forecast 进行一些测试。我现在尝试了两个不同的数据集,它们看起来像这样: 13,2013-03-31 19:25:00,93.10999 14,2013-03-3
使用 numpy ndarray大多数时候我们不需要担心内存布局的问题,因为结果并不依赖于它。 除非他们这样做。例如,考虑这种设置 3x2 矩阵对角线的稍微过度设计的方法 >>> a = np.zer
我想在同一个地 block 上用不同颜色绘制多个预测,但是,比例尺不对。我对任何其他方法持开放态度。 可重现的例子: require(forecast) # MAKING DATA data
我正在 R 中使用 GLMM,其中混合了连续变量和 calcategories 变量,并具有一些交互作用。我使用 MuMIn 中的 dredge 和 model.avg 函数来获取每个变量的效果估计。
我能够在 GUI 中成功导出分类器错误,但无法在命令行中执行此操作。有什么办法可以在命令行上完成此操作吗? 我使用的是 Weka 3.6.x。在这里,您可以右键单击模型,选择“可视化分类器错误”并从那
我想在同一个地 block 上用不同颜色绘制多个预测,但是,比例尺不对。我对任何其他方法持开放态度。 可重现的例子: require(forecast) # MAKING DATA data
我从 UCI 机器学习数据集库下载了一个巨大的文件。 (~300mb)。 有没有办法在将数据集加载到 R 内存之前预测加载数据集所需的内存? Google 搜索了很多,但我到处都能找到如何使用 R-p
我是一名优秀的程序员,十分优秀!