sklearn cross_val_score()返回NaN值

时间:2020-02-11 15:36:43

标签: python nan prediction cross-validation sklearn-pandas

我正在尝试预测下一位要购买我的客户的人。我遵循了指南,但是当我尝试使用cross_val_score()函数时,它将返回NaN值。Google Colab notebook screenshot

变量:

  • 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]

请帮助我!

6 个答案:

答案 0 :(得分:1)

我的情况有点不同。我使用 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

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

答案 1 :(得分:0)

非常感谢大家的回答。安娜的答案对我很有帮助!但是我没有使用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]

答案 2 :(得分:0)

当数据集中存在空值时,cross_val_score方法将返回NaN

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

album_len = dict(
    sorted(album_len.items(), key=lambda i: convert_to_datetime(i[1]),
           reverse=True)
)

答案 5 :(得分:-1)

对于我使用 xtrain.values , ytrain.values 起作用,因为交叉验证需要输入是数组而不是数据框。