Одной из серьезных проблем, с которыми мы сталкиваемся во время обучения и тестирования модели, является переобучение и недообучение модели. Иногда вашей модели нужно изучить больше функций и показать лучшие результаты. В это время ваша модель распознает только функции обучения.
Иногда ваша модель не изучает полные функции и показывает неправильные результаты. В то время ваша модель не распознает все особенности вашего ввода.
В этой статье мы обсудим, что такое переобучение и недообучение, чем они отличаются и какую роль играют при обучениимоделям машинного обучения и глубокого обучения.
Переоснащение:
- Переобучение — распространенная проблема в машинном обучении и глубоком обучении, когда модель слишком сложна и запоминает обучающие данные, а не фиксирует базовые шаблоны.
- Это приводит к снижению производительности при работе с новыми, невидимыми данными и может возникать, когда имеется слишком много параметров по сравнению с количеством обучающих выборок.
- Переобучение также может происходить при использовании слишком гибких моделей, таких как Глубокие нейронные сети с множеством скрытых слоев.
- Переоснащение может существенно повлиять на точность и надежность моделей машинного обучения и глубокого обучения, что приведет к неверным прогнозам и ненадежным результатам.
- Чтобы предотвратить переоснащение, можно использовать методы регуляризации, чтобы наказывать слишком сложные модели и предотвращать их переоснащение данных.
Код:
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}')
Недооснащение
- Недостаточное соответствие – распространенная проблема в машинном обучении и глубоком обучении, когда модель слишком проста и не отражает всей сложности лежащих в основе закономерностей в данных.
- Это приводит к низкой производительности как для обучения, так и для новых невидимых данных, поскольку модель не может делать точные прогнозы.
- Недостаточная подгонка может произойти, когда модель слишком жесткая и имеет слишком мало параметров или когда характеристики данных недостаточно охвачены моделью.
- Недообучение может существенно повлиять на точность и надежность моделей машинного обучения и глубокого обучения, что приведет к неверным прогнозам и ненадежным результатам.
- Чтобы предотвратить недообучение, можно использовать такие методы, как инженерия признаков и уменьшение размерности, чтобы извлечь значимую информацию из данных и улучшить способность модели фиксировать закономерности.
Код:
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}')
Переобучение против недообучения
- Сложность модели. Переобучение вызвано высокой сложностью модели, а недостаточное — низкой сложностью модели.
- Ошибка обучения: модели с переоснащением имеют низкую ошибку обучения, но высокую ошибку тестирования, в то время как модели с недообучением имеют высокие ошибки обучения и тестирования.
- Компромисс между смещением и дисперсией: переоснащение и недообучение — это противоположные стороны компромисса между смещением и дисперсией. Модели с переоснащением имеют высокую дисперсию и низкое смещение, в то время как модели с недообучением имеют высокое смещение и низкую дисперсию.
- Диагностика. Переобучение можно диагностировать, сравнивая производительность модели с данными обучения и тестирования. Недообучение можно диагностировать, наблюдая за высокой ошибкой обучения и низкой корреляцией между функциями и целевой переменной.
- Решение. Переобучение можно устранить, уменьшив сложность модели, используя методы регуляризации или собрав больше обучающих данных. Проблема недообучения может быть решена за счет увеличения сложности модели, добавления дополнительных функций или использования более сложных алгоритмов.