Keras LSTM 模型过拟合

Posted

技术标签:

【中文标题】Keras LSTM 模型过拟合【英文标题】:Keras LSTM model overfitting 【发布时间】:2021-09-30 16:34:36 【问题描述】:

我在 Keras 中使用 LSTM 模型。在拟合阶段,我添加了 validation_data 参数。当我绘制我的训练与验证损失时,似乎存在严重的过度拟合问题。我的验证损失不会减少。

我的完整数据是一个形状为[50,] 的序列。前 20 条记录用作训练数据,其余用作测试数据。

我已尝试尽可能多地添加 dropout 并降低模型复杂性,但仍然没有成功。

# transform data to be stationary
raw_values = series.values
diff_values = difference_series(raw_values, 1)

# transform data to be supervised learning
# using a sliding window
supervised = timeseries_to_supervised(diff_values, 1)
supervised_values = supervised.values

# split data into train and test-sets
train, test = supervised_values[:20], supervised_values[20:]

# transform the scale of the data
# scale function uses MinMaxScaler(feature_range=(-1,1)) and fit via training set and is applied to both train and test.
scaler, train_scaled, test_scaled = scale(train, test)

batch_size = 1
nb_epoch = 1000
neurons = 1
X, y = train_scaled[:, 0:-1], train_scaled[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])
testX, testY = test_scaled[:, 0:-1].reshape(-1,1,1), test_scaled[:, -1]
model = Sequential()
model.add(LSTM(units=neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]),
              stateful=True))
model.add(Dropout(0.1))
model.add(Dense(1, activation="linear"))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(X, y, epochs=nb_epoch, batch_size=batch_size, verbose=0, shuffle=False,
                    validation_data=(testX, testY))

这是改变神经元数量时的样子。我什至尝试使用 Keras Tuner(超频带)来找到最佳参数。

def fit_model(hp):
  batch_size = 1
  model = Sequential()
  model.add(LSTM(units=hp.Int("units", min_value=1,
                              max_value=20, step=1), 
                  batch_input_shape=(batch_size, X.shape[1], X.shape[2]),
                  stateful=True))
  model.add(Dense(units=hp.Int("units", min_value=1, max_value=10),
                                activation="linear"))
  model.compile(loss='mse', metrics=["mse"],
                optimizer=keras.optimizers.Adam(
      hp.Choice("learning_rate", values=[1e-2, 1e-3, 1e-4])))
  return model

X, y = train_scaled[:, 0:-1], train_scaled[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])

tuner = kt.Hyperband(
    fit_model,
    objective='mse',
    max_epochs=100,
    hyperband_iterations=2,
    overwrite=True)

tuner.search(X, y, epochs=100, validation_split=0.2)

根据X_testy_test 评估模型时,我得到相同的损失和准确度分数。但是当拟合“最佳模型”时,我得到了这个:

但是,与我的真实价值观相比,我的预测看起来非常合理。我应该怎么做才能更好地适应?

【问题讨论】:

【参考方案1】:

20 条记录,因为训练数据太小。模型的训练数据没有足够的变化来准确逼近函数,因此您的验证数据可能远小于 20,可能包含一个与训练数据中的 20 个完全不同的示例(即它在训练期间没有看到这种性质的例子)导致损失更高。

【讨论】:

我不应该在我的数据上使用 LSTM 吗?我从模型中得到的预测看起来很有希望,与其他模型(SVM、随机森林等)相比,LSTM 仍然表现更好(RMSE 度量)。 有什么方法可以获得更多数据? scikit-learn.org/stable/tutorial/machine_learning_map/… = "获取更多数据" 不幸的是,我做不到。那么,使用这个数据集有什么意义吗? 我可能会说不,除非您可以访问未标记的数据(这就是重点对吗?- 对未标记的数据进行分类)并且可能可以手动标记更多示例或使用 SpaCy 等标记库

以上是关于Keras LSTM 模型过拟合的主要内容,如果未能解决你的问题,请参考以下文章

我的 LSTM 模型过拟合验证数据

如何在 keras 中拟合两个连接 LSTM 的模型?

Keras:过拟合模型?

Pytorch vs. Keras:Pytorch 模型严重过拟合

防止神经网络模型过拟合的6种方法及keras代码实现

Keras 密集网络过拟合