Ваше руководство по оценке эффективности вашего проекта классификации машинного обучения

Классификация машинного обучения и оценка моделей могут быть непростой задачей. В этой статье мы попытаемся устранить эту «путаницу» из этого процесса, объяснив «матрицу неточностей», метрики оценки, а также ROC AUC для задач двоичной классификации. Для каждого раздела также представлен образец кода Python, чтобы помочь читателям разобраться в бинарной классификации и оценке машинного обучения в Python.

Классификация против регрессии

Специалисты по обработке данных часто используют инструменты и библиотеки машинного обучения (ML) для разработки кодов, которые эффективно выполняют конкретную задачу без использования явных инструкций, полагаясь вместо этого на шаблоны и логический вывод для прогнозирования непрерывной переменной или класса / категории переменной. Как правило, мы можем разделить эти проблемы машинного обучения на три категории:

Регрессия: эти проблемы связаны с прогнозированием непрерывной переменной, такой как температура, цена, возраст и т. д. Например:

  • «Какова цена продажи дома с учетом его характеристик?»
  • «Сколько товаров покупатель закажет на этом веб-сайте?»

Двоичная классификация. Эти проблемы часто связаны с проблемами, требующими ответа да / нет или 1/0. Например:

  • «Это мошенническая транзакция?»
  • «Будет ли этот клиент заказывать этот продукт?»

Мультиклассовая классификация: они похожи на двоичную классификацию, но в этом случае проблема касается выбора между более чем двумя категориями. Например:

  • «Что это за сделка? Дебетовая, кредитная и т. Д. »
  • «Какие категории товаров интересуют этого покупателя?»

Оценка проблем двоичной классификации

Обычно и в регрессионной, и в классификационной моделях набор данных делится на обучающие и тестовые наборы данных. Затем модель обучается и настраивается на «набор данных поезда» и используется для прогнозирования на основе «тестового набора данных» для оценки производительности. Причина этого разделения поезд / тест состоит в том, чтобы имитировать будущие наборы данных, а также избежать переобучения модели в наборах данных поездов. Преимущество этого подхода состоит в том, что фактические значения для цели в наборе тестовых данных известны, что имеет решающее значение для оценки модели. Но как проводится эта оценка?

Существует несколько показателей, которые можно вычислить для задач двоичной классификации, чтобы оценить производительность модели прогнозирования. Эти показатели рассчитываются на основе так называемой «матрицы путаницы».

Матрица замешательства

Теория о матрице неточностей описывает матрицу как:

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

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

Положительно в данном случае - класс интереса. Например, «выявление мошеннической транзакции».

Истинно-положительный (TP): когда модель спрогнозировала положительный результат, а на самом деле они были положительными (например, мошенническая транзакция идентифицирована как мошенническая).

Истинно-отрицательный (TN): когда модель спрогнозировала отрицательное значение, а на самом деле они были отрицательными (например, не-мошенническая транзакция определяется как не-мошенническая).

Ложноположительный (FP) (также известный как ошибка типа I): когда модель предсказала как положительный результат, но на самом деле они были отрицательными (например, не мошенническая транзакция идентифицирована как мошенническая).

Ложноотрицательный (FN) (также известный как ошибка типа II): когда модель спрогнозировала отрицательный результат, но они были положительными (например, мошенническая транзакция идентифицирована как не мошенническая).

Обычно ошибки типа II (FN) имеют более серьезные последствия, и цель ML - минимизировать ошибки типа II. С другой стороны, ошибки типа I имеют меньшие последствия. Однако в идеальном случае идеальная модель не должна иметь ни одной из этих ошибок.

Давайте напишем функцию для создания матрицы путаницы в Python. Библиотека Scikit Learn (SKLearn) имеет metrics пакет, который включает confusion_matrix метод.

# Importing the metrics package from sklearn library
from sklearn import metrics
# Creating the confusion matrix
cm = metrics.confusion_matrix(y_test, y_pred)
# Assigning columns names
cm_df = pd.DataFrame(cm, 
            columns = ['Predicted Negative', 'Predicted Positive'],
            index = ['Actual Negative', 'Actual Positive'])
# Showing the confusion matrix
cm_df

Шесть важных показателей

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

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

Точность = (TP + TN) / Все прогнозы

Неверная классификация (точность 1) означает все ложные прогнозы по общему количеству прогнозов.

Чувствительность (также известная как отзыв) означает «из всех реальных положительных результатов, сколько мы прогнозировали как положительные», что можно объяснить следующим образом:

Чувствительность (отзыв) = TP / (FN + TP)

Специфичность (также известная как избирательность или истинно отрицательная скорость, TNR) означает «из всех фактических отрицательных результатов, сколько мы прогнозировали как отрицательные», и может быть записано как:

Специфичность = TN / (TN + FP)

Точность (также известная как положительное прогнозируемое значение, PPV) означает «сколько из всех прогнозируемых положительных случаев было действительно положительным» или

Точность = TP / (TP + FP)

Оценка F1 представляет собой гармоническое или взвешенное среднее значение точности и чувствительности и является широко используемым показателем точности для задач классификации. Он рассчитывается как:

Оценка F1 = 2 * (точность * чувствительность) / (точность + чувствительность)

Эта функция в Python будет вычислять и сообщать эти шесть показателей для матрицы путаницы.

# Creating a function to report confusion metrics
def confusion_metrics (conf_matrix):
# save confusion matrix and slice into four pieces
    TP = conf_matrix[1][1]
    TN = conf_matrix[0][0]
    FP = conf_matrix[0][1]
    FN = conf_matrix[1][0]
    print('True Positives:', TP)
    print('True Negatives:', TN)
    print('False Positives:', FP)
    print('False Negatives:', FN)
    
    # calculate accuracy
    conf_accuracy = (float (TP+TN) / float(TP + TN + FP + FN))
    
    # calculate mis-classification
    conf_misclassification = 1- conf_accuracy
    
    # calculate the sensitivity
    conf_sensitivity = (TP / float(TP + FN))
    # calculate the specificity
    conf_specificity = (TN / float(TN + FP))
    
    # calculate precision
    conf_precision = (TN / float(TN + FP))
    # calculate f_1 score
    conf_f1 = 2 * ((conf_precision * conf_sensitivity) / (conf_precision + conf_sensitivity))
    print('-'*50)
    print(f'Accuracy: {round(conf_accuracy,2)}') 
    print(f'Mis-Classification: {round(conf_misclassification,2)}') 
    print(f'Sensitivity: {round(conf_sensitivity,2)}') 
    print(f'Specificity: {round(conf_specificity,2)}') 
    print(f'Precision: {round(conf_precision,2)}')
    print(f'f_1 Score: {round(conf_f1,2)}')

Показатель плюс один: ROC AUC [или площадь под кривой для рабочих характеристик приемника (ROC)]

По данным Википедии:

Кривая рабочих характеристик приемника, или кривая ROC, представляет собой графический график, который иллюстрирует диагностические возможности системы двоичного классификатора при изменении ее порога распознавания. Кривая ROC создается путем построения графика зависимости истинно положительной скорости (TPR) от ложноположительной скорости (FPR) при различных настройках пороговых значений. Уровень истинно положительных результатов в машинном обучении также известен как чувствительность, отзыв или вероятность обнаружения [4].

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

1) Установите порог классификации на 0, что означает, что все прогнозы относятся к классу 1 (положительный).

2) Рассчитайте чувствительность и 1 - специфичность для этого порога.

3) Нанесите на график значения (x = 1 - специфичность, y = чувствительность).

4) Увеличьте порог классификации для небольшого числа (например, 0,005).

5) Повторите шаги 1–4.

6) Повторяйте, пока порог не станет равным 1 (что означает, что все прогнозы относятся к классу 0, отрицательному).

Результат этого процесса будет выглядеть как этот график. Площадь под кривой (AUC) - еще одна метрика оценки, которую мы можем использовать для моделей классификации. Линия под углом 45 градусов является базовой линией, для которой AUC составляет 0,5. У идеальной модели AUC будет 1.0. Чем ближе AUC к 1,0, тем лучше прогнозы.

Давайте создадим ROC AUC на Python, используя Logistic Regression модель.

# The codes below is partly copied from the code written by Matt Brem, Global Instructor at General Assembly.
# Imports
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 42)
# Instantiating a logisitic regression model
logreg = LogisiticRegression()
logreg.fit(X_train, y_train)    # model fitting
y_pred = logreg.predict(X_test)   # Predictions
# Calculating class probabilities
pred_proba = [i[1] for i in logreg.predict_proba(X_test)]
pred_df = pd.DataFrame({'true_values': y_test,
                        'pred_probs':pred_proba})
# The codes below is motly copied from the code written by Matt Brem, Global Instructor at General Assembly.
# Create figure.
plt.figure(figsize = (10,7))
# Create threshold values. 
thresholds = np.linspace(0, 1, 200)
# Define function to calculate sensitivity. (True positive rate.)
def TPR(df, true_col, pred_prob_col, threshold):
    true_positive = df[(df[true_col] == 1) & (df[pred_prob_col] >= threshold)].shape[0]
    false_negative = df[(df[true_col] == 1) & (df[pred_prob_col] < threshold)].shape[0]
    return true_positive / (true_positive + false_negative)
    
# Define function to calculate 1 - specificity. (False positive rate.)
def FPR(df, true_col, pred_prob_col, threshold):
    true_negative = df[(df[true_col] == 0) & (df[pred_prob_col] <= threshold)].shape[0]
    false_positive = df[(df[true_col] == 0) & (df[pred_prob_col] > threshold)].shape[0]
    return 1 - (true_negative / (true_negative + false_positive))
    
# Calculate sensitivity & 1-specificity for each threshold between 0 and 1.
tpr_values = [TPR(pred_df, 'true_values', 'pred_probs', prob) for prob in thresholds]
fpr_values = [FPR(pred_df, 'true_values', 'pred_probs', prob) for prob in thresholds]
# Plot ROC curve.
plt.plot(fpr_values, # False Positive Rate on X-axis
         tpr_values, # True Positive Rate on Y-axis
         label='ROC Curve')
# Plot baseline. (Perfect overlap between the two populations.)
plt.plot(np.linspace(0, 1, 200),
         np.linspace(0, 1, 200),
         label='baseline',
         linestyle='--')
# Label axes.
plt.title(f"ROC Curve with AUC = {round(metrics.roc_auc_score(pred_df['true_values'], pred_df['pred_probs']),3)}", fontsize=22)
plt.ylabel('Sensitivity', fontsize=18)
plt.xlabel('1 - Specificity', fontsize=18)
# Create legend.
plt.legend(fontsize=16);

Матрица неточностей для многоклассовой классификации

Оценка задач мультиклассовой классификации не отличается от бинарных задач, но в этом случае метрики, которые обсуждались выше, будут рассчитываться для каждого класса отдельно. В модели классификации с N классами матрица путаницы будет NxN, где левая ось будет отображать фактический класс (известный в тестовом наборе), а верхняя ось - прогнозируемый класс. Каждый элемент 𝑖, 𝑗 матрицы будет числом элементов с фактическим классом 𝑖, которые были отнесены к прогнозируемому классу 𝑗.

Документация по Amazon AWS ML упоминает:

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

В документации Amazon AWS также упоминается:

Типичные метрики, используемые в мультиклассах, такие же, как метрики, используемые в случае двоичной классификации. Показатель рассчитывается для каждого класса, рассматривая его как проблему двоичной классификации после группировки всех других классов как принадлежащих ко второму классу. Затем двоичная метрика усредняется по всем классам, чтобы получить либо макро-среднее (относиться к каждому классу одинаково), либо средневзвешенное (взвешенное по частоте классов) метрику.

Собираем все вместе…

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

Также обсуждались многоклассовые классификации и сравнивались с бинарными классификациями.

Ник Минаи, доктор философии (профиль LinkedIn) - старший консультант и дальновидный специалист по данным. Он представляет собой уникальное сочетание лидерских навыков, знаний мирового уровня в области науки о данных, деловой хватки и способность руководить организационными изменениями. Его миссия - продвигать практику искусственного интеллекта (ИИ) и машинного обучения в отрасли.