keras 即使我的训练数据集是整个数据集的5%,LSTM模型也能给我99%的R平方

drkbr07n  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(89)

我正在使用LSTM模型来执行时间序列预测。我有一个奇怪的问题,我的R平方基本上总是99%,即使我的训练数据集是总数据集的5%!我绘制了预测值和测试数据之间的图表,它看起来几乎相同。这怎么可能
我的数据归一化后是这样的

date    0   1   2   3   4   5   6   7   8   9
0   2019-01-01 00:00:01+00:00   0.000000    0.000000    0.000   1.000   0.000   0.500000    0.079178    0.076970    0.079109    0.077500
1   2019-01-01 00:00:02+00:00   0.000000    0.000000    0.000   1.000   0.000   0.500000    0.079178    0.076970    0.079109    0.077500
2   2019-01-01 00:00:07+00:00   0.000025    0.000103    0.000   0.492   0.508   0.738780    0.079178    0.076970    0.079109    0.077500
3   2019-01-01 00:00:07+00:00   0.000000    0.000002    0.000   1.000   0.000   0.500000    0.079178    0.076970    0.079109    0.077500
4   2019-01-01 00:00:08+00:00   0.000000    0.000000    0.000   0.000   1.000   0.711130    0.079178    0.076970    0.079109    0.077500
... ... ... ... ... ... ... ... ... ... ... ...
116022  2020-07-28 08:39:59+00:00   0.000000    0.000000    0.000   0.844   0.156   0.786466    0.781738    0.782749    0.781928    0.782748
116023  2020-07-28 08:44:57+00:00   0.000000    0.000000    0.000   1.000   0.000   0.500000    0.781738    0.782749    0.781928    0.782748
116024  2020-07-28 08:47:59+00:00   0.000000    0.000000    0.244   0.756   0.000   0.279403    0.781738    0.782749    0.781928    0.782748
116025  2020-07-28 09:15:26+00:00   0.000000    0.000000    0.000   0.735   0.265   0.965187    0.781738    0.782749    0.781928    0.782748
116026  2020-07-28 09:15:40+00:00   0.000000    0.000000    0.000   0.784   0.216   0.755760    0.781738    0.782749    0.781928    0.782748
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
from keras.optimizers import Adam

model = Sequential()
model.add(LSTM(64, input_shape=x_train.shape[1:3], return_sequences=False))
model.add(Dense(1)) 
model.compile(loss='mse', optimizer='adam', metrics=['mse'])

history = model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=1)

train_pred = model.predict(x_train)
y_pred = model.predict(x_test)
print('R2 Score: ', r2_score(y_test, y_pred))
print('MAE: ', mean_absolute_error(y_test, y_pred))

结果

R2 Score:  0.9959650143133337
MAE:  0.008859985819425287
t3irkdon

t3irkdon1#

从数学上讲,R-Squared的目的是给予一个模型方差的估计值,该方差由模型的独立特征解释。
公式如下:[1 -(SSres / SStot)]。
其中:SStot代表总平方误差之和,SSres代表残差平方和。
由于SSres和SStot都是在数据集上相同数量的'n'条记录上聚合的总和,因此数据集(在您的情况下是训练数据集)上的记录数量可以改变R平方度量,但不应该对其进行任何显着更改。可以肯定地说,R平方作为一个指标并不反映与您拥有的数据量有关的任何事情,因为它被SSres和SStot之间的偏差所抵消。
对于99%的结果,您在模型中处理的是:这可能只是意味着你的独立特征比你的依赖值有相当高的预测值。我会检查X变量是否和y变量有直接的联系。(就好像它是一个算术组合,其中包含y的值)。我也会尝试了解我在模型中包含的每个功能的STD。较小的标准差可能会降低SSres,因此导致较高的R平方度量。
最重要的是:R平方=/=准确度!!!!!这两个指标在数学上几乎没有关系。

kb5ga3dv

kb5ga3dv2#

你的LSTM模型应该使用它从过去数据中学到的东西来预测未来。在模型评估中,传递了print('R2 Score: ', r2_score(y_test, y_pred)),它使用未来数据来预测未来数据,因此r2_score很高。相反,你应该传递print('R2 Score: ', r2_score(y_test, train_pred))来真正评估你的模型从过去学到了多少。

相关问题