Scikit learn sklearn auc ValueError:y_true中仅存在一个类

Scikit learn sklearn auc ValueError:y_true中仅存在一个类,scikit-learn,Scikit Learn,我搜索了谷歌,看到了一些关于这个错误的StackOverflow帖子。这不是我的案子 我使用keras来训练一个简单的神经网络,并对分割的测试数据集进行一些预测。但是,当使用roc\u auc\u得分计算auc时,我得到了以下错误: “ValueError:y_true中只存在一个类。在这种情况下,ROC AUC分数未定义。” 我检查了目标标签的分布,它们是高度不平衡的。某些标签(总共29个标签)只有一个实例。因此,测试标签中可能没有阳性标签实例。因此sklearn的roc_auc_score函

我搜索了谷歌,看到了一些关于这个错误的StackOverflow帖子。这不是我的案子

我使用keras来训练一个简单的神经网络,并对分割的测试数据集进行一些预测。但是,当使用
roc\u auc\u得分计算auc时,我得到了以下错误:

“ValueError:y_true中只存在一个类。在这种情况下,ROC AUC分数未定义。”

我检查了目标标签的分布,它们是高度不平衡的。某些标签(总共29个标签)只有一个实例。因此,测试标签中可能没有阳性标签实例。因此sklearn的
roc_auc_score
函数报告了唯一的一个类问题。这是合理的

但我很好奇,因为当我使用sklearn的
cross\u val\u score
函数时,它可以毫无错误地处理AUC计算

my_metric = 'roc_auc' 
scores = cross_validation.cross_val_score(myestimator, data,
                                   labels, cv=5,scoring=my_metric)
我想知道
交叉验证分数
中发生了什么,是因为
交叉验证分数
使用分层交叉验证数据分割吗


更新
我继续挖掘,但仍然找不到背后的区别。我看到cross\u Valu score调用
check\u score(估计员,score=None,allow\u None=False)
返回一个记分员,
check\u score
将调用
get\u scorer(scorer)
,它将返回
scorer=SCORERS[得分]

评分员['roc_auc']
roc_auc_评分员

roc\u auc\u记分员是由

roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True,
                                 needs_threshold=True)

所以,它仍然使用roc_auc_分数函数。我不明白为什么cross_val_score与直接调用roc_auc_score表现不同。

我认为你的直觉是正确的。AUC(ROC曲线下的面积)需要足够数量的任何一个类别才能有意义

默认情况下,
cross\u val\u score
会分别计算性能指标。另一种选择是进行交叉预测,并计算所有褶皱组合的AUC

你可以这样做:

从sklearn.metrics导入roc\u auc\u分数
从sklearn.cross\u验证导入cross\u val\u预测
从sklearn.linear_模型导入逻辑回归
从sklearn.dataset导入make_分类
类别概率估计(逻辑回归):
"""
需要这个小技巧,因为“cross\u val\u”`
在内部使用'estimator.predict(X)`。
用您喜欢的任何分类器替换“LogisticRegression”。
"""
def预测(自我,X):
返回超级(self.\uuuuuuuuuuuuuuuuuuuuuuu类,self).预测概率(X)[:,1]
#一些示例数据
十、 y=进行分类()
#定义你的估计器
估计量=概率估计量()
#得到预测
pred=交叉价值预测(估计量,X,y,cv=5)
#计算AUC分数
roc_auc_得分(y,pred)

什么是
my_metric
?@maxymoo我使用字符串
roc_auc
,它是一个有效值。如果进行交叉验证,并且一种标签太少,则某些折叠可能没有任何此类标签。尝试减少折叠次数并确保使用分层抽样。我遇到了完全相同的问题,我认为问题实际上与交叉验证分割有关!“”>/usr/local/lib/python2.7/dist packages/sklearn/model_selection/_validation.py(131)cross_val_score()129 130 cv=check_cv(cv,y,classifier=is_classifier(estimator))->131 cv_iter=list(cv.split(X,y,groups))生成以下cv_iter:ipdb>np.count非零(y[cv_iter[0][[1],1])2 ipdb>np.count_nonzero(y[cv_iter[2][1],1])0无负,例如,对于第三次拆分,几乎可以肯定您已经解决了问题,但我最近遇到了同样的问题,原因很简单:默认情况下,cross_val_score使用随机交叉验证,从理论上讲,这两个类都有足够数量用于auc计算的非零概率。我不知道您使用了哪个拆分器,但它可能类似于TimeSeriesSplit。从定义上讲,这不是洗牌。此后,对于不平衡的数据集,此拆分可以为某些特定折叠生成同一类的所有实例。