sklearn cross_val_score() 返回 NaN 值

问题描述 投票:0回答:10

我正在尝试预测下一次客户购买我的工作。我遵循了指南,但是当我尝试使用 cross_val_score() 函数时,它返回 NaN 值。Google Colab 笔记本屏幕截图

变量:

  • X_train 是一个数据框
  • X_test 是一个数据框
  • y_train 是一个列表
  • y_test 是一个列表

代码:

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]

请帮助我!

python nan prediction cross-validation sklearn-pandas
10个回答
7
投票

我的情况有点不同。我使用

cross_validate
而不是
cross_val_score
以及性能指标列表。在进行 5 折 CV 时,我的所有性能指标不断得到 NaN,
RandomForestRegressor
:

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

事实证明,我愚蠢地包含了仅用于分类的“准确性”指标。对于这种情况,sklearn 看起来只是返回 NaN,而不是抛出错误


5
投票

我解决了我这边的问题。我使用的是自定义指标(曲线下面积精确召回率 (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
的形状为(n_sample,)。 当我尝试调用该方法时:
y_pred.shape[1]
,它会引发错误。

解决方案:

cross_validate
内,使用参数
error_score="raise"
。这将使您能够检测到错误。


1
投票

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

现在模型有这个输出:)

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]

1
投票

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

检查您的

y
数据类型是否为
int
。如果您的
nan
值的日期类型是
y
,它将返回 
object

如何检查

y.dtype

如何更改数据类型

y = y.astype(int)


0
投票

对于我的情况,我的 numpy 数组中有一个时间增量数据类型,导致了错误


0
投票

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

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

0
投票

在传递给 cross_val_score 之前尝试对分类列进行编码。这对我有用。


0
投票

我在交叉验证时也遇到了这个错误,这是因为我的数据中仍然存在 NaN! 我发现这是因为交叉验证没有显示错误,所以我尝试在整个数据集上训练模型,而不进行交叉验证。

当我尝试 LogisticRegression().fit(X,y) 时,错误实际上显示为由数据中的 NaN 引起


-2
投票

当数据集中存在空值时,

cross_val_score
方法会返回
NaN

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


-2
投票

对于我使用

xtrain.values
ytrain.values
的作用是因为交叉验证需要输入是数组而不是数据帧。

© www.soinside.com 2019 - 2024. All rights reserved.