Эта статья также включает способы отображения вашей матрицы путаницы.

Вступление

Показатели точности, отзыва, точности и F1 - это показатели, которые используются для оценки производительности модели. Хотя термины могут показаться сложными, их основные концепции довольно просты. Они основаны на простых формулах и легко рассчитываются.

В этой статье мы рассмотрим следующие вопросы по каждому термину.

  • Объяснение
  • Почему это актуально
  • Формула
  • Расчет без sklearn
  • Использование sklearn для его расчета

В конце урока мы рассмотрим матрицы путаницы и способы их представления. Я дал ссылку на Google Colab в конце статьи.

Данные 📈

Предположим, мы определяем, является ли электронное письмо спамом или нет.

У нас будет два массива, первый массив будет хранить фактическое значение, а второй массив будет хранить предсказанные значения. Эти прогнозируемые значения получены из модели классификатора. Тип модели не важен, нас интересуют прогнозы, сделанные нашей моделью.

# Actual Value
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
# Predicted Value
predictions = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]

0 - электронное письмо НЕ является спамом (отрицательное)

1 - электронная почта ЯВЛЯЕТСЯ спамом (положительный результат)

Ключевые термины 🔑

Истинно положительный ➕ ➕

Этот случай имеет место, когда метка положительна, и наше прогнозируемое значение также положительно. В нашем сценарии, когда электронное письмо является спамом, и наша модель также классифицирует его как спам.

TP = 0
for i in range(0,len(labels)):
    if labels[i] == predictions[i] and labels[i] == 1:
       TP+=1
print("True Positive: ", TP) # 3

Ложноположительный ➖ ➕

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

FP = 0
for i in range(0,len(labels)):
    if labels[i] == 0 and predictions[i] == 1:
       FP+=1
print("False Positive: ", FP) # 3

Истинно отрицательный ➖ ➖

Это похоже на True Positive, с той лишь разницей, что метка и прогнозируемое значение отрицательны. В нашем сценарии, когда электронное письмо не является спамом, и наша модель также классифицирует его как спам.

TN = 0
for i in range(0,len(labels)):
    if labels[i] == predictions[i] and labels[i] == 0:
       TN+=1
print("True Negative: ", TN) # 0

Ложноотрицательный ➕ ➖

Этот случай возникает, когда метка положительна, а прогнозируемое значение отрицательно. В некотором роде противоположное ложному положительному результату. В нашем сценарии, когда электронное письмо является спамом, но наша модель классифицирует его как не спам.

FN = 0
for i in range(0,len(labels)):
    if labels[i] == 1 and predictions[i] == 0:
       FN+=1
print("False Negative: ", FN) # 4

Правильный прогноз 💯

Единственным условием для этого случая является то, что метка и значение прогноза совпадают. В нашем случае, когда модель классифицирует спам-электронное письмо как спам, а не-спам-письмо как не-спам.

Правильный прогноз также можно рассчитать как сумму истинно положительных и истинно отрицательных результатов.

CP = 0
for i in range(0,len(labels)):
    if labels[i] == predictions[i]:
       CP+=1
print("Correct Prediction: ", CP) # 3
print(CP == TP + TN) # True

Неверный прогноз ❎

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

Неверный прогноз также можно рассчитать как сумму ложных срабатываний и ложных отрицательных результатов.

ICP = 0
for i in range(0,len(labels)):
    if labels[i] != predictions[i]:
       ICP+=1
print("Incorrect Prediction: ", ICP)# 7
print(ICP == FP + FN) # True

Точность 🎯

Точность - это отношение правильных прогнозов к общему количеству прогнозов. Это один из самых простых способов измерения модели. Мы должны стремиться к высокой точности нашей модели. Если модель имеет высокую точность, мы можем сделать вывод, что модель большую часть времени делает правильные прогнозы.

Без Sklearn

accuracy = (TP + TN)/(TP + FP + TN + FN)
print(accuracy*100) 

Со Sklearn

from sklearn.metrics import accuracy_score
print(accuracy_score(labels , predictions)*100)

Напомним 📲

Случай, когда точность может ввести в заблуждение

Иногда высокая точность может вводить в заблуждение. Рассмотрим сценарий ниже

labels = [0,0,0,0,1,0,0,1,0,0]
predictions = [0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0]
print(accuracy_score(labels , predictions)*100) # 80

Электронное письмо со спамом встречается редко по сравнению с электронным письмом без спама. В результате количество вхождений с меткой = 0 больше, чем с меткой = 1. В приведенном выше коде наш массив меток содержит 8 электронных писем без спама и 2 спама. Если наша модель построена таким образом, что она всегда классифицирует электронную почту как не спам, ее точность достигает 80%. Это сильно вводит в заблуждение, поскольку наша модель в основном не способна обнаруживать спам-сообщения.

Расчет показателя отзыва

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

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

Без Sklearn

recall = (TP)/(TP+FN)
print(recall*100)

Со Sklearn

from sklearn.metrics import recall_score
print(recall_score(labels,predictions))

Точность 🐾

Случай, когда показатель отзыва может ввести в заблуждение

Высокий уровень отзыва также может вводить в заблуждение. Рассмотрим случай, когда наша модель настроена так, чтобы всегда возвращать прогноз с положительным значением. По сути, он классифицирует все электронные письма как спам.

labels = [0,0,0,0,1,0,0,1,0,0]
predictions = [1,1,1,1,1,1,1,1,1,1]
print(accuracy_score(labels , predictions)*100)
print(recall_score(labels , predictions)*100)

Хотя приведенный выше случай будет иметь низкую точность (20%), он будет иметь высокий балл отзыва (100%).

Расчет точности

Точность - это отношение правильных положительных прогнозов к общему количеству положительных прогнозов.

В приведенном выше случае точность будет низкой (20%), поскольку модель предсказала всего 10 положительных результатов, из которых только 2 были правильными. Это говорит нам о том, что, хотя наша отзывчивость высока и наша модель хорошо работает в положительных случаях, например, в спам-сообщениях, она плохо работает с электронными письмами, не связанными со спамом.

Причина, по которой наша точность и точность равны, заключается в том, что модель предсказывает все положительные результаты. В реальном мире модель могла бы правильно предсказать некоторые отрицательные случаи, что привело бы к более высокой точности. Однако точность все равно останется неизменной, поскольку она зависит только от правильных положительных прогнозов и общих положительных прогнозов.

Без Sklearn

precision = TP/(TP+FP)
print(precision)

Со Sklearn

from sklearn.metrics import precision_score
print(precision_score(labels,predictions)*100)

Оценка F1 🚗

Оценка F1 зависит как от отзыва, так и от точности, это среднее гармоническое значение обоих значений.

Мы рассматриваем гармоническое среднее значение по сравнению со средним арифметическим, так как мы хотим, чтобы низкий уровень отзыва или точности давал низкий показатель F1. В нашем предыдущем случае, когда у нас был отзыв 100% и точность 20%, среднее арифметическое будет 60%, а среднее гармоническое - 33,33%. Среднее значение гармоники ниже и имеет больше смысла, поскольку мы знаем, что модель довольно плохая.

AM = (1 + 0.2)/2
HM = 2*(1*0.2)/(1+0.2)
print(AM)# 0.6
print(HM)# 0.333

Без Sklearn

f1 = 2*(precision * recall)/(precision + recall)
print(f1)

Со Sklearn

from sklearn.metrics import f1_score
print(f1_score(labels, predictions))

Матрица путаницы ❓

Матрица путаницы - это матрица, представляющая количество истинно положительных, ложноположительных, истинно отрицательных и ложно отрицательных результатов.

Предположим, мы работаем со следующими данными

# Actual Value
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
# Predicted Value
predictions = [0, 0, 1, 1, 1, 0, 1, 0, 1, 0]

Расчет матрицы неточностей с помощью sklearn

from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(labels, predictions)
FN = confusion[1][0]
TN = confusion[0][0]
TP = confusion[1][1]
FP = confusion[0][1]

Вы также можете передать параметр normalize, чтобы нормализовать вычисленные данные.

Отображение матрицы неточностей в виде гистограммы

plt.bar(['False Negative' , 'True Negative' , 'True Positive' , 'False Positive'],[FN,TN,TP,FP])
plt.show()

Отображение матрицы путаницы в виде тепловой карты

import seaborn as sns
sns.heatmap(confusion , annot=True , xticklabels=['Negative' , 'Positive'] , yticklabels=['Negative' , 'Positive'])
plt.ylabel("Label")
plt.xlabel("Predicted")
plt.show()

Отображение матрицы путаницы с помощью Pandas

import pandas as pd
data = {'Labels' : labels, 'Predictions': predictions}
df = pd.DataFrame(data, columns=['Labels','Predictions'])
confusion_matrix = pd.crosstab(df['Labels'], df['Predictions'], rownames=['Labels'], colnames=['Predictions'])
print (confusion_matrix)

Использование Sklearn для создания отчета о классификации 👔

from sklearn.metrics import classification_report
print(classification_report(labels,predictions))

Ниже вывод

Заключение

Сама по себе точность не может определить, является ли модель хорошей или плохой, но точность в сочетании с точностью, отзывчивостью и оценкой F1 может дать хорошее представление о характеристиках модели.

Ссылка на Google Colab



Недавно я создал блог на WordPress, я был бы рад, если бы вы могли его проверить 😃



Ознакомьтесь с моим руководством о смещении, дисперсии и о том, как они связаны с недостаточной подгонкой и переобучением.



Свяжитесь со мной в LinkedIn



Первоначально опубликовано на https://realpythonproject.com 2 января 2021 г.