我正在尝试预测下一次客户购买我的工作。我遵循了指南,但是当我尝试使用 cross_val_score() 函数时,它返回 NaN 值。Google Colab 笔记本屏幕截图
变量:
代码:
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]
请帮助我!
我的情况有点不同。我使用
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,而不是抛出错误
我解决了我这边的问题。我使用的是自定义指标(曲线下面积精确召回率 (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"
。这将使您能够检测到错误。
谢谢大家的回答。安娜的回答对我帮助很大!,但我没有使用 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]
我知道这个问题已经得到解答,但对于其他仍然无法解决问题的人来说,这是给你的......
检查您的
y
数据类型是否为 int
。如果您的 nan
值的日期类型是 y
,它将返回
object
y.dtype
y = y.astype(int)
对于我的情况,我的 numpy 数组中有一个时间增量数据类型,导致了错误
我就面临这个问题。我是这样解决的;我将 X_train 和 y_train 转换为 DataFrame。
cross_val_score(model,X_train,y_train, cv = kfold,scoring = "accuracy")
在传递给 cross_val_score 之前尝试对分类列进行编码。这对我有用。
我在交叉验证时也遇到了这个错误,这是因为我的数据中仍然存在 NaN! 我发现这是因为交叉验证没有显示错误,所以我尝试在整个数据集上训练模型,而不进行交叉验证。
当我尝试 LogisticRegression().fit(X,y) 时,错误实际上显示为由数据中的 NaN 引起
当数据集中存在空值时,
cross_val_score
方法会返回NaN
。
使用可以处理缺失值的模型,或者从数据集中删除所有空值,然后重试。
对于我使用
xtrain.values
,ytrain.values
的作用是因为交叉验证需要输入是数组而不是数据帧。