Вопрос или проблема
Я использую 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 вместо этого.
Возможные решения, которые я нашел, включают:
- Понижение версии 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
- Создание пользовательского класса 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
может быть вызвано множеством факторов — от ошибок в данных до неправильной конфигурации гиперпараметров и несовместимости библиотек. Следование рекомендациям по проверке, исправлению параметров и тестированию совместимости библиотек поможет вам найти и устранить проблему.