Почему разница между классификацией и регрессией глубже, чем просто тип ответа
На первый взгляд все звучит просто: если предсказываем число — это регрессия, если класс — классификация. Но для практики этого определения мало. Разница начинается раньше: в том, как мы думаем о результате, как измеряем ошибку и какую структуру сигнала ожидаем увидеть. В регрессии нас интересует непрерывная величина и расстояние до нее. В классификации — граница решения, вероятность класса и цена разных типов ошибки.
Именно поэтому один и тот же датасет можно испортить неправильной постановкой. Если задачу на отток свести к числовому скору без понимания порога, можно потерять смысл решения. Если прогноз выручки искусственно превратить в классы, можно выбросить полезную количественную информацию.
Как это влияет на выбор модели и метрики
В регрессии естественны метрики типа MAE, RMSE, R2. Они измеряют, насколько далек прогноз от реального числа. В классификации на первый план выходят accuracy, precision, recall, F1, ROC-AUC и другие меры качества решения по классам. Модель тоже строится по-разному: линейная регрессия и логистическая регрессия похожи по форме, но смысл их выхода принципиально различается.
Если говорить еще глубже, классификация почти всегда приводит к разговору о пороге и вероятностях, а регрессия — к разговору о масштабе ошибки и устойчивости предсказаний.
Где начинаются практические ошибки
Новички часто пытаются сравнивать модели из разных постановок одинаковыми метриками или интерпретировать classification score как количественный прогноз. Еще одна ошибка — забывать о бизнесовом смысле. В одной задаче важнее правильно отделить объекты по группам, в другой — точно предсказать величину эффекта. Постановка должна отражать то решение, которое дальше будет принимать система или человек.
import pandas as pd # создаем две мини-задачи на одном и том же наборе признаков
from sklearn.linear_model import LinearRegression, LogisticRegression # берем модели под регрессию и классификацию
data = pd.DataFrame({ # задаем маленький учебный набор наблюдений
'sessions': [1, 2, 3, 4, 5, 6], # числовой признак активности
'avg_time': [2, 3, 4, 5, 6, 7], # второй числовой признак
'revenue': [100, 180, 260, 390, 520, 610], # непрерывный target для регрессии
'converted': [0, 0, 0, 1, 1, 1] # бинарный target для классификации
})
X = data[['sessions', 'avg_time']] # используем одни и те же признаки в двух постановках
reg = LinearRegression() # модель для прогноза числа
clf = LogisticRegression(max_iter=2000) # модель для предсказания класса
reg.fit(X, data['revenue']) # обучаем регрессию на выручке
clf.fit(X, data['converted']) # обучаем классификатор на конверсии
print(reg.predict(X[:2]).round(2).tolist()) # получаем непрерывные числовые предсказания
print(clf.predict_proba(X[:2])[:, 1].round(3).tolist()) # получаем вероятности положительного классаИменно здесь разница становится наглядной. Один и тот же входной вектор может порождать либо число, либо вероятность класса. И выбор между этими режимами — это не косметика, а отражение того, какой вопрос мы задаем данным.