Sklearn 交叉验证使用 SVC 模型返回 NaN

Sklearn Cross validate returning NaN with SVC model

我正在使用 Sklearn 的 cross_validate,它适用于多种模型,例如 GaussianNB、RandomForestClassifier、KNeighborsClassifier、GradientBoostingClassifier 和 XGBClassifier,但是当它与 SVC 一起使用时,它 returns nan.这是我的代码和我尝试过的东西。

models = [('GaussianNB', GaussianNB()), ('RandomForest', RandomForestClassifier()), ('KNN', KNeighborsClassifier()), 
          ('SVM', SVC()), ('GradientBoosting', GradientBoostingClassifier()), ('XGB', XGBClassifier(eval_metric='mlogloss'))]
scoring = ['accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc_ovr_weighted']

for name, model in models:
    kfold = model_selection.KFold(n_splits=5, shuffle=True, random_state=0)
    cv_results = model_selection.cross_validate(model, X_train, y_train.values, cv=kfold, scoring=scoring)
    this_df = pd.DataFrame(cv_results)
    this_df['model'] = name
    dfs.append(this_df)
final = pd.concat(dfs, ignore_index=True)

输出如下图所示,您可以看到除 SVC 之外的所有模型的值。

我试过这样的单一代码,它输出了一个值,但在 cross_validate

中却没有
>>> model_selection.cross_val_score(SVC(), X_train, y_train.values, cv=kfold, scoring='recall_weighted')
array([0.58930041, 0.59506173, 0.59060956, 0.61532125, 0.62685338])

我试过转换为数据框,但结果相同。

对于遇到相同问题的任何人,您需要在模型中启用 probability=True。 似乎 Sklearn 对所有分数都有错误。 roc_auc_ovr_weighted

需要概率