我收到这个奇怪的错误:
classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for)`
但是在我第一次运行时,它也会打印f分数:
metrics.f1_score(y_test, y_pred, average='weighted')
我第二次跑步,它提供的分数没有错误。这是为什么?
>>> y_pred = test.predict(X_test) >>> y_test array([ 1, 10, 35, 9, 7, 29, 26, 3, 8, 23, 39, 11, 20, 2, 5, 23, 28, 30, 32, 18, 5, 34, 4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20, 18, 27, 39, 20, 37, 17, 31, 29, 36, 7, 6, 24, 37, 22, 30, 0, 22, 11, 35, 30, 31, 14, 32, 21, 34, 38, 5, 11, 10, 6, 1, 14, 12, 36, 25, 8, 30, 3, 12, 7, 4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23, 12, 19, 19, 3, 2, 31, 30, 11, 2, 24, 19, 27, 22, 13, 6, 18, 20, 6, 34, 33, 2, 37, 17, 30, 24, 2, 36, 9, 36, 19, 33, 35, 0, 4, 1]) >>> y_pred array([ 1, 10, 35, 7, 7, 29, 26, 3, 8, 23, 39, 11, 20, 4, 5, 23, 28, 30, 32, 18, 5, 39, 4, 25, 0, 24, 13, 21, 38, 19, 33, 33, 16, 20, 18, 27, 39, 20, 37, 17, 31, 29, 36, 7, 6, 24, 37, 22, 30, 0, 22, 11, 35, 30, 31, 14, 32, 21, 34, 38, 5, 11, 10, 6, 1, 14, 30, 36, 25, 8, 30, 3, 12, 7, 4, 10, 15, 12, 4, 22, 26, 29, 14, 37, 23, 12, 19, 19, 3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13, 6, 18, 20, 6, 39, 33, 9, 37, 17, 30, 24, 9, 36, 39, 36, 19, 33, 35, 0, 4, 1]) >>> metrics.f1_score(y_test, y_pred, average='weighted') C:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for) 0.87282051282051276 >>> metrics.f1_score(y_test, y_pred, average='weighted') 0.87282051282051276 >>> metrics.f1_score(y_test, y_pred, average='weighted') 0.87282051282051276
另外,为什么会有尾随'precision', 'predicted', average, warn_for)错误消息?没有开放的括号,为什么它以封闭的括号结尾?我在Windows 10的conda环境中使用Python 3.6.0运行sklearn 0.18.1。
'precision', 'predicted', average, warn_for)
如注释中所述,y_true中的某些标签未出现在y_pred中。特别是在这种情况下,永远不会预测标签“ 2”:
>>> set(y_test) - set(y_pred) {2}
这意味着该标签没有要计算的F分数,因此这种情况下的F分数被认为是0.0。由于您要求获得平均分数,因此您必须考虑到计算中包括了0分,这就是scikit- learn向您显示该警告的原因。
这给我带来了您第二次看不到该错误。如前所述,这是一个 警告 ,与python中的错误不同。在大多数环境中,默认行为是仅显示一次特定警告。可以更改此行为:
import warnings warnings.filterwarnings('always') # "error", "ignore", "always", "default", "module" or "once"
如果在导入其他模块之前进行了设置,则每次运行代码时都会看到警告。
除了设置之外,没有其他方法可以避免第一次看到此警告warnings.filterwarnings('ignore')。你有什么 可以 做的,就是决定你是不是在没有预测标签的分数感兴趣,然后明确指定标签 的 兴趣(其中至少有一次是预测标签):
warnings.filterwarnings('ignore')
>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred)) 0.91076923076923078
在这种情况下,不会显示警告。