机器学习 - 过拟合



过拟合是指模型学习训练数据中的噪声,而不是潜在模式。这会导致模型在训练数据上表现良好,但在新数据上表现不佳。从本质上讲,模型变得过于专门化,无法泛化到新数据。

在使用复杂模型(例如深度神经网络)时,过拟合是一个常见问题。这些模型具有许多参数,并且能够非常紧密地拟合训练数据。但是,这通常是以牺牲泛化性能为代价的。

过拟合的原因

有几个因素可能导致过拟合 -

  • 复杂模型 - 如前所述,复杂模型比简单模型更容易过拟合。这是因为它们具有更多参数,并且能够更紧密地拟合训练数据。

  • 训练数据有限 - 当训练数据不足时,模型难以学习潜在模式,反而可能学习数据中的噪声。

  • 训练数据不具有代表性 - 如果训练数据不能代表模型试图解决的问题,那么模型可能会学习不相关的模式,这些模式无法很好地泛化到新数据。

  • 缺乏正则化 - 正则化是一种通过向成本函数添加惩罚项来防止过拟合的技术。如果不存在此惩罚项,则模型更容易过拟合。

防止过拟合的技术

有几种技术可用于防止机器学习中的过拟合 -

  • 交叉验证 - 交叉验证是一种用于评估模型在新数据上的性能的技术。它涉及将数据分成几个子集,并依次使用每个子集作为验证集,同时在剩余数据上进行训练。这有助于确保模型能够很好地泛化到新数据。

  • 提前停止 - 提前停止是一种通过在训练过程完全收敛之前停止训练过程来防止模型过拟合的技术。这是通过在训练期间监控验证误差,并在误差停止改善时停止训练来完成的。

  • 正则化 - 正则化是一种通过向成本函数添加惩罚项来防止过拟合的技术。惩罚项鼓励模型具有较小的权重,并有助于防止其拟合训练数据中的噪声。

  • Dropout - Dropout 是一种用于深度神经网络中防止过拟合的技术。它涉及在训练期间随机丢弃一些神经元,这迫使剩余的神经元学习更健壮的特征。

示例

以下是使用 Keras 在 Python 中实现提前停止和 L2 正则化的示例 -

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras import regularizers

# define the model architecture
model = Sequential()
model.add(Dense(64, input_dim=X_train.shape[1], activation='relu', kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(1, activation='sigmoid'))

# compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# set up early stopping callback
early_stopping = EarlyStopping(monitor='val_loss', patience=5)

# train the model with early stopping and L2 regularization
history = model.fit(X_train, y_train, validation_split=0.2, epochs=100, batch_size=64, callbacks=[early_stopping])

在此代码中,我们使用了 Keras 中的 Sequential 模型来定义模型架构,并且使用 kernel_regularizer 参数向前两层添加了 L2 正则化。我们还使用 Keras 中的 EarlyStopping 类设置了一个提前停止回调,它将监控验证损失并在其停止改善 5 个时期后停止训练。

在训练期间,我们传入 X_train 和 y_train 数据以及 0.2 的验证拆分以监控验证损失。我们还设置了 64 的批大小并最多训练 100 个时期。

输出

执行此代码时,它将生成如下所示的输出 -

Train on 323 samples, validate on 81 samples
Epoch 1/100
323/323 [==============================] - 0s 792us/sample - loss: -8.9033 - accuracy: 0.0000e+00 - val_loss: -15.1467 - val_accuracy: 0.0000e+00
Epoch 2/100
323/323 [==============================] - 0s 46us/sample - loss: -20.4505 - accuracy: 0.0000e+00 - val_loss: -25.7619 - val_accuracy: 0.0000e+00
Epoch 3/100
323/323 [==============================] - 0s 43us/sample - loss: -31.9206 - accuracy: 0.0000e+00 - val_loss: -36.8155 - val_accuracy: 0.0000e+00
Epoch 4/100
323/323 [==============================] - 0s 46us/sample - loss: -44.2281 - accuracy: 0.0000e+00 - val_loss: -49.0378 - val_accuracy: 0.0000e+00
Epoch 5/100
323/323 [==============================] - 0s 52us/sample - loss: -58.3326 - accuracy: 0.0000e+00 - val_loss: -62.9369 - val_accuracy: 0.0000e+00
Epoch 6/100
323/323 [==============================] - 0s 40us/sample - loss: -74.2131 - accuracy: 0.0000e+00 - val_loss: -78.7068 - val_accuracy: 0.0000e+00
-----continue

通过使用提前停止和 L2 正则化,我们可以帮助防止过拟合并提高模型的泛化性能。

广告