На этом занятии мы разберем один из главных балансов в машинном обучении — проблему переобучения (overfitting) и недообучения (underfitting). Мы научимся оценивать обобщающую способность моделей, правильно разделять данные на обучающую и тестовую выборки и вводить нелинейность с помощью полиномиальной регрессии.
Главная цель разработки любой прогностической модели заключается не в том, чтобы описать уже имеющиеся исторические данные, а в том, чтобы качественно работать на новых, ранее не виданных объектах. Способность алгоритма выдавать точные предсказания на новых данных называется обобщающей способностью (generalization).
Экзаменационная аналогия: Оценка точности модели на тех же данных, на которых она обучалась — это все равно, что дать студенту экзаменационные вопросы вместе с готовыми ответами заранее. Студент сможет просто зазубрить их и получить высший балл, но преподаватель никогда не узнает, понял ли он суть предмета и сможет ли решить реальную задачу на практике.

В зависимости от сбалансированности архитектуры и объема данных модель после обучения может находиться в одном из трех состояний:
Чтобы честно измерить обобщающую способность модели, исходный размеченный датасет делят на две (или три) части:
В Scikit-Learn разделение реализуется функцией train_test_split() из пакета sklearn.model_selection:
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=0)
Параметр random_state фиксирует генератор псевдослучайных чисел. Это гарантирует, что при каждом запуске ячейки данные будут делиться идентично, обеспечивая воспроизводимость результатов экспериментов.
Реальный мир редко линеен. Например, стоимость аренды жилья с увеличением площади может расти нелинейно (каждый следующий квадратный метр в больших квартирах ценится выше). Простая линия плохо описывает такие зависимости.
Для решения этой проблемы используется полиномиальная регрессия. Ее суть заключается в том, чтобы «обмануть» стандартную линейную модель, подав ей на вход не только исходные признаки \(X\), но и их степени (\(X^2\), \(X^3\)) и комбинации (\(X_1 \cdot X_2\)):
$$ \hat{y} = w_0 + w_1 \cdot x + w_2 \cdot x^2 $$
Для выборочной генерации степенных признаков используется класс PolynomialFeatures совместно с DataFrameMapper (библиотека sklearn-pandas), что позволяет не возводить в степень бинарные столбцы (например, признаки студии или округов, где \(1^2 = 1\), а \(0^2 = 0\)).
Зависимость качества предсказаний от степени нелинейности наглядно иллюстрирует график сложности модели:

Таким образом, анализируя расхождение кривых обучения (черная линия) и тестирования (красная линия), мы наглядно определяем оптимальный предел сложности модели.
train_test_split().random_state для обеспечения воспроизводимости случайного разбиения.X_train, X_test, y_train, y_test и честный расчет ошибок.PolynomialFeatures и DataFrameMapper.