Переобученная модель дает схожий AUC на тестовом наборе данных, так какую модель мне выбрать?

Вопрос или проблема

Я пытался сравнить эффект выполнения GridSearchCV на наборе данных, который был перераспределен до и после выбора обучающих фолдов. Метод перераспределения, который я использовал, был случайным перераспределением.

Понимаю, что первый подход ошибочен, так как наблюдения, которые модель видела, попадают в тестовый набор. Мне было интересно, насколько это влияет на результаты.

Я сгенерировал набор данных для бинарной классификации со следующими параметрами:

# Генерация набора данных для бинарной классификации с 5% минорного класса,
# 3 информативными признаками, добавление шума с flip_y = 15%

X, y = make_classification(n_samples=5000, n_features=3, n_informative=3,
                            n_redundant=0, n_repeated=0, n_classes=2,
                            n_clusters_per_class=1,
                            weights=[0.95, 0.05],
                            flip_y = 0.15,
                            class_sep=0.8)

Я разделил этот набор на 60/40% обучающую и тестовую выборки и выполнил GridSearchCV с обоими подходами на модели случайного леса. Получил следующие результаты на основе best_estimator_ для обоих подходов:

Лучшие параметры Post-Oversampled Grid CV:  {'n_estimators': 1000}
Лучшие параметры Pre-Oversampled Grid CV:  {'classifier__n_estimators': 500}
AUC Post-Oversampled Grid CV - обучающая выборка:  0.9996723239846446
AUC Post-Oversampled Grid CV - тестовая выборка:  0.6060618701968091
AUC Pre-Oversampled Grid CV - обучающая выборка:  0.6578310812852065
AUC Pre-Oversampled Grid CV - тестовая выборка:  0.6112671617024038

Как и ожидалось, AUC для Post-Oversampled Grid CV очень высокий из-за переобучения. Однако, при оценке обеих моделей на тестовом наборе результаты по AUC оказались очень похожими (60.6% против 61.1%).

У меня возникло два вопроса. Почему это наблюдается? Я не задавал random_state для этих шагов и пробовал много раз, но все равно получаю такие же результаты. В таком случае, какая модель становится лучше для дальнейшего использования, если они дают схожие результаты на тестовом наборе?

Для перераспределения и обработки этого через pipeline, я использовал imblearn:

# функции imblearn
from imblearn.over_sampling import RandomOverSampler
from imblearn.pipeline import Pipeline as Imb_Pipeline

Готов поделиться кодом, если нужно. Спасибо.

Если вы не указываете int для random_int в train_test_split, это не значит, что ничего не будет. По умолчанию используется None, обратитесь к документации train_test_split, там сказано,

Если None, генератор случайных чисел – экземпляр RandomState, используемый np.random.

Теперь давайте посмотрим на экземпляр RandomState из документации np.random. Обратите внимание на эти моменты:

по умолчанию None. Если размер None, то генерируется и возвращается одно значение.

и

Если seed равен None, RandomState попробует считать данные из /dev/urandom (или аналогового для Windows), если доступно, или иначе использовать seed от системных часов.

Это означает, что вы можете получить одинаковые результаты несколько раз. Но нет гарантии, что это сработает у других. Ничто не является случайным, все используют псевдослучайность. Как-то “random_state” генерируется.

Мой лучший совет – попробовать: train:valid:test::80:10:10 или 60:20:20. После выполнения GridSearchCV сравните точность на валидационной выборке, затем попробуйте лучший оценщик на тестовом наборе. Но это предполагает наличие большего объема данных.

Надеюсь, это поможет. Если кто-то найдет ошибки, буду рад, если поправите.

Основная проблема с перераспределением до разделения в том, что полученный результат имеет оптимистичное смещение (в вашем эксперименте, довольно сильное!). Итоговая модель не обязательно будет плоха для будущих целей, просто она не будет такой хорошей, как может показаться.
(Примечание: результаты, используемые для выбора лучших гиперпараметров, больше не являются несмещенными оценками производительности.)

Теперь, с учетом настройки гиперпараметров, которая смотрит на эти результаты, вы можете получить набор гиперпараметров, который помогает модели переобучаться на дублированных строках, так что ваша итоговая модель может пострадать в будущем. Однако в вашем эксперименте вы ищете лишь количество деревьев в случайном лесу, что мало влияет на конечную производительность (лишь снижая дисперсию из-за случайного выбора строк/колонок). Поэтому схожие результаты на тестовом наборе не столь удивительны.

1/ Перераспределение

Перераспределение должно использоваться только на обучающем наборе.
Перераспределение помогает во время обучения, чтобы иметь больше данных и/или уравновесить классы, если это необходимо.

Таким образом, в вашем случае лучше делать это только на обучающем наборе, а не на тестовом.

GridSearchCV использует кросс-валидацию и будет делить обучающий набор на несколько фолдов.

Затем итоговая оценка модели на тестовом наборе должна проводиться на чистом тестовом наборе без перераспределения.
Это отражает реальное распределение классов и, следовательно, отразит реальную точность.

2/ Дисбаланс классов

Ваши классы дисбалансированы: обычно это плохо, чтобы найти хорошую модель.
Как видите, 60% AUC для 95%/5% бинарной классификации – это нехорошо.
Более того, случайное перераспределение ваших классов 95%/5%, вероятно, сделает их еще более дисбалансированными.
Вам следует сначала поэкспериментировать с сбалансированными классами и посмотреть, повторится ли это.

3/ Случайность

Вы используете случайность, не задавая seed, так как make_classification и flip_y используют случайность, и я не вижу здесь параметра random_stateint.

Итак, установили ли вы seed случайности в остальной части вашего кода?
Можете проверить:

  • параметр random_stateint в train_test_split?
  • так как вы перераспределяете случайным образом, установили ли вы также random_stateint?

.

Ответ или решение

Давайте детально разберем вашу ситуацию в контексте выбора модели для исследования, где используется GridSearchCV на датасете с предвариательным или последующим пересэмплингом.

Контекст

  1. Метод пересэмплинга: Вы применяете случайный пересэмплинг на выборках. Это делается для балансировки классов в тренерской выборке с целью улучшения качества модели.

  2. Генерация данных: Вы работаете с бинарным классификационным датасетом, у которого только 5% составляет меньшинство, а нойз добавляется через параметр flip_y=0.15.

  3. Модель и подходы: Вы применяете модель случайного леса, используя GridSearchCV для определения оптимальных гиперпараметров. При этом вы применяете пересэмплинг как до, так и после разбиения данных на обучающую и тестовую выборки.

  4. Результаты: Согласно вашим отчетам, AUC моделей на тестовых данных почти одинаковы при обоих подходах, несмотря на явное переобучение в одном из них.

Анализ результатов и стратегия выбора модели

Переобучение и его последствия

Когда вы проводите пересэмплинг до разбиения на фолды, это создает искусственный оптимизм в ваших метриках из-за утечки данных (Data leakage). Результаты обучения оказываются завышенными, что можно наблюдать в высоком AUC на обучающей выборке (0.999).

При пересэмплинге после разбиения на фолды, сохраняется объективность в оценке на тестовой выборке, и это более корректный подход, так как он отражает реальную производительность модели с учетом дисбаланса классов.

Почему результаты схожи?

Параметр n_estimators в случае случайного леса не так существенно влияет на финальную производительность модели, он скорее способствует снижению дисперсии. Поэтому, при ваших конфигурациях, небольшая разница в числе деревьев (n_estimators) может недостаточно сильно сказаться на итоговой метрике AUC.

Рекомендации

  1. Используйте корректный подход: Всегда пересэмплируйте исключительно на обучающей выборке. Это обеспечит корректность показателей модели и минимизирует акцент на искусственно созданные данные.

  2. Проверка и контроль за случайностью: Убедитесь, что все операции с случайными процессами, такие как make_classification, train_test_split и методы пересэмплинга, выполняются с фиксированным состоянием случайности (random_state). Это сделает ваши эксперименты воспроизводимыми и снизит волатильность в получаемых результатах.

  3. Экспериментируйте с разными методами обработки дисбаланса: Попробуйте такие методы, как SMOTE или ADASYN, которые могут оказаться более эффективными для работы с сильно дисбалансированными данными. Сравните результаты с вашим текущим подходом для выявления лучшего решения.

  4. Разделение данных на части: Попробуйте разбиение 60:20:20 (train:validation:test), чтобы обеспечить достаточный объем данных для обучения и проверки перед финальным тестированием.

Следуя данным рекомендациям, вы сможете выбрать более оптимальную модель для вашей задачи и повысить надежность ваших выводов.

Оцените материал
Добавить комментарий

Капча загружается...