首页 > 解决方案 > Keras 之谜:训练和验证准确性趋于平缓,但预测看起来还不错

问题描述

我已经建立了一个非常简单的 Keras 模型,其中包含几个 Dense 层,并且我试图使用其他 3 只股票的回报来“预测”一只股票的回报。现在我不关心偏移日期,因为我只是想让模型正常运行。我最初简化了训练/验证集和测试集中的目标,将实际回报替换为正回报的 1 和负回报的 0。相关代码如下所示:


df = pd.read_csv('Daily returns BAC-JPM-UBS-WFC.csv')

X = df[['JPM', 'UBS', 'WFC']]
y = df[['BAC']]


# Replace target returns with 1 for positive return, 0 for negative return
y.loc[y["BAC"] >= 0, "BAC"] = 1
y.loc[y["BAC"] < 0, "BAC"] = 0


# Import testing dataset
df_test = pd.read_csv('Daily returns_X_test BAC-JPM-UBS-WFC.csv')
X_test = df_test[['JPM', 'UBS', 'WFC']]
y_test = df_test[['BAC']]
y_test.loc[y_test["BAC"] >= 0, "BAC"] = 1
y_test.loc[y_test["BAC"] < 0, "BAC"] = 0


# Model specification
no_of_inputs = len(X. columns)
input_layer = Input(shape=(no_of_inputs), dtype='float32')
dense1 = Dense(8, activation='linear')(input_layer)
dense2 = Dense(8, activation='linear')(dense1)
output_layer = Dense(1, activation='linear')(dense2)


# Model instantiation and dataset fit
epochs = 30
model = Model(inputs=input_layer, outputs=output_layer)
optimzer = keras.optimizers.Adamax(lr=1e-3)
model.compile(loss='mean_squared_error', optimizer=optimzer, metrics=["accuracy"])
model.summary()
H = model.fit(x=X, y=y, validation_split=0.3, batch_size=5, epochs=epochs, verbose=1, shuffle=True)  

# Model prediction
predictions = model.predict(x=X_test, batch_size=5, verbose=0)

当我运行代码时,我得到以下训练和验证损失: 在此处输入图像描述

我得到这个是为了训练和验证的准确性: 在此处输入图像描述

当我绘制 y_test 与预测时,我得到了这个: 在此处输入图像描述

这看起来很合理,但我真正想做的是使用来自 train/val 和测试集的实际返回值作为目标,而不是简化的二进制 1 和 0。所以当我删除时:

y.loc[y["BAC"] >= 0, "BAC"] = 1
y.loc[y["BAC"] < 0, "BAC"] = 0

和:

y.loc[y["BAC"] >= 0, "BAC"] = 1
y.loc[y["BAC"] < 0, "BAC"] = 0

从代码中,只使用实际的返回值,我得到以下结果。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

虽然训练和验证损失看起来不错,虽然有点迟缓,但准确度图表基本上是“平坦的”,但 y_test 与预测图表看起来完全符合我的预期。

我尝试过调整学习率,选择不同的优化器,并在密集层中将“线性”替换为“relu”,但这对结果没有影响。我只是无法弄清楚为什么训练和验证的准确性在我的图表上是“平坦的”。任何帮助/建议将不胜感激。谢谢。

标签: pythonkeras

解决方案


推荐阅读