Объяснение на примере из реальной жизни на Python

Анализ кривой рабочих характеристик приемника (ROC) и площадь под кривой (AUC) — это инструменты, широко используемые в науке о данных, заимствованные из обработки сигналов, для оценки качества модели при различных параметризациях или сравнения производительности двух или больше моделей.

Традиционные показатели эффективности, такие как точность и полнота, в значительной степени зависят от положительных наблюдений. Поэтому вместо этого ROC и AUC используют показатели True Positive и False Positive Rates для оценки качества, которые учитывают как положительные, так и отрицательные наблюдения.

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

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

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

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

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

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

Выделяется тот факт, что Precision and Recall фокусируются только на положительных примерах и предсказаниях[1] и не принимают во внимание какие-либо отрицательные примеры. Кроме того, они не сравнивают производительность модели с медианным сценарием, который просто предполагает случайные предположения.

Углубившись в то, как рассчитываются Precision и Recall, вы можете начать понимать, как эти показатели могут дать узкое представление о производительности модели.

Чтобы дополнить оценку вашей модели и исключить предвзятость от Precision and Recall, вы можете воспользоваться несколькими надежными инструментами из набора инструментов Data Scientist: анализ кривой рабочей характеристики приемника (ROC) и ее области под Кривая (AUC).

Кривая ROC: от теории сигналов к машинному обучению

ROC — это сводной инструмент, используемый для визуализации компромисса между точностью и отзывом[2].

Этот метод появился в области теории обнаружения сигналов как часть развития радиолокационной техники во время Второй мировой войны [3]. Название может немного сбивать с толку тех, кто не знаком с теорией сигналов, но оно относится к чтениюрадарных сигналов операторами военных радаров, поэтому часть Работа приемника в разделе «Рабочие характеристики приемника Изгиб".

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

Прямо сейчас вы можете подумать: Подождите, это звучит как знакомая задача!

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

ROC-анализ использует кривую ROC, чтобы определить, какая часть значения двоичного сигнала загрязнена шумом, т. е. случайностью[4]. Он предоставляет сводную информацию о чувствительности и специфичности в диапазоне рабочих точек для непрерывного предиктора[5].

Кривая ROC получается путем сопоставления частоты ложных срабатываний по оси x и частоты истинных срабатываний по оси y.

Поскольку частота истинных срабатываний — это вероятность обнаружения сигнала, а частота ложных срабатываний — вероятность ложной тревоги, ROC-анализ также широко используется в медицинских исследованиях для определения пороги, которые уверенно обнаруживают заболевания или другие виды поведения[5].

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

Она [Кривая ROC] предоставляет сводку чувствительности и специфичности в диапазоне рабочих точек для непрерывного предиктора.

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

Использование площади под кривой (AUC) для оценки моделей машинного обучения

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

Чтобы решить эту задачу Анализ настроений, вы начали с использования Многослойного персептрона и использовали точность и потери как способ понять, действительно ли он достаточно хорош для решения вашей задачи классификации.

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

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

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer

corpus = [
    'We enjoyed our stay so much. The weather was not great, but everything else was perfect.',
    'Going to think twice before staying here again. The wifi was spotty and the rooms smaller than advertised',
    'The perfect place to relax and recharge.',
    'Never had such a relaxing vacation.',
    'The pictures were misleading, so I was expecting the common areas to be bigger. But the service was good.',
    'There were no clean linens when I got to my room and the breakfast options were not that many.',
    'Was expecting it to be a bit far from historical downtown, but it was almost impossible to drive through those narrow roads',
    'I thought that waking up with the chickens was fun, but I was wrong.',
    'Great place for a quick getaway from the city. Everyone is friendly and polite.',
    'Unfortunately it was raining during our stay, and there weren\'t many options for indoors activities. Everything was great, but there was literally no other oprionts besides being in the rain.',
    'The town festival was postponed, so the area was a complete ghost town. We were the only guests. Not the experience I was looking for.',
    'We had a lovely time. It\'s a fantastic place to go with the children, they loved all the animals.',
    'A little bit off the beaten track, but completely worth it. You can hear the birds sing in the morning and then you are greeted with the biggest, sincerest smiles from the owners. Loved it!',
    'It was good to be outside in the country, visiting old town. Everything was prepared to the upmost detail'
    'staff was friendly. Going to come back for sure.',
    'They didn\'t have enough staff for the amount of guests. It took some time to get our breakfast and we had to wait 20 minutes to get more information about the old town.',
    'The pictures looked way different.',
    'Best weekend in the countryside I\'ve ever had.',
    'Terrible. Slow staff, slow town. Only good thing was being surrounded by nature.',
    'Not as clean as advertised. Found some cobwebs in the corner of the room.',
    'It was a peaceful getaway in the countryside.',
    'Everyone was nice. Had a good time.',
    'The kids loved running around in nature, we loved the old town. Definitely going back.',
    'Had worse experiences.',
    'Surprised this was much different than what was on the website.',
    'Not that mindblowing.'
]

# 0: negative sentiment.  1: positive sentiment
targets = [1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0]

# Splitting the dataset
train_features, test_features, train_targets, test_targets = train_test_split(corpus, targets, test_size=0.25,random_state=123)

#Turning the corpus into a tf-idf array
vectorizer = TfidfVectorizer(stop_words='english', lowercase=True, norm='l1')

Модель Многослойный персептрон готова к обучению.

from sklearn.neural_network import MLPClassifier

def buildMLPerceptron(train_features, train_targets, num_neurons=2):
    """ Build a Multi-layer Perceptron and fit the data
        Activation Function: ReLU
        Optimization Function: SGD, Stochastic Gradient Descent
        Learning Rate: Inverse Scaling
    """

    classifier = MLPClassifier(hidden_layer_sizes=num_neurons, max_iter=35, activation='relu', solver='sgd', verbose=10, random_state=762, learning_rate='invscaling')
    classifier.fit(train_features, train_targets)

    return classifier

train_features = vectorizer.fit_transform(train_features)
test_features = vectorizer.transform(test_features)

# Build Multi-Layer Perceptron with 3 hidden layers, each with 5 neurons
ml_percetron_model = buildMLPerceptron(train_features, train_targets, num_neurons=5)

Все готово для обучения модели! Когда вы запустите приведенный выше код, вы увидите что-то вроде следующего.

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

Площадь под кривой (AUC) имеет значения от нуля до единицы, поскольку кривая построена на сетке 1x1 и, проводя параллель с теорией сигналов, является мерой обнаруживаемости сигнала[6]. .

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

C-статистика нормализует количество пар одного положительного и одного отрицательного розыгрыша.

[…] Проводя параллель с теорией сигналов, [площадь под кривой] это мера обнаруживаемости сигнала.

Чтобы построить кривую ROC и рассчитать площадь под кривой (AUC), вы решили использовать метод RocCurveDisplay от SckitLearn и сравнить свой Multilayer Perceptron с моделью Random Forests, пытаясь решить ту же задачу классификации.

import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score, RocCurveDisplay

def plot_roc(model, test_features, test_targets):
    """
    Plotting the ROC curve for a given Model and the ROC curve for a Random Forests Models
    """

    # comparing the given model with a Random Forests model
    random_forests_model = RandomForestClassifier(random_state=42)
    random_forests_model.fit(train_features, train_targets)

    rfc_disp = RocCurveDisplay.from_estimator(random_forests_model, test_features, test_targets)
    model_disp = RocCurveDisplay.from_estimator(model, test_features, test_targets, ax=rfc_disp.ax_)
    model_disp.figure_.suptitle("ROC curve: Multilayer Perceptron vs Random Forests")

    plt.show()

# using perceptron model as input
plot_roc(ml_percetron_model, test_features, test_targets)

Приведенный выше код строит кривые ROC для вашего Многослойного персептрона и модели случайных лесов. Он также вычисляет площадь под кривой (AUC) для обеих моделей.

Заключение

Из графика анализа ROC и значения площади под кривой (AUC) для каждой модели видно, что общий AUC для вашей модели многослойного персептрона, обозначенный на графике как MLPClassifier, немного выше.

По сравнению с моделью Random Forests, пытающейся решить ту же задачу классификации настроений отзывов о гостинице типа «постель и завтрак» ваших родителей, многослойный персептрон справился лучше.

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

Вы также можете видеть, что модель Random Forests лишь немного лучше, чем Random Model, у которой AUC будет равен 0,5.

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

Спасибо, что прочитали!

Рекомендации

  1. Пауэрс, Дэвид. (2008). Оценка: от точности, отзыва и F-фактора до ROC, Международный журнал технологий машинного обучения 2: 1 (2011), стр. 37–63.
  2. Гарет Джеймс, Даниэла Виттен, Тревор Хасти, Роберт Тибширани. (2021). Введение в статистическое обучение: с приложениями в R. (2-е издание) Springer
  3. Штрейнер Д.Л., Кэрни Дж. Что находится под РПЦ? Введение в кривые рабочих характеристик приемника. Канадский журнал психиатрии. 2007; 52(2):121–128.
  4. Флач, П.А. (2011). ROC-анализ. В: Саммут, К., Уэбб, Г.И. (ред.) Энциклопедия машинного обучения. Спрингер, Бостон, Массачусетс.
  5. Кук НР. Использование и неправильное использование кривой рабочей характеристики приемника в прогнозировании риска. Тираж. 2007 г., 20 февраля; 115 (7): 928–35.
  6. Зеленый Дм. Проповедь по теории обнаружения сигналов. J Acoust Soc Am. 2020 июль; 148 (1): 222.