Python Scikit学习错误消息';精度和F分数定义不清,在标签'中设置为0.0;

Python Scikit学习错误消息';精度和F分数定义不清,在标签'中设置为0.0;,python,scikit-learn,classification,Python,Scikit Learn,Classification,我正在研究一个二进制分类模型,分类器是朴素贝叶斯。我有一个几乎平衡的数据集,但是当我预测时,我得到以下错误消息: 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的grids

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

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和随机种子,这些模型工作得非常好。数据从外部摄取到数据帧中,随机化,种子固定。然后,NaiveBayes分类模型在该代码段之前的开始处对文件进行分类

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“强迫”我改变序列的形状,也许这就是罪魁祸首?

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

一旦意识到这一点,您可以选择通过以下方式禁用警告:

导入警告
导入sklearn.exceptions
警告.FilterWarning(“忽略”,类别=sklearn.exceptions.UndefinedMetricWarning)

警告的含义

正如这里的其他答案所表明的那样,您会遇到一种情况,即由于其定义(精度/召回率等于0),无法计算精度
F分数
。在这种情况下,度量的得分值为0

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

您使用的是
K-Fold
(特别是在您的案例中
K=10
),这意味着一个特定的拆分可能包含一个类的0个样本

即使使用分层K折叠,仍会发生

这有点棘手。分层K-折叠确保在每次拆分中每个类的相同部分。然而,这不仅仅取决于实际的类。 例如,精度的计算如下:
TP/predicted yes
。如果出于某种原因,您预测的所有样本均为“否”,则您的预测结果将为“是”
predicted yes=0
,这将导致未定义的精度(这可能导致未定义的
F-分数

这听起来像是一个边缘情况,但是要考虑的事实是,在网格搜索中,你可能在寻找很多不同的组合,有些组合可能完全关闭,并导致这样的场景。


我希望这能回答你的问题

您学习使用哪个版本的scikit@OAK@Farseer版本0.17。我读到在以前的版本中有一个bug,不确定在这个版本中是否也有。这个警告意味着,对于一些tp+fp为零的样本,精度和f1分数是未定义的,这在计算该样本的精度时会导致0/0。因为f1分数是精度的函数,所以它也是未定义的,并且库将两者都设置为0.0。@如果下面的答案满足,您可以标记为已回答吗?否则,lmk什么都不清楚。谢谢