Эта статья также включает способы отображения вашей матрицы путаницы.
Вступление
Показатели точности, отзыва, точности и 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, я был бы рад, если бы вы могли его проверить 😃
Ознакомьтесь с моим руководством о смещении, дисперсии и о том, как они связаны с недостаточной подгонкой и переобучением.
Смещение, отклонение и то, как они связаны с недостаточным соответствием, переобучением
Во время прохождения курса я наткнулся на термины« смещение , отклонение , недостаточное соответствие и переобучение . Условия казались устрашающими… в сторонуdatascience.com »
Свяжитесь со мной в LinkedIn
Первоначально опубликовано на https://realpythonproject.com 2 января 2021 г.