В чем разница между задачами классификации и регрессии в машинном обучении?

«В чем разница между задачами классификации и регрессии в машинном обучении?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классификация и Регрессия — два основных типа задач обучения с учителем (Supervised Learning), различающиеся по типу целевой переменной (что мы предсказываем).

Признак Классификация Регрессия
Целевая переменная (y) Дискретная (категориальная, метка). Примеры: «спам»/«не спам», тип животного (кошка, собака), цифра от 0 до 9. Непрерывная (числовая). Примеры: цена дома, температура, время до события, возраст.
Цель модели Отнести объект к одному из предопределенных классов. Предсказать конкретное числовое значение.
Примеры алгоритмов Логистическая регрессия, Решающие деревья, SVM, k-NN, Нейронные сети. Линейная регрессия, Полиномиальная регрессия, Решающие деревья (для регрессии), Gradient Boosting (например, XGBoostRegressor).
Метрики оценки Accuracy, Precision, Recall, F1-Score, ROC-AUC. Среднеквадратичная ошибка (MSE), Корень из MSE (RMSE), Средняя абсолютная ошибка (MAE), Коэффициент детерминации (R²).

Практические примеры на Python с scikit-learn:

1. Классификация (Бинарная: Определение ириса как 'setosa' или 'versicolor')

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# Загружаем данные, берем только два первых класса
iris = load_iris()
X = iris.data[:100, :2]  # Берем только два признака и 100 первых образцов (2 класса)
y = iris.target[:100]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создаем и обучаем модель классификации
clf = LogisticRegression()
clf.fit(X_train, y_train)

# Предсказываем классы
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred, target_names=iris.target_names[:2]))

2. Регрессия (Предсказание цены дома на основе площади)

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# Искусственные данные: площадь -> цена
np.random.seed(42)
X = 2.5 * np.random.randn(100, 1) + 25  # Площадь в м² (в среднем 25)
y = 50000 + 3000 * X + np.random.randn(100, 1) * 20000  # Цена с шумом

model = LinearRegression()
model.fit(X, y)

# Предсказываем цену для новой площади
X_new = np.array([[30.0]])
y_pred_new = model.predict(X_new)
print(f"Предсказанная цена для квартиры 30 м²: {y_pred_new[0][0]:.0f} у.е.")

# Оцениваем модель на всех данных
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"MSE: {mse:.0f}, R²: {r2:.3f}")

Важный нюанс: Некоторые алгоритмы (например, Решающие деревья, Градиентный бустинг) могут решать обе задачи, в зависимости от реализации (DecisionTreeClassifier vs DecisionTreeRegressor).