LSTM 损失值不变,准确率停留在 50%

数据挖掘 机器学习 深度学习 张量流
2022-02-19 13:05:28

我正在使用 LSTM 进行时间序列预测,我的数据高度倾斜,具有类权重197.16865807 : 0.50127117

Label 0 : 25359_Label 1 : 9974641

我的模型如下所示

n_input = 100
n_features = 36
class_weights = class_weight.compute_class_weight('balanced',
                                              np.unique(y_target),
                                              y_target)
model = tf.keras.Sequential([
        tf.keras.layers.LSTM(64, activation='tanh', input_shape=(n_input, n_features),return_sequences = True),
        tf.keras.layers.LSTM(64, activation='tanh',return_sequences = True),
        tf.keras.layers.LSTM(64, activation='tanh',return_sequences = True),
        tf.keras.layers.LSTM(64, activation='tanh',return_sequences = True),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(1,activation='sigmoid')])

model.compile(optimizer='adam', loss= 'binary_crossentropy' ,metrics=METRICS)
model.fit_generator(train_generator, epochs= 1,steps_per_epoch=len(train_generator),class_weight=class_weight)

我尝试了以下方法来处理我不变的准确性和损失值。

  1. 我试图调整班级权重,但似乎不起作用,我的预测都是1
  2. 我尝试使用RandomSamplerfromimblearn对我的数据进行欠采样,但准确率停留在 50%
  3. 我试图将损失函数更改为 weighted_cross_entropy_with_logits,但我没有找到任何示例显示如何在Sequential上面的模型中使用它

我觉得我的模型不能预测结果,因为当我输入平衡数据集时,准确度大约是50%,当我输入不平衡数据集时,准确度是99%

谁能帮我这个?我想知道这是我的模型的问题,还是我的数据集不平衡的问题

谢谢!

2个回答

该数据集包含约 25K 类“0”样本和约 10M 类“1”样本。这清楚地告诉我们,LSTM 将在“1”类实例中学习更流行的模式。以下是您可以尝试的一些改进:

  1. 不是对“1”类标签进行欠采样,而是对“0”类的实例数量进行过采样。

  2. 在数据集不平衡的情况下,准确性不是一个很好的指标。使用 'Macro-F score 来评估模型的性能。

  3. 使用 tensorboard 查看每一层的权重和梯度是如何变化的。

我会尝试几个选项:

首先,去除类权重。看看它是否可以帮助您在平衡数据集上获得高于 50% 的数据。

其次,要么对标签 0 进行过采样,要么对标签 1 进行欠采样,而不是使用类权重。

第三,尝试使用焦点损失作为损失函数,以便您的梯度更新更关注您出错的示例。