Дан датасет для классификации с сильным перекосом классов (99% класс A, 1% класс B). В коде на sklearn получена accuracy=0.99. Опишите почему accuracy вводит в заблуждение, какие метрики (precision/recall/F1, ROC AUC, PR AUC) и стратегии (пересэмплирование, взвешивание потерь, алгоритмы для редких классов) применить; обсудите схемы валидации и предотвращения утечки данных при подготовке признаков
Коротко и по делу. Почему accuracy вводит в заблуждение - При сильном перекосе классов (например 99%99\%99% класс A, 1%1\%1% класс B) модель, предсказывающая всегда A, даст accuracy 99%99\%99% (0.990.990.99), но совершенно бесполезна для поиска класса B. Accuracy не отражает качество предсказаний для редкого класса, т.к. доминируют TN из большинства класса. Ключевые метрики (что смотреть и почему) - Precision (точность для положительного класса): Precision=TPTP+FP\mathrm{Precision}=\frac{TP}{TP+FP}Precision=TP+FPTP — важна, когда ложные срабатывания дорого стоят. - Recall (полнота, чувствительность): Recall=TPTP+FN\mathrm{Recall}=\frac{TP}{TP+FN}Recall=TP+FNTP — важна, когда критично не пропустить положительные примеры. - F1: F1=2Precision⋅RecallPrecision+Recall\mathrm{F1}=2\frac{\mathrm{Precision}\cdot\mathrm{Recall}}{\mathrm{Precision}+\mathrm{Recall}}F1=2Precision+RecallPrecision⋅Recall — компромисс между precision и recall. - ROC AUC — показывает способность ранжировать объекты: независима от базовой частоты, но при сильном дисбалансе часто даёт оптимистичную картину, т.к. большое число TN «смазывает» метрику. - PR AUC (area under precision–recall curve) — более информативна при редком положительном классе, фокусируется на поведении по положительным примерам. - Дополнительно: balanced accuracy, MCC (Маттьюз): MCC=TP⋅TN−FP⋅FN(TP+FP)(TP+FN)(TN+FP)(TN+FN)
\mathrm{MCC}=\frac{TP\cdot TN - FP\cdot FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}} MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN)TP⋅TN−FP⋅FN
— стабильна при дисбалансе; confusion matrix и precision@k / recall@k полезны для бизнес-ограничений. Стратегии для работы с редким классом - Пересэмплирование: - Random undersampling (уменьшение большинства) — простой, но может потерять информацию. - Random oversampling (дублирование минорного) — риск overfitting. - SMOTE / ADASYN / SMOTEN (синтетические примеры) — генерируют новые минорные образцы. - Комбинации: SMOTE+ENN, SMOTE+Tomek. - Примечание: пересэмплирование ОБЯЗАТЕЛЬНО делать только внутри обучающей части при CV (иначе утечка). - Взвешивание потерь / cost-sensitive: - class_weight='balanced' в sklearn, вручную задавать веса в функции потерь. - Для GBM: параметр scale_pos_weight (XGBoost/LightGBM) или weight в обучающих данных. - Focal loss для нейросетей (снижает вес легко классифицируемых примеров). - Алгоритмы и ансамбли: - BalancedRandomForest, EasyEnsemble, RUSBoost. - Градиентные бустинги (XGBoost/LightGBM/CatBoost) с подбором весов/параметров. - Подходы типа anomaly detection / one-class methods, если положительные примеры крайне редки и отличаются. - Калибровка и порог: - Калибровать вероятности (Platt/Isotonic) на валидационной выборке. - Не обязательно выбирать порог 0.50.50.5 — подбирайте порог по целевой метрике (например давая минимальный FN или требуемую precision). - Оценка стоимости ошибок: - Если у вас известны издержки FP vs FN, минимизируйте ожидаемую стоимость при выборе порога. Схемы валидации и предотвращение утечки данных - Выбор CV: - StratifiedKFold для поддержания долей классов в фолдах. - GroupKFold, если есть связанные группы (пользователь, сессия) — нельзя разрывать группу между train/test. - TimeSeriesSplit для временных данных (никакого перемешивания). - Для модельного отбора/подбора гиперпараметров используйте nested CV. - Пайплайн и порядок операций: - Всё препроцессирование (скейлинг, имутация, кодирование, target encoding, пересэмплирование) должно выполняться внутри Pipeline и только на тренировочной части фолда; тестовая часть фолда должна оставаться «чистой». - Пересэмплирование — применять ТОЛЬКО к тренировочной части каждого фолда (иначе утечка). - Target/mean encoding — вычислять в out-of-fold режиме или с регуляризацией; нельзя использовать целевые статистики на всём датасете до разбиения. - Скейлеры/импьютеры — fit на train, transform на test. - Проверка на утечку: - Убедитесь, что одинаковые записи (или связанные по признакам) не присутствуют в train и test. - Не использовать будущую информацию (timestamps, агрегаты по будущему). - При генерации признаков из внешних источников — строить только на данных доступных на момент прогнозирования. - Тестирование производительности: - Отдельный удерживаемый тест set (holdout) с тем же разрежением классов, на который не смотрели при тренировке и выборе гиперпараметров. - Оценивать модели по PR AUC, recall при допустимом уровне precision (или наоборот), confusion matrix и MCC. Короткий чек-лист внедрения 1. Разделить данные с учётом времени/групп и оставить holdout. 2. Использовать StratifiedKFold (или Group/Time) и pipeline. 3. Применять пересэмплирование и target-encoding только внутри train-фолда. 4. Обучать с class-weight / focal loss или пробовать SMOTE/EasyEnsemble. 5. Калибровать вероятности и подбирать порог по бизнес-метрикам. 6. Отчитывать PR AUC, recall@k, precision, F1, MCC и confusion matrix — не accuracy. Если нужно, могу дать пример кода sklearn-пайплайна с правильной последовательностью (oversampling внутри CV) и подбором порога и метрик.
Почему accuracy вводит в заблуждение
- При сильном перекосе классов (например 99%99\%99% класс A, 1%1\%1% класс B) модель, предсказывающая всегда A, даст accuracy 99%99\%99% (0.990.990.99), но совершенно бесполезна для поиска класса B. Accuracy не отражает качество предсказаний для редкого класса, т.к. доминируют TN из большинства класса.
Ключевые метрики (что смотреть и почему)
- Precision (точность для положительного класса): Precision=TPTP+FP\mathrm{Precision}=\frac{TP}{TP+FP}Precision=TP+FPTP — важна, когда ложные срабатывания дорого стоят.
- Recall (полнота, чувствительность): Recall=TPTP+FN\mathrm{Recall}=\frac{TP}{TP+FN}Recall=TP+FNTP — важна, когда критично не пропустить положительные примеры.
- F1: F1=2Precision⋅RecallPrecision+Recall\mathrm{F1}=2\frac{\mathrm{Precision}\cdot\mathrm{Recall}}{\mathrm{Precision}+\mathrm{Recall}}F1=2Precision+RecallPrecision⋅Recall — компромисс между precision и recall.
- ROC AUC — показывает способность ранжировать объекты: независима от базовой частоты, но при сильном дисбалансе часто даёт оптимистичную картину, т.к. большое число TN «смазывает» метрику.
- PR AUC (area under precision–recall curve) — более информативна при редком положительном классе, фокусируется на поведении по положительным примерам.
- Дополнительно: balanced accuracy, MCC (Маттьюз):
MCC=TP⋅TN−FP⋅FN(TP+FP)(TP+FN)(TN+FP)(TN+FN) \mathrm{MCC}=\frac{TP\cdot TN - FP\cdot FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}
MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN) TP⋅TN−FP⋅FN — стабильна при дисбалансе; confusion matrix и precision@k / recall@k полезны для бизнес-ограничений.
Стратегии для работы с редким классом
- Пересэмплирование:
- Random undersampling (уменьшение большинства) — простой, но может потерять информацию.
- Random oversampling (дублирование минорного) — риск overfitting.
- SMOTE / ADASYN / SMOTEN (синтетические примеры) — генерируют новые минорные образцы.
- Комбинации: SMOTE+ENN, SMOTE+Tomek.
- Примечание: пересэмплирование ОБЯЗАТЕЛЬНО делать только внутри обучающей части при CV (иначе утечка).
- Взвешивание потерь / cost-sensitive:
- class_weight='balanced' в sklearn, вручную задавать веса в функции потерь.
- Для GBM: параметр scale_pos_weight (XGBoost/LightGBM) или weight в обучающих данных.
- Focal loss для нейросетей (снижает вес легко классифицируемых примеров).
- Алгоритмы и ансамбли:
- BalancedRandomForest, EasyEnsemble, RUSBoost.
- Градиентные бустинги (XGBoost/LightGBM/CatBoost) с подбором весов/параметров.
- Подходы типа anomaly detection / one-class methods, если положительные примеры крайне редки и отличаются.
- Калибровка и порог:
- Калибровать вероятности (Platt/Isotonic) на валидационной выборке.
- Не обязательно выбирать порог 0.50.50.5 — подбирайте порог по целевой метрике (например давая минимальный FN или требуемую precision).
- Оценка стоимости ошибок:
- Если у вас известны издержки FP vs FN, минимизируйте ожидаемую стоимость при выборе порога.
Схемы валидации и предотвращение утечки данных
- Выбор CV:
- StratifiedKFold для поддержания долей классов в фолдах.
- GroupKFold, если есть связанные группы (пользователь, сессия) — нельзя разрывать группу между train/test.
- TimeSeriesSplit для временных данных (никакого перемешивания).
- Для модельного отбора/подбора гиперпараметров используйте nested CV.
- Пайплайн и порядок операций:
- Всё препроцессирование (скейлинг, имутация, кодирование, target encoding, пересэмплирование) должно выполняться внутри Pipeline и только на тренировочной части фолда; тестовая часть фолда должна оставаться «чистой».
- Пересэмплирование — применять ТОЛЬКО к тренировочной части каждого фолда (иначе утечка).
- Target/mean encoding — вычислять в out-of-fold режиме или с регуляризацией; нельзя использовать целевые статистики на всём датасете до разбиения.
- Скейлеры/импьютеры — fit на train, transform на test.
- Проверка на утечку:
- Убедитесь, что одинаковые записи (или связанные по признакам) не присутствуют в train и test.
- Не использовать будущую информацию (timestamps, агрегаты по будущему).
- При генерации признаков из внешних источников — строить только на данных доступных на момент прогнозирования.
- Тестирование производительности:
- Отдельный удерживаемый тест set (holdout) с тем же разрежением классов, на который не смотрели при тренировке и выборе гиперпараметров.
- Оценивать модели по PR AUC, recall при допустимом уровне precision (или наоборот), confusion matrix и MCC.
Короткий чек-лист внедрения
1. Разделить данные с учётом времени/групп и оставить holdout.
2. Использовать StratifiedKFold (или Group/Time) и pipeline.
3. Применять пересэмплирование и target-encoding только внутри train-фолда.
4. Обучать с class-weight / focal loss или пробовать SMOTE/EasyEnsemble.
5. Калибровать вероятности и подбирать порог по бизнес-метрикам.
6. Отчитывать PR AUC, recall@k, precision, F1, MCC и confusion matrix — не accuracy.
Если нужно, могу дать пример кода sklearn-пайплайна с правильной последовательностью (oversampling внутри CV) и подбором порога и метрик.