Введение

Модели машинного обучения, несомненно, являются мощными инструментами, способными учиться на данных и делать прогнозы. Однако они не лишены недостатков и часто страдают от двух распространенных проблем: переобучения и недообучения. Обе проблемы могут привести к снижению производительности и ненадежным результатам. В этом подробном руководстве мы рассмотрим различные методы предотвращения переобучения и недообучения в моделях машинного обучения и подробно рассмотрим каждый метод.

Переобучение: глубокое погружение

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

Методы предотвращения переобучения

1. Разделение данных на обучающие, проверочные и тестовые наборы

Разделение данных на три набора — обучающий, проверочный и тестовый наборы — позволяет нам использовать проверочный набор для точной настройки параметров модели, оценки производительности модели и измерения окончательной точности модели на невидимых данных с использованием тестового набора. . Таким образом, мы можем оценить способность модели обобщать новые данные и предотвращать переоснащение.

from sklearn.model_selection import train_test_split

# Load your data as X and y
# Split data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80% for training, 20% for testing

# Further split training data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)  # 0.25 x 0.8 = 0.2, resulting in 60% for training, 20% for validation, 20% for testing

2. Перекрестная проверка

Перекрестная проверка — это метод, который включает в себя разделение данных на k сгибов, используя один сгиб в качестве проверочного набора, а остальные складки — в качестве обучающего набора. Этот процесс повторяется k раз, и в качестве показателя производительности модели используется средняя точность по всем сгибам. Перекрестная проверка помогает уменьшить дисперсию модели и избежать переобучения, обеспечивая более надежную оценку производительности модели.

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

# Load your data as X and y
# Initialize your model
model = LogisticRegression() # Instantiate a logistic regression model

# Perform cross-validation with 5 folds
scores = cross_val_score(model, X, y, cv=5) # Calculate the cross-validation scores using 5-fold cross-validation
average_score = scores.mean() # Calculate the average score across all folds

print("Cross-Validation Scores:", scores)
print("Average Cross-Validation Score:", average_score)

3. Регуляризация

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

  • Регуляризация L1 (регрессия Лассо). Регуляризация L1 добавляет штраф L1, равный абсолютному значению весов модели, к функции потерь. Этот метод может привести к разреженным векторам весов, эффективно выполняя выбор признаков и сводя некоторые веса к нулю.
  • Регуляризация L2 (гребенчатая регрессия). Регуляризация L2 добавляет штраф L2, равный квадрату весов модели, к функции потерь. Этот метод препятствует использованию больших весов, но не обнуляет их, что приводит к более сбалансированной модели.
  • Отсев. Отсев — это метод регуляризации, используемый в нейронных сетях, при котором случайное подмножество нейронов «исключается» во время обучения, что эффективно предотвращает слишком сильную зависимость модели от какого-либо отдельного нейрона.
from sklearn.linear_model import Ridge, Lasso
from sklearn.neural_network import MLPClassifier

# Ridge Regression (L2 regularization)
ridge_model = Ridge(alpha=1.0)  # Instantiate a Ridge model with an L2 penalty with alpha value 1.0

# Lasso Regression (L1 regularization)
lasso_model = Lasso(alpha=1.0)  # Instantiate a Lasso model with an L1 penalty with alpha value 1.0

# Neural Network with Dropout (for regularization)
mlp_model = MLPClassifier(hidden_layer_sizes=(100, 100), dropout=0.5)  # Instantiate a multi-layer perceptron model with two hidden layers of 100 neurons each and a dropout rate of 0.5

4. Ранняя остановка

Ранняя остановка — это метод, который включает в себя отслеживание потерь при проверке во время процесса обучения и остановку обучения, когда потери при проверке перестают уменьшаться или начинают увеличиваться. Этот метод помогает избежать переобучения, не позволяя модели слишком многому учиться на обучающих данных.

from sklearn.neural_network import MLPClassifier

# Neural Network with Early Stopping
mlp_model = MLPClassifier(hidden_layer_sizes=(100, 100), early_stopping=True, validation_fraction=0.2) # Instantiate a multi-layer perceptron model with two hidden layers of 100 neurons each, early stopping enabled, and a validation fraction of 20% of the training data

5. Методы ансамбля

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

  • Бэггинг (объединение начальной загрузки). Бэггинг включает в себя независимое обучение нескольких моделей на разных подмножествах обучающих данных, сгенерированных с помощью начальной выборки. Окончательный прогноз получается путем усреднения (для регрессии) или голосования (для классификации) прогнозов отдельных моделей. Бэггинг помогает уменьшить дисперсию и переоснащение.
  • Повышение. Повышение включает в себя обучение последовательности слабых моделей, где каждая последующая модель фокусируется на исправлении ошибок, допущенных предыдущей моделью. Окончательный прогноз представляет собой взвешенную комбинацию прогнозов, сделанных отдельными моделями. Повышение направлено на уменьшение смещения и переобучения, создавая более точную и надежную модель.
  • Наложение. Наложение включает обучение нескольких моделей, называемых базовыми моделями, на одних и тех же обучающих данных и использование их прогнозов в качестве входных признаков для модели второго уровня, называемой метамоделью. Метамодель учится комбинировать прогнозы базовых моделей для получения окончательного прогноза. Стекирование помогает повысить общую производительность модели за счет использования сильных сторон различных базовых моделей.
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression

# Bagging (Random Forest)
random_forest_model = RandomForestClassifier(n_estimators=100) # Instantiate a random forest classifier with 100 trees

# Boosting (Gradient Boosting)
gbm_model = GradientBoostingClassifier(n_estimators=100) # Instantiate a gradient boosting classifier with 100 trees

# Stacking
base_models = [("rf", RandomForestClassifier(n_estimators=100)),
               ("gbm", GradientBoostingClassifier(n_estimators=100))] # Define the base models for stacking (Random Forest and Gradient Boosting)

meta_model = LogisticRegression() # Instantiate a logistic regression model as the meta-model
stacking_model = StackingClassifier(estimators=base_models, final_estimator=meta_model) # Instantiate the stacking classifier with the base models and meta-model

Недообучение: глубокое погружение

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

Методы предотвращения недообучения

1. Использование дополнительных данных

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

from keras.preprocessing.image import ImageDataGenerator

# Image data augmentation example
datagen = ImageDataGenerator(rotation_range=20, # Rotate images up to 20 degrees
                             width_shift_range=0.2, # Shift image width by up to 20%
                             height_shift_range=0.2, # Shift image height by up to 20%
                             horizontal_flip=True) # Allow horizontal flipping of images

# Example for fitting the data generator to the training data
datagen.fit(X_train) # Apply the data augmentation transformations to the training data

2. Использование дополнительных функций

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

from sklearn.preprocessing import PolynomialFeatures

# Generate polynomial features
poly = PolynomialFeatures(degree=2) # Instantiate a PolynomialFeatures object with a degree of 2
X_poly = poly.fit_transform(X) # Transform the original features to polynomial features

3. Использование более сложной модели

Повышение емкости или гибкости модели может помочь предотвратить недообучение, позволяя модели подгонять к данным более сложные функции. Этого можно добиться, добавив в модель больше слоев, нейронов или параметров. Например, вместо неглубоких сетей можно использовать глубокие нейронные сети, или нелинейные модели могут заменить линейные модели.

Однако важно найти баланс между сложностью модели и риском переобучения. Использование таких методов, как регуляризация или ранняя остановка, может помочь сохранить этот баланс при одновременном увеличении емкости модели.

from sklearn.ensemble import RandomForestClassifier
from keras.models import Sequential
from keras.layers import Dense, Dropout

# Non-linear model example (Random Forest)
random_forest_model = RandomForestClassifier(n_estimators=100) # Instantiate a random forest classifier with 100 trees

# Deep Neural Network example using Keras
model = Sequential() # Instantiate a Sequential model object
model.add(Dense(128, input_dim=X.shape[1], activation='relu')) # Add a Dense layer with 128 neurons, input dimensions equal to the number of features, and ReLU activation
model.add(Dropout(0.5)) # Add a Dropout layer with a dropout rate of 0.5
model.add(Dense(64, activation='relu')) # Add a Dense layer with 64 neurons and ReLU activation
model.add(Dropout(0.5)) # Add a Dropout layer with a dropout rate of 0.5
model.add(Dense(1, activation='sigmoid')) # Add a Dense output layer with 1 neuron and a sigmoid activation function for binary classification

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Compile the model using binary cross-entropy loss, the Adam optimizer, and accuracy as the evaluation metric

Заключение

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

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