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

Иногда ваша модель не изучает полные функции и показывает неправильные результаты. В то время ваша модель не распознает все особенности вашего ввода.

В этой статье мы обсудим, что такое переобучение и недообучение, чем они отличаются и какую роль играют при обучениимоделям машинного обучения и глубокого обучения.

Переоснащение:

  1. Переобучение — распространенная проблема в машинном обучении и глубоком обучении, когда модель слишком сложна и запоминает обучающие данные, а не фиксирует базовые шаблоны.
  2. Это приводит к снижению производительности при работе с новыми, невидимыми данными и может возникать, когда имеется слишком много параметров по сравнению с количеством обучающих выборок.
  3. Переобучение также может происходить при использовании слишком гибких моделей, таких как Глубокие нейронные сети с множеством скрытых слоев.
  4. Переоснащение может существенно повлиять на точность и надежность моделей машинного обучения и глубокого обучения, что приведет к неверным прогнозам и ненадежным результатам.
  5. Чтобы предотвратить переоснащение, можно использовать методы регуляризации, чтобы наказывать слишком сложные модели и предотвращать их переоснащение данных.

Код:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Generating Random Dataset
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
Y = np.sin(X).ravel()
Y[::5] += 3 * (0.5 - np.random.rand(16))

# Splitting Data
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

#Fitting Linear Regression
lin_reg = LinearRegression()
lin_reg.fit(X_train, Y_train)

# Fitting Polynomial Regression
poly_reg = PolynomialFeatures(degree=10)
X_poly_train = poly_reg.fit_transform(X_train)
poly_reg = LinearRegression()
poly_reg.fit(X_poly_train, Y_train)

# Plotting result
plt.scatter(X_train, Y_train, color='red', label='Training Data')
plt.plot(X, lin_reg.predict(X), color='blue', label='Linear Regression')
plt.plot(X, poly_reg.predict(poly_reg.fit_transform(X)), color='green', label='Polynomial Regression')
plt.legend()
plt.show()

# Calculate Mean Square Error
lin_mse = np.mean((lin_reg.predict(X_test) - Y_test)**2)
poly_mse = np.mean((poly_reg.predict(poly_reg.fit_transform(X_test)) - Y_test)**2)

print(f'Linear Regression MSE: {lin_mse:.2f}')
print(f'Polynomial Regression MSE: {poly_mse:.2f}')

Недооснащение

  1. Недостаточное соответствие – распространенная проблема в машинном обучении и глубоком обучении, когда модель слишком проста и не отражает всей сложности лежащих в основе закономерностей в данных.
  2. Это приводит к низкой производительности как для обучения, так и для новых невидимых данных, поскольку модель не может делать точные прогнозы.
  3. Недостаточная подгонка может произойти, когда модель слишком жесткая и имеет слишком мало параметров или когда характеристики данных недостаточно охвачены моделью.
  4. Недообучение может существенно повлиять на точность и надежность моделей машинного обучения и глубокого обучения, что приведет к неверным прогнозам и ненадежным результатам.
  5. Чтобы предотвратить недообучение, можно использовать такие методы, как инженерия признаков и уменьшение размерности, чтобы извлечь значимую информацию из данных и улучшить способность модели фиксировать закономерности.

Код:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# Generate Random Toy data
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(16))

# Split Data into training & test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

# Define Linear Model

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1, input_shape=(1,)))
model.compile(optimizer='adam', loss='mean_squared_error')

# Model Fitting
history = model.fit(X_train, Y_train, epochs=20, verbose=0)

# Plotting the results
plt.scatter(X_train, Y_train, color='red', label='Training Data')
plt.plot(X, model.predict(X), color='blue', label='Linear Model')
plt.legend()
plt.show()

# Calculate mean square error
test_mse = np.mean((model.predict(X_test) - Y_test)**2)

print(f'Test MSE: {test_mse:.2f}')

Переобучение против недообучения

  1. Сложность модели. Переобучение вызвано высокой сложностью модели, а недостаточное — низкой сложностью модели.
  2. Ошибка обучения: модели с переоснащением имеют низкую ошибку обучения, но высокую ошибку тестирования, в то время как модели с недообучением имеют высокие ошибки обучения и тестирования.
  3. Компромисс между смещением и дисперсией: переоснащение и недообучение — это противоположные стороны компромисса между смещением и дисперсией. Модели с переоснащением имеют высокую дисперсию и низкое смещение, в то время как модели с недообучением имеют высокое смещение и низкую дисперсию.
  4. Диагностика. Переобучение можно диагностировать, сравнивая производительность модели с данными обучения и тестирования. Недообучение можно диагностировать, наблюдая за высокой ошибкой обучения и низкой корреляцией между функциями и целевой переменной.
  5. Решение. Переобучение можно устранить, уменьшив сложность модели, используя методы регуляризации или собрав больше обучающих данных. Проблема недообучения может быть решена за счет увеличения сложности модели, добавления дополнительных функций или использования более сложных алгоритмов.