Проблемы с матрицей точности, отзыва и путаницы в sklearn

Я обучил модель в keras и сделал несколько прогнозов. Чтобы оценить производительность моей модели, я рассчитал показатели точности и полноты, а также матрицу путаницы с помощью библиотеки sklearn. Это мой код:

final_predictions = model.predict_generator(generator_test, steps=steps_per_epoch_test)
rounded_pred = [0 if x<=0.5 else 1 for x in final_predictions]
test_precision_score = round(precision_score(y_test, rounded_pred), 3)
test_recall_score = round(recall_score(y_test, rounded_pred), 3)
test_confusion_matrix = confusion_matrix(y_test, rounded_pred)

Это мои результаты:

Test confusion matrix :

 [[1555   13]

 [   9   49]]

Precision and recall:

Test Precision :: 0.845
Test Recall :: 0.79

Кто-нибудь знает, почему оценка точности рассчитывается неправильно? (Должно быть (1555/(1555+13) вместо (13/(13+49)))

Вы пробовали переключать аргументы confusion_matrix(). Мне кажется, что точность и полнота рассчитываются с 49, рассматриваемыми как истинно положительные, а не как истинно отрицательные.

jv3768 22.05.2019 12:01
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
0
1
1 067
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию pos_label из precision_score и recall_score равны 1.

from sklearn.metrics import confusion_matrix,precision_score,recall_score,classification_report

y_true = [0]*1568 + [1]*58
y_pred = [0]*1555 + [1]*13 + [0]* 9+ [1]* 49

print('confusion matrix :\n',confusion_matrix(y_true,y_pred))
print('precision_score :\n',precision_score(y_true,y_pred,pos_label=1))
print('recall_score :\n',recall_score(y_true,y_pred,pos_label=1))
print('classification_report :\n',classification_report(y_true,y_pred))

confusion matrix :
 [[1555   13]
 [   9   49]]
precision_score :
 0.7903225806451613
recall_score :
 0.8448275862068966
classification_report :
               precision    recall  f1-score   support

           0       0.99      0.99      0.99      1568
           1       0.79      0.84      0.82        58

   micro avg       0.99      0.99      0.99      1626
   macro avg       0.89      0.92      0.90      1626
weighted avg       0.99      0.99      0.99      1626

Если вы хотите получить precision_score и recall_score из label=1. Вы можете установить pos_label=0, чтобы установить класс.

print('precision_score :\n',precision_score(y_true,y_pred,pos_label=0))
print('recall_score :\n',recall_score(y_true,y_pred,pos_label=0))

precision_score :
 0.9942455242966752
recall_score :
 0.9917091836734694

Спасибо за ваш ответ, но при установке python label=0 я получаю неверные результаты для оценки отзыва. Я получаю 0,991, а должно быть 0,844.

Negreanu 22.05.2019 15:01

@Negreanu 0.8448 — это показатель отзыва для label=1. Вы можете увидеть classification_report в ответе.

giser_yugang 22.05.2019 15:05

О, да! Спасибо!

Negreanu 22.05.2019 15:30

Разве это не «Если вы хотите получить точность_оценки и отзыв_оценки для метки = 0. Вы можете установить pos_Label = 0, чтобы установить класс»? вместо метки=1? Я запутался. Однако фрагменты кода точны.

Simon Provost 19.02.2022 15:01

Другие вопросы по теме