Эффективные стратегии предотвращения переобучения в моделях машинного обучения

Стратегия, которая значительно снижает вероятность переобучения, называется регуляризацией. Методы регуляризации помогают предотвратить переоснащение, добавляя штрафной член к функции потерь модели, предотвращая чрезмерную сложность изученной модели.

Вот несколько популярных методов регуляризации и примеры кода:

  1. Регуляризация L1 и L2 (также известная как лассо и регрессия гребня):

    • Регуляризация L1 добавляет абсолютное значение коэффициентов в качестве штрафного члена.
    • Регуляризация L2 добавляет квадраты значений коэффициентов в качестве штрафного члена.
    from sklearn.linear_model import Lasso, Ridge
    
    # L1 regularization (Lasso)
    lasso_model = Lasso(alpha=0.01)
    lasso_model.fit(X_train, y_train)
    
    # L2 regularization (Ridge)
    ridge_model = Ridge(alpha=0.01)
    ridge_model.fit(X_train, y_train)
  2. Отсев:

    • Dropout случайным образом деактивирует часть нейронов во время обучения, не позволяя модели слишком сильно полагаться на какой-либо отдельный нейрон.
    from tensorflow.keras.layers import Dropout
    
    model = Sequential()
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
  3. Ранняя остановка:

    • Ранняя остановка останавливает процесс обучения, когда производительность проверочного набора начинает снижаться, предотвращая переподгонку модели к обучающим данным.
    from tensorflow.keras.callbacks import EarlyStopping
    
    early_stopping = EarlyStopping(monitor='val_loss', patience=3)
    model.fit(X_train, y_train, validation_data=(X_val, y_val), callbacks=[early_stopping])
  4. Дополнение данных:

    • При расширении данных искусственно увеличивается размер обучающего набора путем применения различных преобразований, таких как вращение, масштабирование или обрезка, к существующим обучающим данным.
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    datagen = ImageDataGenerator(rotation_range=10, width_shift_range=0.1, height_shift_range=0.1)
    datagen.fit(X_train)
    model.fit(datagen.flow(X_train, y_train), validation_data=(X_val, y_val))