Дан несбалансированный набор данных для классификации (1% положительных, 99% отрицательных): опишите полную стратегию подготовки данных, выбора метрик качества, методов борьбы с несбалансом (oversampling, undersampling, class weights, anomaly detection), а также схему валидации и пример псевдокода для оценки модели
Ниже — практическая, пошаговая «полная» стратегия для работы с сильно несбалансированным набором для бинарной классификации 11% положительных / 99% отрицательных1. Включены подготовка данных, выбор метрик, набор методов борьбы с несбалансом oversampling,undersampling,classweights,anomalydetectionoversampling, undersampling, class weights, anomaly detectionoversampling,undersampling,classweights,anomalydetection, схема валидации и пример псевдокода для оценки модели.
1) Общая идея и принципы
Цель: оптимизировать модель под реальные бизнес-метрики стоимостьFN/FP,precision@k,ранжированиеклиентовит.д.стоимость FN/FP, precision@k, ранжирование клиентов и т.д.стоимостьFN/FP,precision@k,ранжированиеклиентовит.д., а не просто «максимизировать accuracy», которая бесполезна при 1% положительных.Избегать утечек данных dataleakagedata leakagedataleakage: любые трансформации, подстраивающие данные под целевую переменную включаяресемплингвключая ресемплингвключаяресемплинг, выполнять внутри fold’ов валидации.Не изменять распределение валидационного и тестового наборов: ресемплинг применять только к тренировочным данным.Учитывать ограниченное количество позитивов при выборе схемы валидации вкаждомfold’едолжнобытьдостаточноечислоположительныхпримеровв каждом fold’е должно быть достаточное число положительных примероввкаждомfold’едолжнобытьдостаточноечислоположительныхпримеров.
2) Подготовка данных pipelinepipelinepipeline
Первичная очистка: Удалить/исправить очевидные ошибки, дубликаты.Проверить таргет и метки вредкихсобытияхчастоошибкивразметкев редких событиях часто ошибки в разметкевредкихсобытияхчастоошибкивразметке.Feature engineering: Создать агрегаты, интервалы, взаимодействия, признаки времени.Для категорий: target encoding с регуляризацией новыполнятьвCVно выполнять в CVновыполнятьвCV или частотное кодирование.Обработка пропусков: Специфично: заполнение медианой/картой/индикатором NA.Масштабирование и преобразования: Для моделей, чувствительных к масштабу — StandardScaler/RobustScaler в pipeline.Feature selection: Ограничить размер модели, особенно при малом числе позитивов чтобыснизитьпереобучениечтобы снизить переобучениечтобыснизитьпереобучение.Баланс рассмотрения классов: сохраняйте оригинальный тестовый набор для финальной оценки.
3) Выбор метрик качества
Основные — предпочтительнее над accuracy: Precision, Recall SensitivitySensitivitySensitivity, F1-score.Precision-Recall AUC AveragePrecisionAverage PrecisionAveragePrecision — ключевая метрика при редких позитивных событиях.Precision@k / recall@k / lift@k — когда у вас бизнес-ограничения на количество действий напр.,топ−100клиентовнапр., топ-100 клиентовнапр.,топ−100клиентов.ROC AUC — полезен, но может быть обманчив при 1% positive; использовать как дополнительную.Matthews Correlation Coefficient MCCMCCMCC — полезен при несбалансированности.Specificity TrueNegativeRateTrue Negative RateTrueNegativeRate — если важны FP.Brier score / calibration curve — если важна корректная вероятность.Если есть явные бизнес-штрафы: используйте ожидаемую стоимость expectedcostexpected costexpectedcost и оптимизируйте порог по ней.
4) Методы борьбы с несбалансом — что и когда использовать Общие советы:
Пробуйте несколько подходов и сравнивайте по релевантным метрикам на валидации.Комбинируйте методы успешноработаеткомбинацияclassweights+легкийoversamplingилиSMOTEENNуспешно работает комбинация class weights + легкий oversampling или SMOTEENNуспешноработаеткомбинацияclassweights+легкийoversamplingилиSMOTEENN.Всегда выполнять ресемплинг только на тренировочной части fold’а.
4.1 Class weights / cost-sensitive learning
Описание: увеличить вес ошибки на положительном классе в функции потерь сколькоразважнееFNчемFPсколько раз важнее FN чем FPсколькоразважнееFNчемFP.Где эффективно: деревья XGBoost/LightGBMимеютscaleposweightXGBoost/LightGBM имеют scale_pos_weightXGBoost/LightGBMимеютscaleposweight, логистическая регрессия, нейросети вlossпередаетсяweightв loss передается weightвlossпередаетсяweight.Плюсы: не изменяет число обучающих примеров; простая реализация; хороша когда признаки информативны.Минусы: может не справиться при чрезвычайно редких позитивных и/или неоднородных примерах.
Random Oversampling: просто дублирование позитивных примеров. Плюсы: просто, сохраняет информацию.Минусы: риск переобучения моделизапоминаютдубликатымодели запоминают дубликатымоделизапоминаютдубликаты.SMOTE / Borderline-SMOTE / ADASYN: синтетические примеры средней линии между позитивами. Плюсы: уменьшает переобучение по сравнению с простым дублированием.Минусы: может создавать «неправдоподобные» примеры, особенно при малом числе позитивов и многоразмерных/категориальных признаках.GAN/CTGAN/Tabular augmentation: для табличных данных, если много непрерывных данных. Плюсы: потенциально более реалистичные синтетические примеры.Минусы: сложность, нестабильность, риск синтеза артефактов.Практика: SMOTE + удаление ближайших негативных SMOTEENNSMOTEENNSMOTEENN часто даёт хороший компромисс.
Random undersampling: удаление части негативных примеров. Плюсы: ускоряет обучение, уменьшает дисбаланс.Минусы: возможна потеря важной информации; нежелательно при малом общем объёме данных.Informed undersampling: ClusterCentroids, Tomek links, EditedNearestNeighbours ENNENNENN. Плюсы: удаляют "шумные" негативы, сохраняют разнообразие.Практика: применимо, если у вас много негативных и вычислительные ограничения. Часто сочетают undersampling с oversampling.
4.4 Combined techniques
SMOTETomek, SMOTEENN — объединяют SMOTE + очистку Tomek/ENNTomek/ENNTomek/ENN, часто даёт улучшение.Balanced bagging ensembles: обучать много моделей на разных подвыборках с балансировкой balancedrandomforestbalanced random forestbalancedrandomforest.Простое правило: если мало позитивов (<100), осторожнее с синтетикой; можно предпочтеть class_weights + ансамбли + threshold tuning.
Подход: рассматривать позитивы как аномалии и обучать метод «one-class» на негативных илинаоборотили наоборотилинаоборот.Методы: Isolation Forest, One-Class SVM, Autoencoder реконструкцияреконструкцияреконструкция.Применимость: когда нет/почти нет размеченных позитивов либо позитивы сильно отличаются от негативов.Плюсы: не требует сбалансированных меток.Минусы: хуже, если позитивы разнообразны и не единообразно «аномальны».
4.6 Специальные loss-функции
Focal Loss: уменьшает вклад легко классифицируемых негативов — полезно при extreme imbalance, для нейросетей.Custom cost-sensitive loss: оптимизировать ожидаемую стоимость.
5) Схема валидации и подбор гиперпараметров
Стратегия: Разделите данные на train + hold-out test например,80/20например, 80/20например,80/20 stratified по классу. Hold-out идёт только для финальной оценки.На train делайте StratifiedKFold k—такое,чтобывкаждомfold’ебылоадекватноеколичествопозитивовk — такое, чтобы в каждом fold’е было адекватное количество позитивовk—такое,чтобывкаждомfold’ебылоадекватноеколичествопозитивов. Правило: минимум ~5–10 положительных в каждом fold’е, если возможно. Если мало позитивов, используйте Leave-One-Out по позитивам или repeated-stratified CV с осторожностью.В рамках каждого train_fold: Выполнить трансформации, импутацию, кодирование, масштабирование fitнаtrainfoldfit на train_foldfitнаtrainfold.Применить ресемплинг oversample/undersampleoversample/undersampleoversample/undersample только к тренировочной части fold’а.Обучить модель на преобразованных данных.Оценить модель на validation_fold без ресемплинга оригинальноераспределениеоригинальное распределениеоригинальноераспределение.Для выбора гиперпараметров используйте nested CV или GridSearchCV/RandomizedSearchCV с inner fold’ами; при ограниченных данных можно использовать Bayesian Optimization с CV.Для threshold tuning: после обучения модели на train, получить предсказания вероятностей на validation setsss и выбрать порог, оптимизирующий выбранную бизнес-метрику например,maximizeFbeta,maximizeexpectedutility,precision@kнапример, maximize F_beta, maximize expected_utility, precision@kнапример,maximizeFbeta,maximizeexpectedutility,precision@k.Повторите процесс несколько раз repeatedstratifiedk−foldrepeated stratified k-foldrepeatedstratifiedk−fold чтобы оценить стабильность.
6) Как сравнивать подходы порядокдействийпорядок действийпорядокдействий
Baseline: модель без ресемплинга + class_weights есливозможноесли возможноесливозможно. Оценить baseline по PR-AUC, precision@k, recall.Попробовать различные ресемплинги randomoversample,SMOTE,undersample,SMOTEENNrandom oversample, SMOTE, undersample, SMOTEENNrandomoversample,SMOTE,undersample,SMOTEENN. Каждый вариант — в pipeline и только внутри CV.Попробовать class_weights / focal loss / scale_pos_weight.Попробовать ансамбли / balanced bagging / gradient boosting с весами.Попробовать anomaly detection, если нет достаточного числа позитивов.Для каждого подхода: сохранить метрики на валидационных fold’ах и окончательный тест на hold-out.Выбрать модель по бизнес-метрике, затем проанализировать ошибки falsepositives/falsenegativesfalse positives/false negativesfalsepositives/falsenegatives, и провести calibration Plattscaling,isotonicPlatt scaling, isotonicPlattscaling,isotonic при необходимости.
7) Практические советы и подводные камни
Ни в коем случае не ресемплируйте весь датасет до разбиения на train/val/test.Если используете таргет-энкодинг, защищайте его через CV спомощьюрегуляризации/смущенияс помощью регуляризации/смущенияспомощьюрегуляризации/смущения и не leak’айте статистики из валидации.Для очень редких событий соберите больше данных фокуснамаркировкефокус на маркировкефокуснамаркировке — лучший путь, чем агрессивный ресемплинг.Мониторьте calibration: вероятности могут быть некорректны после oversampling.Визуализируйте precision-recall curve и lift chart, а не только одну метрику.Для production — фиксируйте порог и оценивайте на hold-out и в настоящем трафике, т.к. prevalence может меняться.
8) Пример псевдокода Python−like,scikit−learn/imbalanced−learnстилизованноPython-like, scikit-learn / imbalanced-learn стилизованноPython−like,scikit−learn/imbalanced−learnстилизованноЦель:правильныйpipelineсресемплингомвнутриCVивычислениемрелевантныхметрикЦель: правильный pipeline с ресемплингом внутри CV и вычислением релевантных метрикЦель:правильныйpipelineсресемплингомвнутриCVивычислениемрелевантныхметрик
# Предположим: X, y — входные данные; positive label = 1 from sklearn.model_selection import StratifiedKFold from sklearn.pipeline import Pipeline from imblearn.over_sampling import SMOTE from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import precision_recall_curve, average_precision_score, precision_score, recall_score, f1_score, roc_auc_score, matthews_corrcoef K = 5 skf = StratifiedKFoldnsplits=K,shuffle=True,randomstate=42n_splits=K, shuffle=True, random_state=42nsplits=K,shuffle=True,randomstate=42 metrics_per_fold = for train_idx, val_idx in skf.splitX,yX, yX,y: X_train, X_val = Xtrainidxtrain_idxtrainidx, Xvalidxval_idxvalidx
y_train, y_val = ytrainidxtrain_idxtrainidx, yvalidxval_idxvalidx # pipeline: сначала трансформации, потом ресемплинг, потом модель # Важно: SMOTE применяется ТОЛЬКО к тренировочным данным preproc = Pipeline([ ('scaler', StandardScaler()) # fit on X_train only ]) X_train_p = preproc.fit_transformXtrainX_trainXtrain
X_val_p = preproc.transformXvalX_valXval # apply resampling to training set only sm = SMOTEsamplingstrategy=0.1,randomstate=42sampling_strategy=0.1, random_state=42samplingstrategy=0.1,randomstate=42 # пример: увеличить positives до 10% X_train_res, y_train_res = sm.fit_resampleXtrainp,ytrainX_train_p, y_trainXtrainp,ytrain # train model with class weights as alternative model = LogisticRegressionclassweight=′balanced′,solver=′liblinear′class_weight='balanced', solver='liblinear'classweight=′balanced′,solver=′liblinear′ model.fitXtrainres,ytrainresX_train_res, y_train_resXtrainres,ytrainres # predict probabilities on validation noresamplingno resamplingnoresampling
y_prob = model.predict_probaXvalpX_val_pXvalp:,1:, 1:,1
y_pred_default = (y_prob >= 0.5).astypeintintint # compute metrics ap = average_precision_scoreyval,yproby_val, y_probyval,yprob # PR-AUC roc = roc_auc_scoreyval,yproby_val, y_probyval,yprob
prec = precision_scoreyval,ypreddefaulty_val, y_pred_defaultyval,ypreddefault
rec = recall_scoreyval,ypreddefaulty_val, y_pred_defaultyval,ypreddefault
f1 = f1_scoreyval,ypreddefaulty_val, y_pred_defaultyval,ypreddefault
mcc = matthews_corrcoefyval,ypreddefaulty_val, y_pred_defaultyval,ypreddefault # threshold tuning example: choose threshold that maximizes F1 on validation precisions, recalls, thresholds = precision_recall_curveyval,yproby_val, y_probyval,yprob
f1s = 2 * precisions * recalls / precisions+recalls+1e−12precisions + recalls + 1e-12precisions+recalls+1e−12
best_idx = argmaxf1sf1sf1s
best_threshold = thresholdsbestidxbest_idxbestidx if best_idx < lenthresholdsthresholdsthresholds else 0.5 # evaluate at best_threshold y_pred_best = (y_prob >= best_threshold).astypeintintint
prec_best = precision_scoreyval,ypredbesty_val, y_pred_bestyval,ypredbest
rec_best = recall_scoreyval,ypredbesty_val, y_pred_bestyval,ypredbest
f1_best = f1_scoreyval,ypredbesty_val, y_pred_bestyval,ypredbest metrics_per_fold.append′ap′:ap,′roc′:roc,′precdefault′:prec,′recdefault′:rec,′f1default′:f1,′bestthreshold′:bestthreshold,′precbest′:precbest,′recbest′:recbest,′f1best′:f1best,′mcc′:mcc{ 'ap': ap, 'roc': roc, 'prec_default': prec, 'rec_default': rec, 'f1_default': f1, 'best_threshold': best_threshold, 'prec_best': prec_best, 'rec_best': rec_best, 'f1_best': f1_best, 'mcc': mcc }′ap′:ap,′roc′:roc,′precdefault′:prec,′recdefault′:rec,′f1default′:f1,′bestthreshold′:bestthreshold,′precbest′:precbest,′recbest′:recbest,′f1best′:f1best,′mcc′:mcc # Aggregate results across folds mean,stdmean, stdmean,std
# Затем финальная тренировка на всем train свыбраннойстратегиейипорогомс выбранной стратегией и порогомсвыбраннойстратегиейипорогом, и итоговый тест на hold-out: # - train pipeline on full train set with chosen resampling and hyperparams # - predict on hold-out test noresamplingno resamplingnoresampling
# - report the same metrics + business metrics
9) Пример расширенной схемы поискгиперпараметров+nestedCVпоиск гиперпараметров + nested CVпоискгиперпараметров+nestedCV
Outer StratifiedKFold для оценки обобщающей способности.Inner StratifiedKFold для подбора гиперпараметров grid/randomsearchgrid/random searchgrid/randomsearch, при этом все ресемплинги и трансформации выполняются в inner fold’ах.Для каждого outer fold фиксируем лучший набор гиперпараметров и оцениваем на outer validation.
10) Что делать при очень малом числе позитивов (например, <50)
Предпочтительнее: собрать больше меток разметкаразметкаразметка, специализированные эксперименты.Попробовать one-class / anomaly detection.Использовать сильный простой модельный алгоритм например,логистическаярегрессиясрегуляризациейнапример, логистическая регрессия с регуляризациейнапример,логистическаярегрессиясрегуляризацией и class_weights.Использовать ручной fe engineering, rule-based подходы и затем hybrid rules+MLrules + MLrules+ML.
11) Контроль качества и интерпретация
Постройте confusion matrix, lift chart, PR-curve.Проанализируйте FP возможноонинетакиеужи«плохие»возможно они не такие уж и «плохие»возможноонинетакиеужи«плохие» и FN почемуmissedпочему missedпочемуmissed.Calibration: если будете использовать вероятности, то калибруйте модель на валидации Platt/isotonicPlatt / isotonicPlatt/isotonic.
12) Резюме рекомендаций
Начните с baseline: class_weights + простая модель; оцените PR-AUC, precision@k.Экспериментируйте с SMOTE / SMOTEENN / undersampling, но только внутри CV.При большом объёме негативов можно undersample, при малом числе позитивов осторожно с синтетикой.Если бизнес требует вероятностей — калибруйте модель.Используйте stratified CV; при temporal data — time-based split.В финале оптимизируйте порог по бизнес-метрике expectedcost,precision@kилиFβexpected cost, precision@k или Fβexpectedcost,precision@kилиFβ.
Если хотите, могу:
Составить конкретный pipeline и пример кода скептично:production−readyскептично: production-readyскептично:production−ready для вашей конкретной модели XGBoost/LightGBM/NNXGBoost/LightGBM/NNXGBoost/LightGBM/NN и типа данных табличные/текст/изображениятабличные/текст/изображениятабличные/текст/изображения.Помочь подобрать конкретные гиперпараметры и стратегию ресемплинга, исходя из размера датасета укажитеNичислопозитивовукажите N и число позитивовукажитеNичислопозитивов.
Ниже — практическая, пошаговая «полная» стратегия для работы с сильно несбалансированным набором для бинарной классификации 11% положительных / 99% отрицательных1. Включены подготовка данных, выбор метрик, набор методов борьбы с несбалансом oversampling,undersampling,classweights,anomalydetectionoversampling, undersampling, class weights, anomaly detectionoversampling,undersampling,classweights,anomalydetection, схема валидации и пример псевдокода для оценки модели.
1) Общая идея и принципы
Цель: оптимизировать модель под реальные бизнес-метрики стоимостьFN/FP,precision@k,ранжированиеклиентовит.д.стоимость FN/FP, precision@k, ранжирование клиентов и т.д.стоимостьFN/FP,precision@k,ранжированиеклиентовит.д., а не просто «максимизировать accuracy», которая бесполезна при 1% положительных.Избегать утечек данных dataleakagedata leakagedataleakage: любые трансформации, подстраивающие данные под целевую переменную включаяресемплингвключая ресемплингвключаяресемплинг, выполнять внутри fold’ов валидации.Не изменять распределение валидационного и тестового наборов: ресемплинг применять только к тренировочным данным.Учитывать ограниченное количество позитивов при выборе схемы валидации вкаждомfold’едолжнобытьдостаточноечислоположительныхпримеровв каждом fold’е должно быть достаточное число положительных примероввкаждомfold’едолжнобытьдостаточноечислоположительныхпримеров.2) Подготовка данных pipelinepipelinepipeline
Первичная очистка:Удалить/исправить очевидные ошибки, дубликаты.Проверить таргет и метки вредкихсобытияхчастоошибкивразметкев редких событиях часто ошибки в разметкевредкихсобытияхчастоошибкивразметке.Feature engineering:
Создать агрегаты, интервалы, взаимодействия, признаки времени.Для категорий: target encoding с регуляризацией новыполнятьвCVно выполнять в CVновыполнятьвCV или частотное кодирование.Обработка пропусков:
Специфично: заполнение медианой/картой/индикатором NA.Масштабирование и преобразования:
Для моделей, чувствительных к масштабу — StandardScaler/RobustScaler в pipeline.Feature selection:
Ограничить размер модели, особенно при малом числе позитивов чтобыснизитьпереобучениечтобы снизить переобучениечтобыснизитьпереобучение.Баланс рассмотрения классов: сохраняйте оригинальный тестовый набор для финальной оценки.
3) Выбор метрик качества
Основные — предпочтительнее над accuracy:Precision, Recall SensitivitySensitivitySensitivity, F1-score.Precision-Recall AUC AveragePrecisionAverage PrecisionAveragePrecision — ключевая метрика при редких позитивных событиях.Precision@k / recall@k / lift@k — когда у вас бизнес-ограничения на количество действий напр.,топ−100клиентовнапр., топ-100 клиентовнапр.,топ−100клиентов.ROC AUC — полезен, но может быть обманчив при 1% positive; использовать как дополнительную.Matthews Correlation Coefficient MCCMCCMCC — полезен при несбалансированности.Specificity TrueNegativeRateTrue Negative RateTrueNegativeRate — если важны FP.Brier score / calibration curve — если важна корректная вероятность.Если есть явные бизнес-штрафы: используйте ожидаемую стоимость expectedcostexpected costexpectedcost и оптимизируйте порог по ней.
4) Методы борьбы с несбалансом — что и когда использовать
Пробуйте несколько подходов и сравнивайте по релевантным метрикам на валидации.Комбинируйте методы успешноработаеткомбинацияclassweights+легкийoversamplingилиSMOTEENNуспешно работает комбинация class weights + легкий oversampling или SMOTEENNуспешноработаеткомбинацияclassweights+легкийoversamplingилиSMOTEENN.Всегда выполнять ресемплинг только на тренировочной части fold’а.Общие советы:
4.1 Class weights / cost-sensitive learning
Описание: увеличить вес ошибки на положительном классе в функции потерь сколькоразважнееFNчемFPсколько раз важнее FN чем FPсколькоразважнееFNчемFP.Где эффективно: деревья XGBoost/LightGBMимеютscaleposweightXGBoost/LightGBM имеют scale_pos_weightXGBoost/LightGBMимеютscalep osw eight, логистическая регрессия, нейросети вlossпередаетсяweightв loss передается weightвlossпередаетсяweight.Плюсы: не изменяет число обучающих примеров; простая реализация; хороша когда признаки информативны.Минусы: может не справиться при чрезвычайно редких позитивных и/или неоднородных примерах.4.2 Oversampling повтор/генерацияповтор/генерацияповтор/генерация
Random Oversampling: просто дублирование позитивных примеров.Плюсы: просто, сохраняет информацию.Минусы: риск переобучения моделизапоминаютдубликатымодели запоминают дубликатымоделизапоминаютдубликаты.SMOTE / Borderline-SMOTE / ADASYN: синтетические примеры средней линии между позитивами.
Плюсы: уменьшает переобучение по сравнению с простым дублированием.Минусы: может создавать «неправдоподобные» примеры, особенно при малом числе позитивов и многоразмерных/категориальных признаках.GAN/CTGAN/Tabular augmentation: для табличных данных, если много непрерывных данных.
Плюсы: потенциально более реалистичные синтетические примеры.Минусы: сложность, нестабильность, риск синтеза артефактов.Практика: SMOTE + удаление ближайших негативных SMOTEENNSMOTEENNSMOTEENN часто даёт хороший компромисс.
4.3 Undersampling уменьшениенегативовуменьшение негативовуменьшениенегативов
Random undersampling: удаление части негативных примеров.Плюсы: ускоряет обучение, уменьшает дисбаланс.Минусы: возможна потеря важной информации; нежелательно при малом общем объёме данных.Informed undersampling: ClusterCentroids, Tomek links, EditedNearestNeighbours ENNENNENN.
Плюсы: удаляют "шумные" негативы, сохраняют разнообразие.Практика: применимо, если у вас много негативных и вычислительные ограничения. Часто сочетают undersampling с oversampling.
4.4 Combined techniques
SMOTETomek, SMOTEENN — объединяют SMOTE + очистку Tomek/ENNTomek/ENNTomek/ENN, часто даёт улучшение.Balanced bagging ensembles: обучать много моделей на разных подвыборках с балансировкой balancedrandomforestbalanced random forestbalancedrandomforest.Простое правило: если мало позитивов (<100), осторожнее с синтетикой; можно предпочтеть class_weights + ансамбли + threshold tuning.4.5 Anomaly / outlier detection one−classone-classone−class
Подход: рассматривать позитивы как аномалии и обучать метод «one-class» на негативных илинаоборотили наоборотилинаоборот.Методы: Isolation Forest, One-Class SVM, Autoencoder реконструкцияреконструкцияреконструкция.Применимость: когда нет/почти нет размеченных позитивов либо позитивы сильно отличаются от негативов.Плюсы: не требует сбалансированных меток.Минусы: хуже, если позитивы разнообразны и не единообразно «аномальны».4.6 Специальные loss-функции
Focal Loss: уменьшает вклад легко классифицируемых негативов — полезно при extreme imbalance, для нейросетей.Custom cost-sensitive loss: оптимизировать ожидаемую стоимость.5) Схема валидации и подбор гиперпараметров
Стратегия:Разделите данные на train + hold-out test например,80/20например, 80/20например,80/20 stratified по классу. Hold-out идёт только для финальной оценки.На train делайте StratifiedKFold k—такое,чтобывкаждомfold’ебылоадекватноеколичествопозитивовk — такое, чтобы в каждом fold’е было адекватное количество позитивовk—такое,чтобывкаждомfold’ебылоадекватноеколичествопозитивов. Правило: минимум ~5–10 положительных в каждом fold’е, если возможно. Если мало позитивов, используйте Leave-One-Out по позитивам или repeated-stratified CV с осторожностью.В рамках каждого train_fold:
Выполнить трансформации, импутацию, кодирование, масштабирование fitнаtrainfoldfit на train_foldfitнаtrainf old.Применить ресемплинг oversample/undersampleoversample/undersampleoversample/undersample только к тренировочной части fold’а.Обучить модель на преобразованных данных.Оценить модель на validation_fold без ресемплинга оригинальноераспределениеоригинальное распределениеоригинальноераспределение.Для выбора гиперпараметров используйте nested CV или GridSearchCV/RandomizedSearchCV с inner fold’ами; при ограниченных данных можно использовать Bayesian Optimization с CV.Для threshold tuning: после обучения модели на train, получить предсказания вероятностей на validation setsss и выбрать порог, оптимизирующий выбранную бизнес-метрику например,maximizeFbeta,maximizeexpectedutility,precision@kнапример, maximize F_beta, maximize expected_utility, precision@kнапример,maximizeFb eta,maximizeexpectedu tility,precision@k.Повторите процесс несколько раз repeatedstratifiedk−foldrepeated stratified k-foldrepeatedstratifiedk−fold чтобы оценить стабильность.
6) Как сравнивать подходы порядокдействийпорядок действийпорядокдействий
Baseline: модель без ресемплинга + class_weights есливозможноесли возможноесливозможно. Оценить baseline по PR-AUC, precision@k, recall.Попробовать различные ресемплинги randomoversample,SMOTE,undersample,SMOTEENNrandom oversample, SMOTE, undersample, SMOTEENNrandomoversample,SMOTE,undersample,SMOTEENN. Каждый вариант — в pipeline и только внутри CV.Попробовать class_weights / focal loss / scale_pos_weight.Попробовать ансамбли / balanced bagging / gradient boosting с весами.Попробовать anomaly detection, если нет достаточного числа позитивов.Для каждого подхода: сохранить метрики на валидационных fold’ах и окончательный тест на hold-out.Выбрать модель по бизнес-метрике, затем проанализировать ошибки falsepositives/falsenegativesfalse positives/false negativesfalsepositives/falsenegatives, и провести calibration Plattscaling,isotonicPlatt scaling, isotonicPlattscaling,isotonic при необходимости.7) Практические советы и подводные камни
Ни в коем случае не ресемплируйте весь датасет до разбиения на train/val/test.Если используете таргет-энкодинг, защищайте его через CV спомощьюрегуляризации/смущенияс помощью регуляризации/смущенияспомощьюрегуляризации/смущения и не leak’айте статистики из валидации.Для очень редких событий соберите больше данных фокуснамаркировкефокус на маркировкефокуснамаркировке — лучший путь, чем агрессивный ресемплинг.Мониторьте calibration: вероятности могут быть некорректны после oversampling.Визуализируйте precision-recall curve и lift chart, а не только одну метрику.Для production — фиксируйте порог и оценивайте на hold-out и в настоящем трафике, т.к. prevalence может меняться.8) Пример псевдокода Python−like,scikit−learn/imbalanced−learnстилизованноPython-like, scikit-learn / imbalanced-learn стилизованноPython−like,scikit−learn/imbalanced−learnстилизованно Цель:правильныйpipelineсресемплингомвнутриCVивычислениемрелевантныхметрикЦель: правильный pipeline с ресемплингом внутри CV и вычислением релевантных метрикЦель:правильныйpipelineсресемплингомвнутриCVивычислениемрелевантныхметрик
# Предположим: X, y — входные данные; positive label = 1from sklearn.model_selection import StratifiedKFold
from sklearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_recall_curve, average_precision_score, precision_score, recall_score, f1_score, roc_auc_score, matthews_corrcoef
K = 5
skf = StratifiedKFoldnsplits=K,shuffle=True,randomstate=42n_splits=K, shuffle=True, random_state=42ns plits=K,shuffle=True,randoms tate=42
metrics_per_fold =
for train_idx, val_idx in skf.splitX,yX, yX,y:
X_train, X_val = Xtrainidxtrain_idxtraini dx, Xvalidxval_idxvali dx y_train, y_val = ytrainidxtrain_idxtraini dx, yvalidxval_idxvali dx
# pipeline: сначала трансформации, потом ресемплинг, потом модель
# Важно: SMOTE применяется ТОЛЬКО к тренировочным данным
preproc = Pipeline([
('scaler', StandardScaler()) # fit on X_train only
])
X_train_p = preproc.fit_transformXtrainX_trainXt rain X_val_p = preproc.transformXvalX_valXv al
# apply resampling to training set only
sm = SMOTEsamplingstrategy=0.1,randomstate=42sampling_strategy=0.1, random_state=42samplings trategy=0.1,randoms tate=42 # пример: увеличить positives до 10%
X_train_res, y_train_res = sm.fit_resampleXtrainp,ytrainX_train_p, y_trainXt rainp ,yt rain
# train model with class weights as alternative
model = LogisticRegressionclassweight=′balanced′,solver=′liblinear′class_weight='balanced', solver='liblinear'classw eight=′balanced′,solver=′liblinear′
model.fitXtrainres,ytrainresX_train_res, y_train_resXt rainr es,yt rainr es
# predict probabilities on validation noresamplingno resamplingnoresampling y_prob = model.predict_probaXvalpX_val_pXv alp :,1:, 1:,1 y_pred_default = (y_prob >= 0.5).astypeintintint
# compute metrics
ap = average_precision_scoreyval,yproby_val, y_probyv al,yp rob # PR-AUC
roc = roc_auc_scoreyval,yproby_val, y_probyv al,yp rob prec = precision_scoreyval,ypreddefaulty_val, y_pred_defaultyv al,yp redd efault rec = recall_scoreyval,ypreddefaulty_val, y_pred_defaultyv al,yp redd efault f1 = f1_scoreyval,ypreddefaulty_val, y_pred_defaultyv al,yp redd efault mcc = matthews_corrcoefyval,ypreddefaulty_val, y_pred_defaultyv al,yp redd efault
# threshold tuning example: choose threshold that maximizes F1 on validation
precisions, recalls, thresholds = precision_recall_curveyval,yproby_val, y_probyv al,yp rob f1s = 2 * precisions * recalls / precisions+recalls+1e−12precisions + recalls + 1e-12precisions+recalls+1e−12 best_idx = argmaxf1sf1sf1s best_threshold = thresholdsbestidxbest_idxbesti dx if best_idx < lenthresholdsthresholdsthresholds else 0.5
# evaluate at best_threshold
y_pred_best = (y_prob >= best_threshold).astypeintintint prec_best = precision_scoreyval,ypredbesty_val, y_pred_bestyv al,yp redb est rec_best = recall_scoreyval,ypredbesty_val, y_pred_bestyv al,yp redb est f1_best = f1_scoreyval,ypredbesty_val, y_pred_bestyv al,yp redb est
metrics_per_fold.append′ap′:ap,′roc′:roc,′precdefault′:prec,′recdefault′:rec,′f1default′:f1,′bestthreshold′:bestthreshold,′precbest′:precbest,′recbest′:recbest,′f1best′:f1best,′mcc′:mcc{
'ap': ap, 'roc': roc,
'prec_default': prec, 'rec_default': rec, 'f1_default': f1,
'best_threshold': best_threshold, 'prec_best': prec_best, 'rec_best': rec_best, 'f1_best': f1_best,
'mcc': mcc
}′ap′:ap,′roc′:roc,′precd efault′:prec,′recd efault′:rec,′f1d efault′:f1,′bestt hreshold′:bestt hreshold,′precb est′:precb est,′recb est′:recb est,′f1b est′:f1b est,′mcc′:mcc
# Aggregate results across folds mean,stdmean, stdmean,std # Затем финальная тренировка на всем train свыбраннойстратегиейипорогомс выбранной стратегией и порогомсвыбраннойстратегиейипорогом, и итоговый тест на hold-out:
# - train pipeline on full train set with chosen resampling and hyperparams
# - predict on hold-out test noresamplingno resamplingnoresampling # - report the same metrics + business metrics
9) Пример расширенной схемы поискгиперпараметров+nestedCVпоиск гиперпараметров + nested CVпоискгиперпараметров+nestedCV
Outer StratifiedKFold для оценки обобщающей способности.Inner StratifiedKFold для подбора гиперпараметров grid/randomsearchgrid/random searchgrid/randomsearch, при этом все ресемплинги и трансформации выполняются в inner fold’ах.Для каждого outer fold фиксируем лучший набор гиперпараметров и оцениваем на outer validation.10) Что делать при очень малом числе позитивов (например, <50)
Предпочтительнее: собрать больше меток разметкаразметкаразметка, специализированные эксперименты.Попробовать one-class / anomaly detection.Использовать сильный простой модельный алгоритм например,логистическаярегрессиясрегуляризациейнапример, логистическая регрессия с регуляризациейнапример,логистическаярегрессиясрегуляризацией и class_weights.Использовать ручной fe engineering, rule-based подходы и затем hybrid rules+MLrules + MLrules+ML.11) Контроль качества и интерпретация
Постройте confusion matrix, lift chart, PR-curve.Проанализируйте FP возможноонинетакиеужи«плохие»возможно они не такие уж и «плохие»возможноонинетакиеужи«плохие» и FN почемуmissedпочему missedпочемуmissed.Calibration: если будете использовать вероятности, то калибруйте модель на валидации Platt/isotonicPlatt / isotonicPlatt/isotonic.12) Резюме рекомендаций
Начните с baseline: class_weights + простая модель; оцените PR-AUC, precision@k.Экспериментируйте с SMOTE / SMOTEENN / undersampling, но только внутри CV.При большом объёме негативов можно undersample, при малом числе позитивов осторожно с синтетикой.Если бизнес требует вероятностей — калибруйте модель.Используйте stratified CV; при temporal data — time-based split.В финале оптимизируйте порог по бизнес-метрике expectedcost,precision@kилиFβexpected cost, precision@k или Fβexpectedcost,precision@kилиFβ.Если хотите, могу:
Составить конкретный pipeline и пример кода скептично:production−readyскептично: production-readyскептично:production−ready для вашей конкретной модели XGBoost/LightGBM/NNXGBoost/LightGBM/NNXGBoost/LightGBM/NN и типа данных табличные/текст/изображениятабличные/текст/изображениятабличные/текст/изображения.Помочь подобрать конкретные гиперпараметры и стратегию ресемплинга, исходя из размера датасета укажитеNичислопозитивовукажите N и число позитивовукажитеNичислопозитивов.