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 是一个列表
代码:
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.values
、ytrain.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"
。这将使您能够检测到错误。
我正在尝试预测下一个客户对我工作的购买。我遵循了指南,但是当我尝试使用 cross_val_score() 函数时,它 returns 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]
请帮帮我!
谢谢大家的回答。 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.values
、ytrain.values
是因为交叉验证需要输入是数组而不是数据框。
我的情况有点不同。我使用 cross_validate
而不是 cross_val_score
和性能指标列表。在做一个 5 倍的 CV 时,我一直在为 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
原来,我愚蠢地包含了 '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
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"
。这将使您能够检测到错误。