Ошибка в наборе тестового отчета о классификации для машинного обучения с SVM в Python - PullRequest
0 голосов
/ 09 июля 2019

Я разбил данные на тестовые и обучающие наборы, оба из которых имеют целевые значения «0» и «1».Но после подгонки и прогнозирования с помощью SVM в отчете о классификации говорится, что в тестовом образце есть нули '0, что не соответствует действительности.

from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
df = pd.DataFrame(data = data['data'],columns=data['feature_names'])
x = df
y = data['target']
xtrain,xtest,ytrain,ytest 
= train_test_split(x,y,test_size=0.3,random_state=42)

Как вы можете видеть ниже, тест имеет 0 и 1, но поддержкав отчете о классификации говорится, что нет никаких нулей!

! (https://i.imgur.com/wjEjIvX.png)

1 Ответ

1 голос
/ 09 июля 2019

(это всегда хорошая идея включить ваш соответствующий код в пример, а не в изображениях)

в отчете о классификации говорится, что в тестовом образце есть нули '0, что не соответствует действительности.

Это потому, что из вашего кода в связанном изображении оказывается, что вы переключили аргументы в classification_report; Вы использовали:

print(classification_report(pred, ytest)) # wrong order of arguments

что действительно дает:

             precision    recall  f1-score   support

    class 0       0.00      0.00      0.00         0
    class 1       1.00      0.63      0.77       171

avg / total       1.00      0.63      0.77       171

но правильное использование (см. документы ):

print(classification_report(ytest, pred)) # ytest first

что дает

             precision    recall  f1-score   support

    class 0       0.00      0.00      0.00        63
    class 1       0.63      1.00      0.77       108

avg / total       0.40      0.63      0.49       171

вместе со следующим предупреждением:

C: \ Users \ Root \ Anaconda3 \ envs \ tensorflow1 \ Lib \ сайт-пакеты \ sklearn \ Метрики \ classification.py: 1135: UndefinedMetricWarning: точность и F-оценка плохо определены и устанавливается на 0,0 в метках без прогнозируемых выборок. «Точность», «прогнозируемый», средний, warn_for)

потому что, как уже указывалось в комментариях, вы прогнозируете только 1:

pred
# result:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

Причиной этого является другая история, а не часть текущего вопроса.

Вот полный воспроизводимый код для вышеуказанного:

from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
xtrain,xtest,ytrain,ytest = train_test_split(X,y,test_size=0.3,random_state=42)

from sklearn.svm import SVC
svc=SVC()
svc.fit(xtrain, ytrain)
pred = svc.predict(xtest)

print(classification_report(ytest, pred))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...