Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UndefinedMetricWarning:F分数定义不清,在没有预测样本的标签中设置为0.0_Python_Scikit Learn - Fatal编程技术网

Python UndefinedMetricWarning:F分数定义不清,在没有预测样本的标签中设置为0.0

Python UndefinedMetricWarning:F分数定义不清,在没有预测样本的标签中设置为0.0,python,scikit-learn,Python,Scikit Learn,我得到了一个奇怪的错误: 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='

我得到了一个奇怪的错误:

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
另外,为什么会有一条“精度”、“预测值”、“平均值”、“警告值”的错误消息?没有开括号,为什么以右括号结尾?我正在Windows10上的conda环境中使用Python 3.6.0运行sklearn 0.18.1


我也看了一下,不知道是不是同一个bug。这也没有解决方案。

如注释中所述,
y\u test
中的一些标签没有出现在
y\u 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')
,没有办法避免第一次看到此警告。您可以做的是确定您对未预测的标签分数不感兴趣,然后明确指定您感兴趣的标签(这些标签至少预测了一次):


本例中未显示警告。

如错误消息所述,用于获取F分数的方法来自sklearn的“分类”部分,因此,这里所说的“标签”

你有回归问题吗?Sklearn为“特征选择”组下的回归提供了“F分数”方法:


如果您确实有分类问题,@Shovalt的答案在我看来似乎是正确的。

公认的答案已经很好地解释了为什么会出现警告。如果您只是想控制警告,可以使用。它为提供了一个(半官方)参数
warn\u,可用于使警告静音

(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
                                                        average='weighted', 
                                                        warn_for=tuple())

正如一些评论中已经提到的,请谨慎使用。

根据@Shovalt的回答,但简而言之:

或者,您可以使用以下代码行

    from sklearn.metrics import f1_score
    metrics.f1_score(y_test, y_pred, labels=np.unique(y_pred))

这将删除您的警告并提供您想要的结果,因为它不再使用唯一模式考虑集合之间的差异。

在我训练分类模型时,同样的问题也发生在我身上。 导致此问题的原因是警告消息所说的“在没有预测样本的标签中”,它将在计算f1分数时导致零除法。 我在阅读文档时发现了另一个解决方案,注意如下:

当真阳性+假阳性==0时,精度未定义;当真阳性+假阴性==0时,召回未定义。在这种情况下,默认情况下,度量将设置为0,f分数也将设置为0,并且将引发UndefinedMetricWarning。可以使用零除法修改此行为

zero\u division
默认值为
“warn”
,您可以将其设置为
0
1
,以避免
未定义度量警告。

它对我有用;)哦,等等,当我使用
zero\u division
时,还有一个问题,我的sklearn报告使用scikit learn 0.21.3时没有这样的关键字参数。只需通过运行
pip install scikit learn-U

将您的sklearn更新至最新版本,因为我注意到此错误发生在两种情况下

  • 如果已使用train_test_split()分割数据,则必须确保重置数据的索引(特别是在使用pandas series对象时):应重置y_train,y_测试索引。问题是当您尝试使用sklearn.metrics中的一个分数时,例如;精度分数,这将尝试匹配从train_test_split()获得的y_测试的无序索引 因此,可以使用np.array(y_test)表示y_分数为真,也可以使用y_test.reset_索引(drop=true)

  • 如果预测的“真阳性”为0,则仍然可能出现此错误,这用于精度、召回率和f1_分数。您可以使用混淆矩阵将其可视化。如果分类为多标签,并且您设置了param:average='weighted'/micro/macro,那么只要矩阵中的对角线不是0,您就会得到答案

  • 希望这有帮助

    我在这里也犯了同样的错误,但在读了@Shovalt的答案后,我意识到我的测试/训练分数很低。我一开始有一个很大的数据集,但我把它分成了几个小组,其中一个小组相当小。通过加大样本量,这个警告消失了,我得到了我的f1分数。 由此

    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
    
    对此

    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    

    y_true中有一些标签没有出现在y_pred中,因此它是不健康的-defined@VivekKumar我也收到了同样的警告。我有一个平衡的数据集(500+500),这个警告似乎是在
    clf=GridSearchCV(SVC(C=2),调优的参数,cv=cv,scoring='f1')clf.fit(X\u序列,y\u序列)
    阶段出现的。看看是什么导致了警告或如何纠正它会很好。你指出回归和分类之间的区别是正确的,但我从问题中的
    y_test
    y_pred
    的离散性得出结论,这是一个分类问题。这是一个很好的答案,但我要注意不要选择使用
    unique(y_pred)
    计算f1分数,因为这可能会产生误导性的sc
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)