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

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

Что такое переоснащение?

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

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

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

import numpy as np
def true_fun(X):
return np.cos(1.3 * np.pi * X)

$X$ представляет собой ординаты точек в наборе данных, а $y$ представляет собой абсциссу.

np.random.seed(0)
n_samples = 20
X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1

Если мы визуализируем данные, полученные с помощью библиотеки matplotlib, мы получим следующее облако точек.

import matplotlib.pyplot as plt
plt.plot(X, y, color = 'red', label="Actual")
plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
plt.xlabel("x")
plt.ylabel("y")
plt.legend(loc="best")
plt.show()

Затем мы хотим найти математическую функцию $f$, отображающую вход на выход, где результат $f(x)$ наблюдения $x$ соответствует ответу $y$ прогноза модели. Мы попытаемся обучить эту модель на сгенерированных нами данных, и каждый раз мы меняем степень полиномиальной функции $f$ и визуализируем результаты.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

plt.figure(figsize=(14, 5))

for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i + 1)
plt.setp(ax, xticks=(), yticks=())

polynomial_features=PolynomialFeatures(degree=degrees[i],include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features("linear_regression", linear_regression)])
pipeline.fit(X[:, np.newaxis], y)
X_test = np.linspace(0,  1,  100)
y_poly_pred = pipeline.predict(X_test[:, np.newaxis])
plt.plot(X_test, y_poly_pred, label="Model")
plt.plot(X_test, true_fun(X_test), label="True function")
plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
plt.xlabel("x")
plt.ylabel("y")
plt.xlim((0,  1))
plt.ylim((-2,  2))
plt.legend(loc="best")
plt.title("Degree {}".format(degrees[i]))
plt.show()

Вывод:

Видно, что линейной функции (многочлена степени 1) недостаточно для подбора обучающих выборок. Это называется недообучением.

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

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

Как обнаружить переобучение?

Переобучение практически невозможно обнаружить до тестирования модели на тестовых данных. Для этого мы можем разделить набор данных на две подвыборки:

  • Обучающий набор (обучающий набор), на котором модель будет учиться.
  • Набор тестов, на котором мы будем оценивать производительность модели.

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

Например, если модель работала с точностью 99 % в обучающем наборе данных, но только с точностью 50–55 % в тестовом наборе данных. Значительная разница между этими двумя показателями указывает на то, что имело место переобучение.

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

Еще один простой способ обнаружить это — использовать перекрестную проверку. Существует несколько методов перекрестной проверки, которые позволяют эффективно измерять производительность модели на неизвестных наблюдениях и, следовательно, судить о том, перегружена модель или нет. Эти методы имеют одни и те же фундаментальные принципы, но каждый из них адаптирован к конкретным ситуациям. Мы можем привести, например, K-Fold, Shuffle Split или Leave-One-Out.

Каковы возможные причины переобучения?

Существует несколько возможных причин переоснащения, некоторые из них включают в себя:

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

Как избежать переобучения?

Существует несколько способов избежать переобучения в машинном обучении. Вот некоторые примеры:

1. Разработка функций

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

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

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

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

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

3. Выбор гиперпараметров

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

4. Добавьте тренировочные данные

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

5. Ансамблевое обучение

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

Двумя наиболее распространенными методами ансамблевого обучения являются Boosting и Bagging. Несколько моделей машинного обучения основаны на этом типе обучения, мы можем привести в качестве примера XGBoost, LightGBM, GradientBoost…

6. Методы регуляризации

Методы регуляризации — это приемы, снижающие общую сложность модели машинного обучения. Одним из самых популярных примеров таких методов является штрафная регрессия (например, регуляризация L1/Lasso и L2/Ridge).

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

7. Отсев

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

Также можно уменьшить сложность модели, удалив слои и уменьшив ее размер за счет уменьшения количества нейронов в полносвязных слоях.

О КОМПАНИИ LONDON DATA CONSULTING (LDC)

Мы в компании London Data Consulting (LDC) предоставляем все виды решений для обработки данных. Сюда входят наука о данных (AI/ML/NLP), инженер данных, архитектура данных, анализ данных, CRM и генерация потенциальных клиентов, бизнес-аналитика и облачные решения (AWS/GCP/Azure).

Для получения дополнительной информации о нашем спектре услуг посетите: https://london-data-consulting.com/services

Если вы заинтересованы в работе в London Data Consulting, посетите нашу страницу вакансий на странице https://london-data-consulting.com/careers.

Дополнительная информация: https://london-data-consulting.com