UndefinedMetricWarning: F-score не определен и устанавливается на 0.0 в меток без прогнозируемых выборок

Я получаю эту странную ошибку:

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)? Открытой скобки нет, так почему же она заканчивается закрывающей скобкой? Я запускаю sklearn 0.18.1 с использованием Python 3.6.0 в среде conda на Windows 10.

Я также посмотрел здесь, и я не знаю, если это та же ошибка. Этот пост также не имеет решения.

Ответ 1

Как упоминалось в комментариях, некоторые ярлыки в 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'). Что вы можете сделать, решает, что вас не интересует множество меток, которые не были предсказаны, а затем явно укажите интересующие вас метки (которые являются метками, которые были предсказаны хотя бы один раз):

>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078

В этом случае предупреждение не отображается.

Ответ 2

Как указано в сообщении об ошибке, метод, используемый для получения оценки F, относится к части "Классификация" sklearn - таким образом, речь идет о "метках".

У вас проблема с регрессией? Sklearn предоставляет метод "F score" для регрессии в группе "feature selection": http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html

Если у вас есть проблема классификации, ответ @Shovalt кажется мне правильным.