Я импортировал классификационный_отчет из sklearn.metrics, и когда я ввожу свои np.arrays
качестве параметров, я получаю следующую ошибку:
/usr/local/lib/python3.6/dist-packages/sklearn/metrics/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, он работал нормально, есть идеи, как я могу это исправить?
Это не ошибка, просто предупреждение, что не все ваши метки включены в 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...
Это означает, что некоторые метки присутствуют только в данных поезда, а некоторые метки присутствуют только в наборе тестовых данных. Запустите следующие коды, чтобы понять распределение меток поезда и теста.
from collections import Counter
Counter(y_train)
Counter(y_test)
Используйте стратифицированный train_test_split, чтобы избавиться от ситуации, когда некоторые метки присутствуют только в тестовом наборе данных.
В прошлом это могло сработать просто из-за случайного разделения набора данных. Следовательно, расслоение всегда рекомендуется.
Первая ситуация больше касается тонкой настройки модели или выбора модели.