Ответ
Оценка качества модели — это не единичная метрика, а целостный процесс, который я выстраиваю в зависимости от типа задачи, бизнес-контекста и доступных данных. Мой подход структурирован.
1. Выбор метрик, адекватных задаче:
-
Для бинарной классификации:
- Accuracy: Использую только на сбалансированных датасетах. На несбалансированных (например, 99% класса 0, 1% класса 1) она бесполезна.
- Precision, Recall, F1-score: Мои основные рабочие метрики. Выбор между Precision и Recall зависит от стоимости ошибки. Например, в задаче обнаружения мошенничества (fraud detection) критичен Recall — мы не хотим пропустить мошенническую операцию, даже если это увеличит число ложных срабатываний (снизит Precision).
- ROC-AUC: Отличная агрегированная метрика, показывающая способность модели ранжировать примеры (вероятность положительного класса для Positive sample должна быть выше, чем для Negative). Устойчива к дисбалансу классов.
- PR-AUC (Precision-Recall AUC): Часто информативнее ROC-AUC на сильно несбалансированных данных. Именно на неё я смотрю в таких случаях.
-
Для регрессии:
- RMSE (Root Mean Squared Error): Широко используется, но сильно штрафует за большие выбросы.
- MAE (Mean Absolute Error): Более интерпретируемая (средняя величина ошибки в единицах целевой переменной), менее чувствительна к выбросам.
- R² (коэффициент детерминации): Показывает, какую долю дисперсии целевой переменной объясняет модель. Удобна для сравнения моделей на одном датасете.
2. Корректная процедура оценки (важнее самой метрики):
- Строгое разделение данных: Train / Validation / Test. На Validation я подбираю гиперпараметры, на Test — даю финальную, непредвзятую оценку один раз.
-
Кросс-валидация (CV): Всегда использую (обычно k=5 или k=10) для получения устойчивой оценки на Validation и для подбора гиперпараметров. Это страхует от неудачного случайного разбиения.
from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100) # Оценка ROC-AUC с помощью 5-кратной кросс-валидации cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc') print(f"ROC-AUC: {cv_scores.mean():.3f} (+/- {cv_scores.std()*2:.3f})")
3. Сравнение с базовыми моделями (Baseline): Прежде чем оценивать сложную модель, я строю простые baseline:
- Для классификации:
DummyClassifier(предсказывает самый частый класс или случайно). - Для регрессии:
DummyRegressor(предсказывает среднее значение). Качество имеет смысл только относительно baseline. Если моя нейросеть лишь на 1% лучше случайного угадывания — она бесполезна.
4. Анализ ошибок (Error Analysis): После получения метрик я смотрю матрицу ошибок (confusion matrix) и выгружаю примеры, на которых модель ошибается чаще всего. Это помогает понять систематические слабости модели (например, плохо распознаёт объекты в темноте) и определить направления для улучшения данных или архитектуры.
Итог: Я не могу назвать одну метрику. Мой ответ — это: «Для этой задачи бинарной классификации с дисбалансом я буду использовать PR-AUC на стратифицированной 5-кратной кросс-валидации, сравню результат с baseline из DummyClassifier, а затем проанализирую confusion matrix, чтобы понять природу ошибок».