sklearn cross_val_score() returns NaN 值

sklearn cross_val_score() returns NaN values

我正在尝试预测下一个客户对我工作的购买。我遵循了指南,但是当我尝试使用 cross_val_score() 函数时,它 returns NaN 值。Google Colab notebook screenshot

变量:

代码:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=50)
X_train = X_train.reset_index(drop=True)
X_train
X_test = X_test.reset_index(drop=True)

y_train = y_train.astype('float')
y_test = y_test.astype('float')

models = []
models.append(("LR",LogisticRegression()))
models.append(("NB",GaussianNB()))
models.append(("RF",RandomForestClassifier()))
models.append(("SVC",SVC()))
models.append(("Dtree",DecisionTreeClassifier()))
models.append(("XGB",xgb.XGBClassifier()))
models.append(("KNN",KNeighborsClassifier()))´

for name,model in models:
   kfold = KFold(n_splits=2, random_state=22)
   cv_result = cross_val_score(model,X_train,y_train, cv = kfold,scoring = "accuracy")
   print(name, cv_result)
>>
LR [nan nan]
NB [nan nan]
RF [nan nan]
SVC [nan nan]
Dtree [nan nan]
XGB [nan nan]
KNN [nan nan]

请帮帮我!

谢谢大家的回答。 Anna 的回答对我帮助很大!但我没有使用 X_train.values,而是为 Customers 分配了一个唯一 ID,然后删除了 Customers 列,它起作用了!

现在模型有这个输出:)

LR [0.73958333 0.74736842]
NB [0.60416667 0.71578947]
RF [0.80208333 0.82105263]
SVC [0.79166667 0.77894737]
Dtree [0.82291667 0.83157895]
XGB [0.85416667 0.85263158]
KNN [0.79166667 0.75789474]

cross_val_score 方法 returns NaN 当数据集中有空值时。

要么使用可以处理缺失值的模型,要么从数据集中删除所有空值,然后重试。

就我而言,我的 numpy 数组中有一个时间增量数据类型导致了错误

对我来说,使用 xtrain.valuesytrain.values 是因为交叉验证需要输入是数组而不是数据框。

我的情况有点不同。我使用 cross_validate 而不是 cross_val_score 和性能指标列表。在做一个 5 倍的 CV 时,我一直在为 RandomForestRegressor:

的所有性能指标获取 NaN
scorers = ['neg_mean_absolute_error', 'neg_root_mean_squared_error', 'r2', 'accuracy']

results = cross_validate(forest, X, y, cv=5, scoring=scorers, return_estimator=True)
results

原来,我愚蠢地包含了 'accuracy' 指标,它只用于分类。对于这种情况,sklearn 似乎只是 returns NaN,而不是抛出错误

我正面临这个问题。我是这样解决的;我将 X_train 和 y_train 转换为 DataFrame。

cross_val_score(model,X_train,y_train, cv = kfold,scoring = "accuracy")

我知道这已经得到解答,但对于仍然无法解决问题的其他人,这是给你的...

检查您的 y 数据类型是否为 int。如果 y 值的日期类型是 object

,它将 return nan

如何检查

y.dtype

如何更改数据类型

y = y.astype(int)

我自己解决了这个问题。我使用的是自定义指标(曲线下面积 Precision-Recall (AUCPR))

def pr_auc_score(y, y_pred, **kwargs):
  classes = list(range(y_pred.shape[1]))
  if len(classes) == 2:
      precision, recall, _ = precision_recall_curve(y, y_pred[:,1],
                                                    **kwargs)
  else:
    Y = label_binarize(y, classes=classes)
    precision, recall, _ = precision_recall_curve(Y.ravel(), y_pred.ravel(),
                                                  **kwargs)
  return auc(recall, precision)

问题是,对于二元问题,y_pred只包含标签1的预测概率,所以y_pred的shape是(n_sample,)。 当我尝试调用方法时:y_pred.shape[1],它会引发错误。

解决方法:里面cross_validate,使用参数error_score="raise"。这将使您能够检测到错误。