Если мы спрашиваем: «сколько будет стоить квартира?», «какой будет спрос?», «на сколько процентов вырастет выручка?», то мы просим модель предсказать число. Это регрессия. Если мы спрашиваем: «уйдет ли клиент?», «это спам или не спам?», «болен пациент или нет?», то мы просим модель выбрать категорию. Это классификация.
Интуитивно можно сказать так. Регрессия отвечает на вопрос о величине. Классификация отвечает на вопрос о принадлежности. В одном случае модель ищет точку на числовой оси, в другом пытается провести границу между классами в пространстве признаков.
Почему это различие важнее, чем кажется
На старте может показаться, что отличие чисто формальное: и там и там есть признаки (x), и там и там есть целевая переменная (y), и там и там модель чему-то обучается. Но на практике тип целевой переменной меняет почти все: функцию потерь, метрики качества, способ интерпретации результата и даже то, как мы потом используем модель в бизнес-процессе.
Если перепутать тип задачи, можно взять красивый алгоритм и получить бессмысленный результат. Нельзя всерьез оценивать задачу кредитного дефолта как регрессию, если компании нужно решение «да или нет». И наоборот, нельзя сводить прогноз выручки к двум классам, если бизнесу нужен численный сценарий.
Регрессия: когда модель предсказывает число
В регрессии целевая переменная непрерывна. Это означает, что между значениями есть естественный числовой порядок и meaningful distance. Разница между 10 и 11 имеет количественный смысл, как и разница между 100 и 110.
Классический пример из линейной алгебры, математической статистики и оптимизации выглядит так:
(\hat{y} = w_1 x_1 + w_2 x_2 + \dots + w_p x_p + b)
Что означает каждый символ:
(\hat{y}) — предсказанное числовое значение;
(x_1, x_2, \dots, x_p) — признаки объекта;
(w_1, w_2, \dots, w_p) — веса признаков, которые модель подбирает в обучении;
(b) — свободный член, который сдвигает предсказание.
Численный пример: пусть мы хотим предсказать цену аренды и используем два признака: площадь и число комнат. Пусть (x_1 = 40), (x_2 = 2), (w_1 = 1000), (w_2 = 5000), (b = 10000). Тогда
(\hat{y} = 1000 \cdot 40 + 5000 \cdot 2 + 10000 = 60000).
Модель выдает число 60000. Именно это и есть логика регрессии: мы не определяем класс квартиры, а оцениваем ее количественную величину.
Если хочется закрепить именно регрессионную сторону без путаницы с классификацией, полезно отдельно посмотреть на линейную регрессию как первую прозрачную модель, где хорошо видно, как численный ответ рождается из признаков и весов.
Как выглядит геометрия регрессии
Геометрически регрессия старается провести линию, плоскость или гиперплоскость так, чтобы численные предсказания были как можно ближе к реальным значениям. В двумерном случае это выглядит как линия, проходящая через облако точек. В многомерном пространстве это уже гиперплоскость.
С точки зрения оптимизации модель минимизирует ошибку между истинными и предсказанными числами. Очень часто используется среднеквадратичная ошибка.
(MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2)
Что означает каждый символ:
(MSE) — среднеквадратичная ошибка модели;
(n) — число объектов;
(y_i) — реальное значение цели для объекта (i);
(\hat{y}_i) — предсказание модели.
Если модель ошиблась на 2, потом на 3, а потом на 1, то квадраты ошибок будут (4, 9, 1), а
(MSE = \frac{4 + 9 + 1}{3} = \frac{14}{3} \approx 4.67).
Эта формула применяется в регрессии, потому что здесь ошибки действительно имеют числовой размер. Ошибка на 20 хуже, чем ошибка на 2, и это можно честно измерять.
Именно поэтому для регрессионных задач важно отдельно понимать, как выбирать метрику между R2, MAE и RMSE: без этого различие между хорошей и плохой численной моделью быстро становится неочевидным.
Классификация: когда модель выбирает класс
В классификации целевая переменная категориальна. Здесь модель не пытается угадать точную величину. Она решает, к какому классу относится объект. Самый частый случай — бинарная классификация: (0) или (1).
Одна из самых важных формул здесь относится к математической статистике, оптимизации и машинному обучению через логистическую функцию:
(P(y=1 \mid x) = \sigma(z) = \frac{1}{1 + e^{-z}})
Что означает каждый символ:
(P(y=1 \mid x)) — вероятность положительного класса при данных признаках (x);
(\sigma(z)) — сигмоида, которая переводит любое число в интервал от 0 до 1;
(z) — линейная комбинация признаков;
(e) — число Эйлера.
Обычно сначала считается
(z = w_1 x_1 + w_2 x_2 + \dots + w_p x_p + b),
а потом это значение пропускается через сигмоиду.
Численный пример: пусть (z = 2). Тогда
(P(y=1 \mid x) = \frac{1}{1 + e^{-2}} \approx 0.881).
Модель говорит не «будет 0.881 единицы результата», а «вероятность положительного класса около 88.1%». После этого уже применяется порог: например, если вероятность выше 0.5, относим объект к классу (1).
Как выглядит геометрия классификации
Геометрически классификация — это задача разделения пространства признаков на области. Если регрессия строит поверхность для численного значения, то классификация строит границу принятия решения. По одну сторону границы оказываются объекты одного класса, по другую — другого.
Поэтому в классификации нас интересует уже не расстояние до истинного численного ответа, а качество разделения классов. Ошибка здесь имеет другой смысл. Если модель сказала «спам» вместо «не спам», это не ошибка на 2 или на 10. Это просто неправильный класс. Отсюда и другие метрики: accuracy, precision, recall, F1, ROC-AUC.
На практике эту разницу особенно удобно видеть через confusion matrix: она быстро показывает, что в классификации нас волнует не только сам факт ошибки, но и её тип.
Почему одна и та же модель не решает обе задачи одинаково
На уровне кода похожие библиотеки действительно используются и там и там: scikit-learn, train/test split, fit, predict. Но математическая логика разная. В регрессии нас волнует величина ошибки по числу. В классификации нас волнует правильность отнесения к классу и качество вероятностного решения.
Из-за этого различаются:
Целевая переменная. В регрессии это число, в классификации — класс.
Предсказание. В регрессии модель выдает значение, в классификации — класс или вероятность класса.
Функция потерь. Для регрессии типична MSE, для классификации часто используется log loss.
Метрики качества. Для регрессии популярны MSE, RMSE, MAE, (R^2). Для классификации — accuracy, precision, recall, F1 и ROC-AUC.
А если задача связана с редким классом, полезно сразу помнить и про классовый дисбаланс: он особенно хорошо показывает, почему одна и та же accuracy в классификации может быть куда менее содержательной, чем кажется на первом взгляде.
Где это встречается в реальных задачах Data Science
Прогноз цены недвижимости, объема продаж, времени доставки и температуры — это регрессия. Выявление мошенничества, оттока клиента, болезни, дефекта, спама и одобрения заявки — это классификация.
Иногда внешне задачи похожи. Например, в банке можно предсказывать вероятность дефолта, а можно предсказывать размер возможных потерь. Первая задача — классификационная или вероятностная. Вторая — регрессионная. Именно поэтому формулировка бизнес-вопроса важнее названия алгоритма.
Python-пример: регрессия и классификация рядом
from sklearn.datasets import make_regression, make_classification
# Импортируем генераторы данных для регрессии и классификации.
from sklearn.model_selection import train_test_split
# Импортируем функцию разделения на train и test.
from sklearn.linear_model import LinearRegression, LogisticRegression
# Импортируем модель линейной регрессии и логистической регрессии.
from sklearn.metrics import mean_squared_error, accuracy_score
# Импортируем MSE для регрессии и accuracy для классификации.
X_reg, y_reg = make_regression(n_samples=200, n_features=4, noise=10, random_state=42)
# Создаем данные, где цель является числом.
X_reg_train, X_reg_test, y_reg_train, y_reg_test = train_test_split(
X_reg, y_reg, test_size=0.2, random_state=42
)
# Делим данные регрессии на train и test.
reg_model = LinearRegression()
# Создаем модель регрессии.
reg_model.fit(X_reg_train, y_reg_train)
# Обучаем модель на train-данных.
reg_pred = reg_model.predict(X_reg_test)
# Получаем численные прогнозы.
print("Regression MSE:", round(mean_squared_error(y_reg_test, reg_pred), 3))
# Считаем качество регрессии по MSE.
X_clf, y_clf = make_classification(n_samples=200, n_features=4, random_state=42)
# Создаем данные, где цель является классом.
X_clf_train, X_clf_test, y_clf_train, y_clf_test = train_test_split(
X_clf, y_clf, test_size=0.2, random_state=42
)
# Делим данные классификации на train и test.
clf_model = LogisticRegression(max_iter=1000)
# Создаем модель классификации.
clf_model.fit(X_clf_train, y_clf_train)
# Обучаем модель на train-данных.
clf_pred = clf_model.predict(X_clf_test)
# Получаем предсказанные классы.
print("Classification accuracy:", round(accuracy_score(y_clf_test, clf_pred), 3))
# Считаем качество классификации по accuracy.Код похож, но смысл результата разный. В регрессии модель выдает величину. В классификации — класс. Именно это различие и нужно увидеть в первую очередь, когда вы начинаете работать с задачами Machine Learning.
И уже после этого становится естественно добавлять следующие уровни сложности: baseline-модель как честный старт для обеих постановок и Ridge и Lasso как следующий шаг в понимании того, как ведёт себя регрессия при усложнении пространства признаков.