训练和验证 LSTM 问题:精度和召回问题
Training & Validation LSTM Question: Precision & Recall Issue
我开发了一个 LSTM 编码器-解码器模型,以便 class 基于跳跃扩散模型(本质上是二元 class 化问题)确定价格变动。
我的模型在训练和验证之间按 75/25 分配。
我的问题是,在应用 class 不平衡技术(例如 SMOTE)之后,我的模型在训练和验证中的预测准确性都非常高(可能仍然过拟合)。但是,当谈到精度、召回率和 f1 分数时,我的训练模型再次表现良好,但在验证方面,我的精度和召回率显着下降。这显然会导致验证端的 f1 分数较低。
有谁知道为什么验证准确率很高,但查准率和召回率都大幅下降?这是我的模型在验证端计算精度和召回率的方式有问题,还是我的模型过度拟合导致验证结果较低?
模型结果汇总见下图,需要的话我也可以提供notebook。
编辑:包括相关代码
#%pip install keras-metrics
# Importing required packages
import keras_metrics as km
# LSTM Workings_Autoencoder Model
ac_model_1b = Sequential()
ac_model_1b.add(Bidirectional(LSTM(units=200, return_sequences = True,
input_shape = (n_timesteps, n_features),
kernel_initializer='glorot_normal')))
ac_model_1b.add(LSTM(100))
ac_model_1b.add(Dropout(0.2))
ac_model_1b.add(RepeatVector(n_timesteps))
ac_model_1b.add(LSTM(100, return_sequences = True))
ac_model_1b.add(Dropout(0.2))
ac_model_1b.add(LSTM(200, return_sequences = True))
ac_model_1b.add(TimeDistributed(Dense(1, activation='sigmoid')))
ac_model_1b.compile(loss='binary_crossentropy', optimizer='Adamax',
metrics=['accuracy', km.binary_precision(), km.binary_recall()])
results_ac_model_1b = ac_model_1b.fit(x_train, y_train, epochs=100, batch_size=32,
shuffle=True, validation_data=(x_valid, y_valid))
print(ac_model_1b.summary())
ac_model_1b.save('lstm_model_adamax.h5')
欢迎任何建议。
谢谢。
如果能给出混淆矩阵就更好了
但是,计算好像有问题。
数学上,**(准确率 + 召回率 >= 精度)
在你的情况下,31 + 33 < 97
我建议您使用 this function。并获取报告,如果您能在问题中打印它的输出,我将不胜感激。
我开发了一个 LSTM 编码器-解码器模型,以便 class 基于跳跃扩散模型(本质上是二元 class 化问题)确定价格变动。
我的模型在训练和验证之间按 75/25 分配。
我的问题是,在应用 class 不平衡技术(例如 SMOTE)之后,我的模型在训练和验证中的预测准确性都非常高(可能仍然过拟合)。但是,当谈到精度、召回率和 f1 分数时,我的训练模型再次表现良好,但在验证方面,我的精度和召回率显着下降。这显然会导致验证端的 f1 分数较低。
有谁知道为什么验证准确率很高,但查准率和召回率都大幅下降?这是我的模型在验证端计算精度和召回率的方式有问题,还是我的模型过度拟合导致验证结果较低?
模型结果汇总见下图,需要的话我也可以提供notebook。
编辑:包括相关代码
#%pip install keras-metrics
# Importing required packages
import keras_metrics as km
# LSTM Workings_Autoencoder Model
ac_model_1b = Sequential()
ac_model_1b.add(Bidirectional(LSTM(units=200, return_sequences = True,
input_shape = (n_timesteps, n_features),
kernel_initializer='glorot_normal')))
ac_model_1b.add(LSTM(100))
ac_model_1b.add(Dropout(0.2))
ac_model_1b.add(RepeatVector(n_timesteps))
ac_model_1b.add(LSTM(100, return_sequences = True))
ac_model_1b.add(Dropout(0.2))
ac_model_1b.add(LSTM(200, return_sequences = True))
ac_model_1b.add(TimeDistributed(Dense(1, activation='sigmoid')))
ac_model_1b.compile(loss='binary_crossentropy', optimizer='Adamax',
metrics=['accuracy', km.binary_precision(), km.binary_recall()])
results_ac_model_1b = ac_model_1b.fit(x_train, y_train, epochs=100, batch_size=32,
shuffle=True, validation_data=(x_valid, y_valid))
print(ac_model_1b.summary())
ac_model_1b.save('lstm_model_adamax.h5')
欢迎任何建议。
谢谢。
如果能给出混淆矩阵就更好了
但是,计算好像有问题。
数学上,**(准确率 + 召回率 >= 精度)
在你的情况下,31 + 33 < 97
我建议您使用 this function。并获取报告,如果您能在问题中打印它的输出,我将不胜感激。