为什么 GridSearchCV 返回 nan?

数据挖掘 交叉验证 管道 网格搜索
2022-03-07 06:13:43

我正在使用 gridsearchcv 来调整我的模型的参数,并且我还使用管道和交叉验证。当我运行模型来调整 XGBoost 的参数时,它返回nan. 但是,当我对随机森林等其他分类器使用相同的代码时,它可以工作并返回完整的结果。

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

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

# define parametres for hypertuning
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]

另一件奇怪的事情是,当我在 Logistics Regression 中应用相同的代码来调整惩罚时,它会为 l1 和 elasticnet 返回 nan。

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

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

# define parametres for hypertuning
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]
1个回答

默认情况下,GridSearchCV提供nan拟合模型失败时的分数。您可以通过设置参数来更改该行为并引发错误error_score="raise",或者您可以尝试拟合单个模型来获取错误。然后,您可以使用回溯来帮助找出问题所在。

对于LogisticRegression,我可以确定可能的罪魁祸首:默认solverlbfgs,它无法处理 L1 或 ElasticNet 惩罚。使用saga.

我没有立即看到 XGBoost 模型或参数存在问题。使用第一段获取错误回溯,并在需要时将其作为单独的问题进行搜索/询问。