Этот блог является продолжением этого поста.
До сих пор вы проходили метрики бинарной классификации. с этого момента мы изучим метрики для многоклассовой классификации, а в следующей статье вы изучите многоуровневую классификацию и ее метрики.
Мультиклассовая классификация — это не что иное, как решение проблемы классификации, когда у нас есть несколько классов (количество классов › 2) в целевом столбце. Например, классификация изображений фруктов на яблоки, апельсины и бананы.
Прикрепляю пример набора данных здесь. В этом наборе данных столбец индекса развития является целью, которая имеет несколько классов (количество классов › 2).
Поскольку мы изучили метрики в метриках бинарной классификации, с их помощью мы можем сделать метрики мультиклассификации.
Существует 3 реализации каждой метрики бинарной классификации в метриках мультиклассификации. Вы можете понять, когда я пишу их…
Для метрики точной бинарной классификации в метриках мультиклассификации у нас есть три версии:
- Микроусредненная точность
- Макроусредненная точность
- Взвешенная точность
в качестве точности у нас есть 3 версии метрики бинарной классификации отзыва в многоклассовой классификации.
- Микроусредненный отзыв
- Усредненный отзыв макроса
- Взвешенный отзыв
Как и выше, мы можем классифицировать каждую метрику двоичной классификации как 3 версии и называть их метриками мультиклассификации.
А пока я собираюсь обсудить точность и добавить код отзыва, а все остальные метрики будут построены таким же образом (такая же процедура используется для точности ниже). В следующем посте я покажу вам, как сформировать ROC-AUC в многоклассовой классификации.
Примечание: - Не прыгайте ни во что, если вы не знаете основ. потому что это может съесть вашу уверенность и веру.
Давайте обсудим 3 версии точности….
- Микроусредненная точность. Здесь, во-первых, мы собираемся найти все истинные положительные результаты для всех классов и просуммировать их, чтобы получить общее количество истинных положительных результатов для всех классов. после этого мы найдем все ложные срабатывания для всех классов и просуммируем их, чтобы получить общее количество ложных срабатываний для всех классов. Теперь рассчитайте точность для общего количества истинных срабатываний и ложных срабатываний.
2. Макроусредненная точность: здесь мы найдем точности для разных классов в целевом столбце, а затем усредним их, чтобы получить окончательную точность.
3. Взвешенная точность: здесь взвешенная точность такая же, как и макроусредненная точность, но разница здесь в том, что она зависит и взвешивается на основе количества выборок, присутствующих в каждом классе.
Я знаю, я дал небольшие определения для каждого, Но это определения и код все объясняют. Итак, проверьте определение и посмотрите на необходимый код для определения и узнайте, что происходит в коде, вы все поймете.
Имейте в виду, что когда данные сбалансированы, мы можем использовать версию Macro, но когда данные несбалансированы, Micro и взвешенные версии предпочтительнее.
Обратите внимание, что приведенный ниже код состоит из всех трех версий точности.
import pandas import argparse import numpy from collections import Counter from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn import metrics #there are 3 Types of precision in case of Multi-class classification. #1. Macro averaged precision #2. Micro averaged precision #3. Weighted precision def true_positive(y_true, y_pred): tp = 0 for yt, yp in zip(y_true, y_pred): if yt == 1 and yp == 1: tp += 1 return tp def true_negative(y_true, y_pred): tn = 0 for yt, yp in zip(y_true, y_pred): if yt == 0 and yp == 0: tn += 1 return tn def false_positive(y_true, y_pred): fp = 0 for yt, yp in zip(y_true, y_pred): if yt == 0 and yp == 1: fp += 1 return fp def false_negative(y_true, y_pred): fn = 0 for yt, yp in zip(y_true, y_pred): if yt == 1 and yp == 0: fn += 1 return fn def precision(y_test, y_pred): tp =true_positive(y_test, y_pred) fp = false_positive(y_test, y_pred) try: return(tp/(tp+fp)) except ZeroDivisionError: return 0 def Macro_averaged_precision(y_test, predictions): precisions = [] for i in range(1,5): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] print(temp_ypred) print(temp_ytest) prec = precision(temp_ytest, temp_ypred) precisions.append(prec) return (sum(precisions)/len(precisions)) def Micro_averaged_precision(y_test, predictions): tp = 0 fp = 0 for i in range(1,5): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] tp += true_positive(temp_ytest, temp_ypred) fp += false_positive(temp_ytest, temp_ypred) precisions = tp / (tp + fp) return precisions def weighted_precision(y_test, predictions): num_classes = len(numpy.unique(y_test)) #coutns for every class precision = 0 for i in range(1, num_classes): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] tp = true_positive(temp_ytest, temp_ypred) fp = false_positive(temp_ytest, temp_ypred) try: preai = tp / (tp+fp) except ZeroDivisionError: preai = 0 weighted = preai*sum(temp_ytest) precision += weighted precision = precision/len(y_test) return precision if __name__ == "__main__": data = pandas.read_csv("C:\\Users\\iamvi\\OneDrive\\Desktop\\Metrics_in_Machine_Learning\\development-index\\Development Index.csv") train = data.drop(['Development Index'], axis = 1).values test = data["Development Index"].values model = LogisticRegression() X_train, X_test, y_train, y_test = train_test_split(train, test, stratify = test) model.fit(X_train, y_train) predictions = model.predict(X_test) print("Macro precision is:", Macro_averaged_precision(y_test, predictions)) print("Micro precision is:", Micro_averaged_precision(y_test, predictions)) print("Weighted precision is:", weighted_precision(y_test, predictions)) print("sklearn Macro", metrics.precision_score(y_test, predictions, average = "macro")) print("sklearn Micro", metrics.precision_score(y_test, predictions, average = "micro")) print("sklearn weighted", metrics.precision_score(y_test, predictions, average = "weighted"))
Вам может быть трудно увидеть код из-за непоследовательных отступов из-за среднего интерфейса, нажмите здесь, чтобы увидеть код в Github.
Вот как все метрики мультиклассовой классификации создаются из метрик бинарной классификации.
Как я уже сказал, я дам вам код для отзыва, который напоминает только точность, а также все остальные метрики.
import pandas import argparse import numpy from collections import Counter from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn import metrics #there are 3 Types of recall in case of Multi-class classification. #1. Macro averaged recall #2. Micro averaged recall #3. Weighted recall def true_positive(y_true, y_pred): tp = 0 for yt, yp in zip(y_true, y_pred): if yt == 1 and yp == 1: tp += 1 return tp def true_negative(y_true, y_pred): tn = 0 for yt, yp in zip(y_true, y_pred): if yt == 0 and yp == 0: tn += 1 return tn def false_positive(y_true, y_pred): fp = 0 for yt, yp in zip(y_true, y_pred): if yt == 0 and yp == 1: fp += 1 return fp def false_negative(y_true, y_pred): fn = 0 for yt, yp in zip(y_true, y_pred): if yt == 1 and yp == 0: fn += 1 return fn def recall(y_test, y_pred): tp = true_positive(y_test, y_pred) fn = false_negative(y_test, y_pred) return(tp/(tp+fn)) def Macro_averaged_recall(y_test, predictions): recalls = [] for i in range(1,5): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] print(temp_ypred) print(temp_ytest) rec = recall(temp_ytest, temp_ypred) recalls.append(rec) return (sum(recalls)/len(recalls)) def Micro_averaged_recall(y_test, predictions): tp = 0 tn = 0 for i in range(1,5): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] tp += true_positive(temp_ytest, temp_ypred) tn += true_negative(temp_ytest, temp_ypred) recall = tp / (tp + tn) return recall def weighted_recall(y_test, predictions): num_classes = len(numpy.unique(y_test)) #counts for every class recall = 0 for i in range(1, num_classes): temp_ytest = [1 if x == i else 0 for x in y_test] temp_ypred = [1 if x == i else 0 for x in predictions] tp = true_positive(temp_ytest, temp_ypred) tn = true_negative(temp_ytest, temp_ypred) try: rec = tp / (tp+tn) except ZeroDivisionError: rec = 0 weighted = rec*sum(temp_ytest) recall += weighted recall = recall/len(y_test) return recall if __name__ == "__main__": data = pandas.read_csv("C:\\Users\\iamvi\\OneDrive\\Desktop\\Metrics_in_Machine_Learning\\development-index\\Development Index.csv") train = data.drop(['Development Index'], axis = 1).values test = data["Development Index"].values model = LogisticRegression() X_train, X_test, y_train, y_test = train_test_split(train, test, stratify = test) model.fit(X_train, y_train) predictions = model.predict(X_test) print("Macro recall is:", Macro_averaged_recall(y_test, predictions)) print("Micro recall is:", Micro_averaged_recall(y_test, predictions)) print("Weighted recall is:", weighted_recall(y_test, predictions)) print("sklearn Macro", metrics.recall_score(y_test, predictions, average = "macro")) print("sklearn Micro", metrics.recall_score(y_test, predictions, average = "micro")) print("sklearn weighted", metrics.recall_score(y_test, predictions, average = "weighted"))
Определения 3 версий точности также будут применяться для отзыва.
После того, как вы реализовали все метрики мультиклассовой классификации, как я сказал выше, в 3-х версиях, вы можете с уверенностью сказать «Я знаю мультиклассовую классификацию».😉
Проверьте Репозиторий классификационных показателей, чтобы получить все коды понятий, которые я объяснил. Пока я пишу здесь статьи, GitHub будет пополняться кодами. Так что держите вилку на этом.
Если вы хотите что-то добавить сюда или хотите, чтобы я объяснил здесь недостающую концепцию, дайте мне знать здесь.
вы можете следить за мной на разных платформах LinkedIn, Github и medium.
Счастливого обучения✌.