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什么都不清楚。谢谢