Классификационный отчет - Точность и F-оценка плохо определены - PullRequest
0 голосов
/ 11 января 2019

Я импортировал классификационный отчет из sklearn.metrics, и когда я ввел свой np.arrays в качестве параметров, я получил следующую ошибку:

/ USR / местные / Библиотека / python3.6 / Расс-пакеты / sklearn / метрики / classification.py: 1135: UndefinedMetricWarning: точность и F-оценка плохо определены и устанавливается на 0,0 в метках без прогнозируемых выборок. «Точность», «прогнозируемый», средний, warn_for) /usr/local/lib/python3.6/dist-packages/sklearn/metrics/classification.py:1137: UndefinedMetricWarning: Напоминание и F-оценка плохо определены и являются установите значение 0,0 в метках без истинных образцов. «вспомнить», «правда», средний, warn_for)

Вот код:

svclassifier_polynomial = SVC(kernel = 'poly', degree = 7, C = 5)

svclassifier_polynomial.fit(X_train, y_train)
y_pred = svclassifier_polynomial.predict(X_test)


poly = classification_report(y_test, y_pred)

Когда я не использовал np.array в прошлом, он работал просто отлично, есть идеи, как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Это не ошибка, просто предупреждение о том, что не все ваши метки включены в ваш y_pred, т. Е. В вашем y_test есть некоторые метки, которые ваш классификатор никогда не предсказывает.

Вот простой воспроизводимый пример:

from sklearn.metrics import precision_score, f1_score, classification_report

y_true = [0, 1, 2, 0, 1, 2] # 3-class problem
y_pred = [0, 0, 1, 0, 0, 1] # we never predict '2'

precision_score(y_true, y_pred, average='macro') 
[...] UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. 
  'precision', 'predicted', average, warn_for)
0.16666666666666666

precision_score(y_true, y_pred, average='micro') # no warning
0.3333333333333333

precision_score(y_true, y_pred, average=None) 
[...] UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. 
  'precision', 'predicted', average, warn_for)
array([0.5, 0. , 0. ])

Точно такие же предупреждения выдаются для f1_score (не показано).

Практически это только предупреждает вас, что в classification_report соответствующие значения для меток без прогнозируемых выборок (здесь 2) будут установлены в 0:

print(classification_report(y_true, y_pred))


              precision    recall  f1-score   support

           0       0.50      1.00      0.67         2
           1       0.00      0.00      0.00         2
           2       0.00      0.00      0.00         2

   micro avg       0.33      0.33      0.33         6
   macro avg       0.17      0.33      0.22         6
weighted avg       0.17      0.33      0.22         6

[...] 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)

Когда я не использовал np.array в прошлом, он работал просто отлично

Весьма сомнительно, поскольку в приведенном выше примере я использовал простые списки Python, а не массивы Numpy ...

0 голосов
/ 11 января 2019

Это означает, что некоторые метки присутствуют только в данных поезда, а некоторые метки присутствуют только в наборе тестовых данных. Запустите следующие коды, чтобы понять распределение меток поезда и теста.

from collections import Counter
Counter(y_train)
Counter(y_test)

Используйте stratified train_test_split, чтобы избавиться от ситуации, когда некоторые метки присутствуют только в тестовом наборе данных.

Возможно, это сработало в прошлом просто из-за случайного разделения набора данных. Следовательно, расслоение всегда рекомендуется.

Первая ситуация больше касается тонкой настройки модели или выбора модели.

...