В чем разница между метриками в классификации и регрессии?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между метриками классификации и регрессии
Основное различие
Метрики классификации и регрессии измеряют разные типы предсказаний:
- Классификация — предсказываем категорию (класс), метрики измеряют правильность класса
- Регрессия — предсказываем непрерывное число, метрики измеряют величину ошибки
Метрики классификации
1. Accuracy (точность) — самая простая
from sklearn.metrics import accuracy_score
y_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy: {accuracy}") # 4/5 = 0.8
Основная формула: (правильные предсказания) / (всего предсказаний)
Минусы: не работает при дисбалансе классов
2. Precision и Recall
from sklearn.metrics import precision_score, recall_score
# Precision — из предсказанных позитивов, сколько правильных
precision = precision_score(y_true, y_pred)
print(f"Precision: {precision}") # правильных позитивов / всех предсказанных позитивов
# Recall — из всех реальных позитивов, сколько мы поймали
recall = recall_score(y_true, y_pred)
print(f"Recall: {recall}") # правильных позитивов / всех реальных позитивов
Матрица ошибок:
Предсказано
Позитив Негатив
Реальное
Позитив TP FN (TP + FN = реальные позитивы)
Негатив FP TN (FP + TN = реальные негативы)
Precision = TP / (TP + FP) — какая доля предсказанных позитивов верна
Recall = TP / (TP + FN) — какую долю реальных позитивов мы поймали
3. F1-Score — гармоническое среднее
from sklearn.metrics import f1_score
f1 = f1_score(y_true, y_pred)
print(f"F1: {f1}") # (2 * precision * recall) / (precision + recall)
Используется когда precision и recall одинаково важны.
4. ROC-AUC Score
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# Вероятности, а не жёсткие предсказания
y_pred_proba = [0.1, 0.9, 0.7, 0.2, 0.8]
auc = roc_auc_score(y_true, y_pred_proba)
print(f"AUC: {auc}") # 0.0 - 1.0, выше = лучше
# ROC кривая
fpr, tpr, _ = roc_curve(y_true, y_pred_proba)
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
5. Confusion Matrix
from sklearn.metrics import confusion_matrix
import seaborn as sns
cm = confusion_matrix(y_true, y_pred)
print(cm)
# [[TN, FP],
# [FN, TP]]
# Визуализация
sns.heatmap(cm, annot=True, cmap='Blues')
plt.show()
Метрики регрессии
1. Mean Absolute Error (MAE) — среднее абсолютное отклонение
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mae = mean_absolute_error(y_true, y_pred)
print(f"MAE: {mae}") # Среднее |y_true - y_pred|
# MAE = (|3-2.5| + |-0.5-0| + |2-2| + |7-8|) / 4 = 0.5
Преимущества: интерпретируемо в исходных единицах, менее чувствительна к выбросам.
2. Mean Squared Error (MSE) — средняя квадратичная ошибка
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
print(f"MSE: {mse}") # Среднее (y_true - y_pred)^2
# MSE = ((3-2.5)^2 + (-0.5-0)^2 + (2-2)^2 + (7-8)^2) / 4 = 0.375
Чувствительнее к выбросам (из-за квадрата).
3. Root Mean Squared Error (RMSE) — корень из MSE
import numpy as np
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"RMSE: {rmse}") # sqrt(MSE)
В тех же единицах, что и MAE, но штрафует большие ошибки.
4. R² Score — коэффициент детерминации
from sklearn.metrics import r2_score
r2 = r2_score(y_true, y_pred)
print(f"R²: {r2}") # От -∞ до 1, где 1 = идеально
Процент дисперсии, объяснённый моделью.
5. Mean Absolute Percentage Error (MAPE)
from sklearn.metrics import mean_absolute_percentage_error
mape = mean_absolute_percentage_error(y_true, y_pred)
print(f"MAPE: {mape}") # Средний процент ошибки
Хорошо для сравнения моделей с разными масштабами.
Сравнительная таблица
| Аспект | Классификация | Регрессия |
|---|---|---|
| Выход модели | Класс (0, 1, 2...) | Число (0.5, 3.14, 100...) |
| Основная метрика | Accuracy, F1-Score | MSE, RMSE, MAE, R² |
| Другие метрики | Precision, Recall, ROC-AUC | MAPE, R², Adjusted R² |
| Чувствительна к выбросам | Меньше (работает с классами) | Больше (работает с числами) |
| Интерпретация | Правильность класса | Величина ошибки |
| Когда дисбаланс | F1-Score, ROC-AUC | Обычно нет проблемы |
| Матрица ошибок | Да | Нет |
| Пороговое значение | Можно менять (для Precision/Recall) | Нет |
Практический пример
from sklearn.datasets import load_iris, load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.metrics import (
accuracy_score, f1_score, roc_auc_score, # классификация
mean_squared_error, r2_score, mean_absolute_error # регрессия
)
# ===== КЛАССИФИКАЦИЯ =====
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3
)
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
y_pred_proba = clf.predict_proba(X_test)[:, 1]
print("=== КЛАССИФИКАЦИЯ ===")
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"F1-Score: {f1_score(y_test, y_pred, average='weighted'):.3f}")
# ===== РЕГРЕССИЯ =====
diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(
diabetes.data, diabetes.target, test_size=0.3
)
reg = DecisionTreeRegressor()
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)
print("\n=== РЕГРЕССИЯ ===")
print(f"MAE: {mean_absolute_error(y_test, y_pred):.3f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.3f}")
print(f"R²: {r2_score(y_test, y_pred):.3f}")
Когда какую метрику использовать
Классификация:
- Сбалансированные классы → Accuracy
- Дисбалансированные классы → F1-Score, ROC-AUC
- Важна точность предсказаний → Precision
- Важен поиск всех позитивов → Recall
- Бинарная классификация → ROC-AUC
Регрессия:
- Близко к реальным единицам → MAE
- Штраф за большие ошибки → RMSE, MSE
- Общая качество модели → R²
- Разные масштабы данных → MAPE
- Интерпретируемость → MAE > RMSE > MSE
Заключение
Выбор метрики зависит от вашей задачи и требований бизнеса. Для классификации часто используют несколько метрик одновременно, для регрессии также. Главное — не использовать только одну метрику, так как это может скрыть проблемы модели.