Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]

Posted

技术标签:

【中文标题】Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]【英文标题】:Scikit learn Error Message 'Precision and F-score are ill-defined and being set to 0.0 in labels' [duplicate] 【发布时间】:2016-05-15 12:03:10 【问题描述】:

我正在研究二进制分类模型,分类器是朴素贝叶斯。我有一个几乎平衡的数据集,但是当我预测时收到以下错误消息:

UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)

我正在使用带有 CV k-fold 10 的 gridsearch。测试集和预测包含这两个类,所以我不明白这个消息。我正在为其他 6 个模型处理相同的数据集、训练/测试拆分、cv 和随机种子,并且这些模型运行良好。数据从外部摄取到数据帧中,随机化并固定种子。然后朴素贝叶斯分类模型类在这段代码sn-p之前的文件开头。

X_train, X_test, y_train, y_test, len_train, len_test = \
     train_test_split(data['X'], data['y'], data['len'], test_size=0.4)
pipeline = Pipeline([
    ('classifier', MultinomialNB()) 
])

cv=StratifiedKFold(len_train, n_folds=10)

len_train = len_train.reshape(-1,1)
len_test = len_test.reshape(-1,1)

params = [
  'classifier__alpha': [0, 0.0001, 0.001, 0.01]

]

grid = GridSearchCV(
    pipeline,
    param_grid=params,
    refit=True,  
    n_jobs=-1, 
    scoring='accuracy',
    cv=cv, 
)

nb_fit = grid.fit(len_train, y_train)

preds = nb_fit.predict(len_test)

print(confusion_matrix(y_test, preds, labels=['1','0']))
print(classification_report(y_test, preds))

我被python“强迫”改变了系列的形状,也许这就是罪魁祸首?

【问题讨论】:

你用的是什么版本的 scikit-learn?@OAK @Farseer 0.17 版。我读到以前的版本有一个错误,不知道这个版本是否也有。 此警告意味着对于某些 tp + fp 为零的样本,精度以及 f1 分数未定义,这在计算该样本的精度时会导致 0 / 0。因为 f1 分数是精度函数,所以它也是未定义的,并且都被库设置为 0.0。 @OAK 如果满足以下答案,您可以标记为已回答吗?否则,lmk什么都不清楚。谢谢。 【参考方案1】:

警告的含义

正如此处的其他答案所建议的那样,您会遇到精度 F-Score 由于其定义(精度/召回率等于 0)而无法计算的情况。在这种情况下,指标的得分值为 0。

测试数据包含所有标签,为什么还会出现这种情况?

好吧,您使用的是K-Fold(特别是在您的情况下为k=10),这意味着一个特定的拆分可能包含一个类的0个样本

仍然会发生,即使使用分层 K-Fold

这有点棘手。分层 K-Fold 确保每次拆分中每个类的相同部分。然而,这不仅仅取决于真实的类。 例如,Precision 的计算方式如下:TP/predicted yes。如果由于某种原因,您预测所有样本都为 No,那么您将得到 predicted yes=0,这将导致未定义的精度(这可能导致未定义的 F-Score)。

这听起来像是一种边缘情况,但考虑到在网格搜索中,您可能正在搜索一大堆不同的组合,其中一些可能完全关闭,并导致这种情况。

我希望这能回答你的问题!

【讨论】:

【参考方案2】:

正如 aadel 所评论的,当没有数据点被归类为正时,精度除以零,因为它被定义为 TP / (TP + FP)(即,真阳性 / 真和误报)。库然后将精度设置为 0,但会发出警告,因为实际上该值是未定义的。 F1 取决于精度,因此也没有定义。

一旦您意识到这一点,您可以选择禁用警告:

import warnings
import sklearn.exceptions
warnings.filterwarnings("ignore", category=sklearn.exceptions.UndefinedMetricWarning)

【讨论】:

以上是关于Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pip 在安装 scikit-learn 时会出现权限被拒绝的错误?

Python 中的 Scikit-learn(svm 函数)

在 scikit-learn 中运行 Randomforest 的 MemoryError

kmeans scikit-learn 教程

scikit-learn 的 Pip 安装:未找到匹配的发行版。 [复制]

在 ipython/Jupyter notebook 中导入 scikit-learn