Я'м получаю эту странную ошибку:
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)`
но потом он также печатает Ф-забьет первый раз, когда я запускаю:
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
Кроме того, почему там в конце 'точности', 'предсказал', средний, warn_for)
сообщение об ошибке? Нет открывающей скобки, так почему она заканчивается закрывающей скобки? Я с помощью Python sklearn 0.18.1 3.6.0 в среде стадион conda на Windows 10.
Я также посмотрел на здесь и я не'т знаю, если это'с той же ошибкой. Это [так] Сообщение2 Не'т иметь решение.
Как уже упоминалось в комментариях, некоторые надписи в y_true Дон'т появляются в y_pred. Конкретно в данном случае, ярлык '2' никогда не предсказывал:
>>> set(y_test) - set(y_pred)
{2}
Это означает, что нет Ф-результат расчета по этой этикетке, и, таким образом, F-оценка в этом случае считается 0.0. Так как вы просили в среднем результат, необходимо учитывать, что оценка 0 была включена в расчет, и поэтому пакет scikit-узнать, показывающие вам, что предупреждение.
Это подводит меня к вам не вижу ошибку во второй раз. Как я уже упоминал, это предупреждение, который трактуется по-разному из-за ошибки в Python. Поведение по умолчанию в большинстве сред-показать конкретное предупреждение только один раз. Это поведение может быть изменено:
import warnings
warnings.filterwarnings('always') # "error", "ignore", "always", "default", "module" or "once"
Если вы установите это, прежде чем импортировать другие модули, вы увидите предупреждение каждый раз, когда вы запустите код.
Нет никакого способа, чтобы не видеть это предупреждение в первый раз, помимо установки предупреждения.filterwarnings('игнор')`. То, что вы можете сделать, это решить, что вы не заинтересованы в десятки надписей, которые не были предсказаны, а затем явно указать надписи, которые Вы являются интересно (что метки, которые были предсказаны по крайней мере один раз):
>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078
Предупреждение не показано в этом случае.
В качестве альтернативы вы могли бы использовать следующий код
from sklearn.metrics import f1_score
metrics.f1_score(y_test, y_pred, labels=np.unique(y_pred))
Это должно удалить ваше предупреждение и дать вам результат, который вы хотели
Принято отвечать уже хорошо объясняет, почему предупреждение возникает. Если вы просто хотите контролировать предупреждения, можно использовать precision_recall_fscore_support
. Он предлагает (официоз) аргумент warn_for
, которые могут быть использованы для отключения предупреждений.
(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
average='weighted',
warn_for=tuple())
Как уже упоминалось в некоторых комментариях, используйте это с осторожностью.
Как говорится в сообщении об ошибке, метод, используемый, чтобы получить результат F от С "классификации" в рамках sklearn - таким образом, говорить о том, что "ярлыки" по.
Есть ли у вас проблемы регрессии? Sklearn предоставляет на "Ф забить на" Метод регрессии в графе "выбор компонентов" и группы: http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html
В случае, если у вас есть проблемы классификации, @Shovalt'ы ответ кажется правильным для меня.