На предыдущих этапах мы подробно изучили математическую логику градиентного спуска и провели ручную очистку датасета. Теперь мы переходим к использованию промышленного стандарта — библиотеки машинного обучения Scikit-Learn (sklearn). Мы разберем стандартный пайплайн регрессии, изучим аналитический метод оптимизации линейных моделей и познакомимся с относительной метрикой оценки качества прогнозов.
Scikit-Learn — это фундаментальная open-source библиотека машинного обучения для Python. Ее ключевое преимущество — простой и унифицированный API. Вне зависимости от сложности используемого алгоритма, интерфейс взаимодействия остается неизменным:
.fit(X, y) — метод запуска обучения (подгонки весов) модели на основе признаков \(X\) и целевой переменной \(y\)..predict(X_new) — метод расчета предсказаний для новых объектов.Импорт библиотек → Подготовка данных → Выделение X и y → fit() → predict() → Оценка качества
Мы импортируем класс LinearRegression, разделяем наш итоговый очищенный датасет на матрицу независимых признаков \(X\) (путем отбрасывания столбца цены: data.drop(columns=['Цена'])) и вектор целевой переменной \(y\) (data['Цена']), после чего запускаем обучение в один оператор: model.fit(X, y).
В отличие от нашего самописного алгоритма из первого занятия, класс LinearRegression в Scikit-Learn по умолчанию не использует итерационный градиентный спуск. Вместо этого он вычисляет точные оптимальные веса за один шаг, используя аналитический метод линейной алгебры — нормальное уравнение (Normal Equation):
$$ \theta = (X^T X)^{-1} X^T y $$
Где:
Важное следствие: Поскольку нормальное уравнение представляет собой прямое аналитическое вычисление, у модели
LinearRegressionполностью отсутствуют гиперпараметры. Ей не нужно задавать шаг обучения (\(\alpha\)) или количество эпох — формула сразу находит глобальный минимум функции ошибки.
Главный недостаток аналитического метода — высокая вычислительная сложность операции обращения матрицы (\(O(P^3)\), где \(P\) — количество признаков). Если признаков становится слишком много (например, \(P > 10\,000\) после применения One-Hot Encoding), вычисления становятся ресурсоемкими и медленными.
В таких многомерных случаях используют итерационную альтернативу — класс SGDRegressor, реализующий стохастический градиентный спуск.
Класс SGDRegressor на каждом шаге вычисляет градиент не по всему датасету, а по одной случайно выбранной точке, что обеспечивает высокую скорость работы на миллионных выборках. Однако он крайне чувствителен к масштабу признаков.
Перед использованием SGDRegressor критически важно провести стандартизацию данных (StandardScaler). Без этого признаки с большим масштабом (например, площадь в сотнях кв.м.) будут доминировать над маломасштабными (количество комнат), растягивая ландшафт функции потерь в глубокий каньон и препятствуя нормальной сходимости градиентного спуска.
Абсолютные метрики (MAE и MSE) измеряют ошибку в единицах целевой переменной (например, в рублях). Но они не дают ответа на вопрос: «А насколько наша модель вообще хороша в относительном выражении?». Ошибка в \(18\,000\) рублей при аренде квартиры за \(60\,000\) рублей — это средний результат, но та же ошибка при покупке квартиры за \(15\) млн — фантастическая точность.
Для универсальной шкалы оценки используется **коэффициент детерминации \(R^2\) (R-squared)**. Он показывает, какую долю дисперсии (вариативности) целевой переменной смогла объяснить наша модель по сравнению с простейшей базовой моделью (baseline).
Базовая модель (baseline) — это «модель наивного предсказания», которая для любого объекта просто выдает среднее арифметическое значение цены по всей выборке (\(\bar{y}\)).
$$ R^2 = 1 – \frac{SS_{\text{res}}}{SS_{\text{tot}}} = 1 – \frac{\sum (y_i – \hat{y}_i)^2}{\sum (y_i – \bar{y})^2} $$
Где:

Для обученной нами модели LinearRegression на подготовленном датасете ЦИАН метрика \(R^2\) составляет \(0.686\) на тесте и \(0.709\) на обучении. Это означает, что даже при сильно усеченном наборе признаков наша модель успешно объясняет около \(70\%\) ценообразования московских квартир.
fit() (обучение) и predict() (прогнозирование).model.fit(X, y).predict().sklearn.metrics.LinearRegression не использует градиентный спуск.StandardScaler для устранения эффекта вытянутого каньона потерь.loss (функция потерь, Huber Loss), penalty (L1/L2 регуляризация), learning_rate, eta0, max_iter, tol.LinearRegression, а когда — SGDRegressor.