Почему GridSearchCV возвращает nan?

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

Я использую gridsearchcv для настройки параметров моей модели, а также использую pipeline и кросс-валидацию. Когда я запускаю модель для настройки параметра XGBoost, она возвращает nan. Однако, когда я использую тот же код для других классификаторов, таких как случайный лес, это работает, и он возвращает полные результаты.

kf = StratifiedKFold(n_splits=10, shuffle=False)

SCORING = ['accuracy', 'precision', 'recall', 'f1' ]

# определим параметры для гипертюнинга
params = {
    'Classifier__n_estimators': [5, 10, 20, 50, 100, 200]
}

XGB = XGBClassifier()
UnSam = RepeatedEditedNearestNeighbours()

pipe = Pipeline(steps=[('UnderSampling', UnSam ), ('Classifier', XGB)])
# ___________________________________________

mod = GridSearchCV(pipe, params, cv =kf, scoring = SCORING, refit="f1", return_train_score=True)
mod.fit(X_train, y_train)

Вот мой код, и когда я запускаю его, получаются следующие результаты:

{'Classifier__n_estimators': 5}
__________________________________________________
F1 :  [nan nan nan nan nan nan] 
 Recall :  [nan nan nan nan nan nan] 
 Accuracy :  [nan nan nan nan nan nan] 
 Precision :  [nan nan nan nan nan nan]

Еще одна странная вещь заключается в том, что когда я применяю тот же код для настройки штрафа в логистической регрессии, он возвращает nan для l1 и elasticnet.

kf = StratifiedKFold(n_splits=10, shuffle=False)

SCORING = ['accuracy', 'precision', 'recall', 'f1' ]

# определим параметры для гипертюнинга
params = {
    'Classifier__penalty': ['l1','l2','elasticnet']
}

LR = LogisticRegression(random_state=0)
UnSam = RepeatedEditedNearestNeighbours()

pipe = Pipeline(steps=[('UnderSampling', UnSam ), ('Classifier', LR)])
# ___________________________________________

mod = GridSearchCV(pipe, params, cv =kf, scoring = SCORING, refit="f1", return_train_score=True)
mod.fit(X_train, y_train)

Результаты следующие:

{'Classifier__penalty': 'l2'}
__________________________________________________
F1 :  [  nan 0.363   nan] 
 Recall :  [   nan 0.4188    nan] 
 Accuracy :  [   nan 0.7809    nan] 
 Precision :  [   nan 0.3215    nan]

По умолчанию GridSearchCV предоставляет оценку nan, когда подгонка модели не удалась. Вы можете изменить это поведение и вызвать ошибку, установив параметр error_score="raise", или попытаться подогнать одиночную модель, чтобы получить ошибку. Затем вы можете использовать трассировку, чтобы помочь выяснить, в чем проблема.

Что касается LogisticRegression, я могу определить вероятного виновного: значение по умолчанию solver – это lbfgs, который не может обрабатывать L1 или ElasticNet штраф. Используйте saga.

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

Основываясь на этом обсуждении, я столкнулся с аналогичной проблемой при использовании оптимизатора Random Search с XGBoost. В частности, при загрузке модели XGBClassifier в Pipeline библиотеки scikit-learn и затем передаче ее экземпляру RandomizedSearchCV в качестве оценщика (с error_score="raise", чтобы избежать присвоения оценок np.nan), я столкнулся с следующей ошибкой, помимо предупреждения, выделенного в Ошибке метода sklearn_tags XGBoost в Python при загрузке модели:

Pipeline должен быть либо классификатором, используемым с response_method=predict_proba, либо response_method должен быть 'predict'. Получен регрессор с response_method=predict_proba вместо этого.

Возможные решения, которые я нашел, включают:

  1. Понижение версии scikit-learn до 1.5.2: Я заметил, что проблемы, с которыми я столкнулся, кажутся зависимыми от версии. В частности, версии scikit-learn между 1.5.3 и 1.6.0 (текущая версия Colab на момент написания) все показывают эти ошибки на Colab. Потенциальным временным решением может быть понижение до версии scikit-learn 1.5.2.
!pip install scikit-learn==1.5.2
  1. Создание пользовательского класса XGBClassifier: Как указано в Несоответствие между scikit-learn и xgboost, создание пользовательского XGBClassifier класса-обертки также является жизнеспособным решением, наряду с другими решениями, упомянутыми в связанных дискуссиях.

ПС: Я не уверен, страдают ли другие классификаторы на основе деревьев от этой аналогичной проблемы, но я проверил с ExtraTreesClassifier и он работал нормально.

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

Почему GridSearchCV возвращает nan: Подробный анализ

Использование GridSearchCV для настройки гиперпараметров моделей является распространенной практикой в области машинного обучения. Однако, как вы, возможно, заметили, результат может оказаться не таким, как ожидалось — особенно в случаях, когда возвращаются значения nan. Давайте подробно разберем, что может быть причиной данной проблемы, особенно в контексте XGBClassifier и LogisticRegression.

1. Причины появления nan в GridSearchCV

1.1 Ошибки в fitting модели

Один из наиболее распространенных случаев, когда GridSearchCV возвращает nan, заключается в том, что во время обучения модели произошла ошибка. Это может быть связано с:

  • Ошибка в алгоритме: Например, некоторые алгоритмы могут не поддерживать определенные комбинации параметров.
  • Неподходящие входные данные: Проверяйте, чтобы ваши данные не содержали накапливающегося NaN, Infinity или других неприемлемых значений.
  • Неисправимые конфигурации: Некоторые комбинации гиперпараметров могут диктовать модель с несуществующими или конфликтующими требованиями.
1.2 Неверный выбор параметров

Для LogisticRegression, по умолчанию используется solver='lbfgs', который не работает с penalty='l1' или penalty='elasticnet'. Чтобы избежать этого, убедитесь, что вы устанавливаете solver='saga', который поддерживает все указанные ваши штрафные функции.

2. Решения для XGBoost

На данный момент вы отмечаете, что ошибка возникает с XGBClassifier. Вот некоторые шаги, которые можно предпринять для более глубокого анализа:

  • Переменная ошибки: Запустите GridSearchCV с параметром error_score='raise' для проверки трассировки ошибок, что позволит вам получить больше информации о происходящем:

    mod = GridSearchCV(pipe, params, cv=kf, scoring=SCORING, refit="f1", return_train_score=True, error_score="raise")
  • Параметры модели: Убедитесь, что значения гиперпараметров, которые вы передаете (n_estimators, и другие), корректны и находятся в допустимых границах.

3. Совместимость библиотек

Также важно отметить, что проблемы с GridSearchCV, возможно, связаны с версией библиотек. Если вы использовали последние версии scikit-learn и xgboost, убедитесь, что они совместимы друг с другом. Некоторые решения могут включать:

  • Понижение версии: Для устранения несовместимости иногда помогает использовать более раннюю версию scikit-learn, например:

    pip install scikit-learn==1.5.2
  • Создание пользовательского класса: Если стандартные решения не работают, создание обертки для XGBClassifier может решить проблему, особенно если вы сталкиваетесь с совместимостью между версиями библиотек.

4. Проверка данных

Помимо вышеперечисленного, не забывайте о проверке данных:

  • Убедитесь, что в вашем наборе данных нет пропущенных значений или нечисловых значений, которые могут помешать модели.

Заключение

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

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

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