Этот блог является продолжением этого поста.

До сих пор вы проходили метрики бинарной классификации. с этого момента мы изучим метрики для многоклассовой классификации, а в следующей статье вы изучите многоуровневую классификацию и ее метрики.

Мультиклассовая классификация — это не что иное, как решение проблемы классификации, когда у нас есть несколько классов (количество классов › 2) в целевом столбце. Например, классификация изображений фруктов на яблоки, апельсины и бананы.

Прикрепляю пример набора данных здесь. В этом наборе данных столбец индекса развития является целью, которая имеет несколько классов (количество классов › 2).

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

Существует 3 реализации каждой метрики бинарной классификации в метриках мультиклассификации. Вы можете понять, когда я пишу их…

Для метрики точной бинарной классификации в метриках мультиклассификации у нас есть три версии:

  1. Микроусредненная точность
  2. Макроусредненная точность
  3. Взвешенная точность

в качестве точности у нас есть 3 версии метрики бинарной классификации отзыва в многоклассовой классификации.

  1. Микроусредненный отзыв
  2. Усредненный отзыв макроса
  3. Взвешенный отзыв

Как и выше, мы можем классифицировать каждую метрику двоичной классификации как 3 версии и называть их метриками мультиклассификации.

А пока я собираюсь обсудить точность и добавить код отзыва, а все остальные метрики будут построены таким же образом (такая же процедура используется для точности ниже). В следующем посте я покажу вам, как сформировать ROC-AUC в многоклассовой классификации.

Примечание: - Не прыгайте ни во что, если вы не знаете основ. потому что это может съесть вашу уверенность и веру.

Давайте обсудим 3 версии точности….

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

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.

Счастливого обучения✌.