Как рассчитать точность прогноза используя матрицу ошибок

Проверка знаний на собеседованиях — обычная практика. И мы сейчас не о глупых «Где вы видите себя через 5 лет?», а о нормальных вопросах по специальности. Специа...

Проверка знаний на собеседованиях — обычная практика. И мы сейчас не о глупых «Где вы видите себя через 5 лет?», а о нормальных вопросах по специальности. Специально к старту нового потока курса Data Scientist, в этой статье мы собрали топ-20 вопросов, которые задают дата-сайентистам, чтобы проверить их уровень знаний. Все это реальные вопросы на реальных собеседованиях в российских компаниях. Но нас попросили не упоминать названия, чтобы не давать соискателям лишнего преимущества. Некоторые вопросы простые, другие — посложнее. Не будем затягивать, поехали.


1. В чём разница между контролируемым и неконтролируемым машинным обучением?

Контролируемое машинное обучение:

  • Использует известные и маркированные данные в качестве входных.

  • Имеет механизм обратной связи.

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

Неконтролируемое обучение:

  • Использует немаркированные данные в качестве входных. 

  • Не имеет механизма обратной связи. 

  • Наиболее часто используемые алгоритмы неконтролируемого обучения — кластеризация методом k-средних, иерархическая кластеризация и априорный алгоритм. 

2. Перечислите этапы построения дерева решений

  1. Взять весь набор входных данных.

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

  3. Рассчитать прирост информации по всем атрибутам (информацию о том, как отсортировать разные объекты друг от друга).

  4. Выбрать атрибут с наибольшим объёмом информации в качестве корневого узла. 

  5. Повторить ту же процедуру для каждой ветви, пока узел решения каждой ветви не будет завершён.

3. Что такое проблемы взрывающегося и затухающего градиента?

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

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

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

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

4. Как рассчитать точность прогноза, используя матрицу ошибок?

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

Формула точности: 

Точность = (истинно положительные + истинно отрицательные) / общее количество наблюдений. 

Предположим, что истинно положительных значений у нас 2981, истинно отрицательных — 110, а всего — 3311. Используя формулу, находим, что точность прогноза составляет 93,36 %.

5. Как работает ROC-кривая?

ROC-кривая — это графическое изображение контраста между показателями истинно положительных и ложноположительных результатов при различных пороговых значениях. 

Если считать TPR и FPR для фиксированного порога μ є [0,1], то их можно представить в виде функций от аргумента μ:

TPR = TPR(μ), FPR = FPR(μ). При этом обе функции монотонно возрастают от 0 до 1, а значит, определена функция:

ROC(x) = TPR(FPR-1(x)), x є [0,1]

ROC-кривая — это график функции.

Как правило, у хорошего классификатора кривая лежит по большей части либо целиком выше прямой y=x. Это связано с тем что при хорошей классификации надо получать максимальный TPR при минимальном FPR.

6. Объясните алгоритм машинного обучения SVM

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

Его основная идея — построение гиперплоскости, которая разделяет объекты выборки максимально эффективным способом. Сделать это можно с помощью алгоритма линейной классификации.

7. Что такое ансамбль методов?

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

8. Что такое Random Forest?

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

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

9. Какой метод перекрёстной проверки вы бы использовали для набора данных временных рядов?

Нормальная k-кратная процедура перекрёстной проверки может быть проблематичной для временных рядов. 

Наиболее результативный подход для временных рядов — это прямая цепочка, где процедура выглядит примерно так:

  • сгиб 1: тренировка [1], тест [2];

  • сгиб 2: тренировка [1 2], тест [3];

  • сгиб 3: тренировка [1 2 3], тест [4];

  • сгиб 4: тренировка [1 2 3 4], тест [5];

  • сгиб 5: тренировка [1 2 3 4 5], тест [6].

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

10. Что такое логистическая регрессия? Или приведите пример логистической регрессии.

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

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

В этом случае результат прогноза будет двоичным, то есть 0 или 1 (выигрыш/проигрыш). В качестве переменных-предикторов здесь будут: сумма денег, потраченных на предвыборную агитацию конкретного кандидата, количество времени, затраченного на агитацию, и так далее.

11. Что вы понимаете под термином «нормальное распределение»?

Нормальное распределение — одно из основных распределений вероятности. 

Плотность нормального распределения выражается функцией Гаусса:

Где μ — математическое ожидание, σ — среднеквадратическое отклонение, σ ² — дисперсия, медиана и мода нормального распределения равны математическому ожиданию μ.

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

12. Что такое глубокое обучение?

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

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

13. В чём разница между машинным обучением и глубоким обучением?

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

14. Что такое рекуррентные нейронные сети (RNN)?

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

Они используются преимущественно для задач, где нечто цельное состоит из ряда объектов, например при распознавании рукописного текста или речи.

15. Что такое обучение с подкреплением?

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

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

Машина пытается решить задачу, ошибается, учится на своих ошибках, совершенствуется, и так множество раз. 

16. Объясните, что такое регуляризация и почему она полезна

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

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

17. Что такое рекомендательные системы?

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

18. Какова цель A/B-тестирования? 

A/B-тестирование — это статистическая проверка гипотез для рандомизированных экспериментов с двумя переменными, A и B. 

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

19. Что такое закон больших чисел? 

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

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

К примеру, при бросках шестигранного кубика. Чем больше бросков, тем больше среднее значение близится к математическому ожиданию 3,5.

20. Назовите несколько фреймворков для глубокого обучения

  • Pytorch.

  • TensorFlow.

  • Microsoft Cognitive Toolkit.

  • Keras.

  • Caffe.

  • Chainer.

Естественно, в этой выборке только теоретические вопросы, ведь практических задач (под реальные бизнес-кейсы компаний) просто бесконечное количество. Но всему этому мы учим на наших курсах по профессиям Data Scientist и Data Analyst, а карьерные консультанты помогают подготовиться к собеседованию. Про общую подготовку к собеседованию читайте здесь.

  • Курс по Data Science (12 месяцев)

  • Курс по Аналитике данных (6 месяцев)

  • Курс по Data Engineering

У нас еще много направлений для состоявшихся профи и новичков

Матрица ошибок – это метрика производительности классифицирующей модели Машинного обучения (ML).

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

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

Давайте рассмотрим значения ячеек (истинно позитивные, ошибочно позитивные, ошибочно негативные, истинно негативные) с помощью «беременной» аналогии.

Истинно позитивное предсказание (True Positive, сокр. TP)
Вы предсказали положительный результат, и женщина действительно беременна.

Истинно отрицательное предсказание (True Negative, TN)
Вы предсказали отрицательный результат, и мужчина действительно не беременен.

Ошибочно положительное предсказание (ошибка типа I, False Positive, FN)
Вы предсказали положительный результат (мужчина беременен), но на самом деле это не так.

Ошибочно отрицательное предсказание (ошибка типа II, False Negative, FN)
Вы предсказали, что женщина не беременна, но на самом деле она беременна.

Давайте разберемся в матрице ошибок с помощью арифметики.

Пример. Мы располагаем датасетом пациентов, у которых диагностируют рак. Зная верный диагноз (столбец целевой переменной «Y на самом деле»), хотим усовершенствовать диагностику с помощью модели Машинного обучения. Модель получила тренировочные данные, и на тестовой части, состоящей из 7 записей (в реальных задачах, конечно, больше) и изображенной ниже, мы оцениваем, насколько хорошо прошло обучение.

Модель сделала свои предсказания для каждого пациента и записала вероятности от 0 до 1 в столбец «Предсказанный Y». Мы округляем эти числа, приводя их к нулю или единице, с помощью порога, равного 0,6 (ниже этого значения – ноль, пациент здоров). Результаты округления попадают в столбец «Предсказанная вероятность»: например, для первой записи модель указала 0,5, что соответствует нулю. В последнем столбце мы анализируем, угадала ли модель.

Теперь, используя простейшие формулы, мы рассчитаем Отзыв (Recall), точность результата измерений (Precision), точность измерений (Accuracy), и наконец поймем разницу между этими метриками.

Отзыв

Из всех положительных значений, которые мы предсказали правильно, сколько на самом деле положительных? Подсчитаем, сколько единиц в столбце «Y на самом деле» (4), это и есть сумма TP + FN. Теперь определим с помощью «Предсказанной вероятности», сколько из них диагностировано верно (2), это и будет TP.

$$Отзыв = frac{TP}{TP + FN} = frac{2}{2 + 2} = frac{1}{2}$$

Точность результата измерений (Precision)

В этом уравнении из неизвестных только FP. Ошибочно диагностированных как больных здесь только одна запись.

$$Точностьspaceрезультатаspaceизмерений = frac{TP}{TP + FP} = frac{2}{2 + 1} = frac{2}{3}$$

Точность измерений (Accuracy)

Последнее значение, которое предстоит экстраполировать из таблицы – TN. Правильно диагностированных моделью здоровых людей здесь 2.

$$Точностьspaceизмерений = frac{TP + TN}{Всегоspaceзначений} = frac{2 + 2}{7} = frac{4}{7}$$

F-мера точности теста

Эти метрики полезны, когда помогают вычислить F-меру – конечный показатель эффективности модели.

$$F-мера = frac{2 * Отзыв * Точностьspaceизмерений}{Отзыв + Точностьspaceизмерений} = frac{2 * frac{1}{2} * frac{2}{3}}{frac{1}{2} + frac{2}{3}} = 0,56$$

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

SkLearn

С помощью замечательной библиотеки Scikit-learn мы можем мгновенно определить множество метрик, и матрица ошибок – не исключение.

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)

Выводом будет ряд, состоящий из трех списков:

array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

Значения диагонали сверху вниз слева направо [2, 0, 2] – это число верно  предсказанных значений.

Фото: @opeleye

В компьютерном зрении обнаружение объектов — это проблема определения местоположения одного или нескольких объектов на изображении. В дополнение к традиционным методам обнаружения передовые модели глубокого обучения, такие как R-CNN и YOLO, могут обеспечить впечатляющие результаты для различных типов объектов. Эти модели принимают изображение на вход и возвращают координаты прямоугольника, охватывающего пространство вокруг найденного объекта.

В этом учебном пособии мы расскажем о матрице ошибок и о том, как рассчитываются показатели точности, отзыва и аккуратности.

Давайте посмотрим здесь.

  • Матрица ошибок для бинарной классификации.
  • Матрица ошибок для многоклассовой классификации.
  • Вычисление матрицы ошибок с помощью Scikit-learn.
  • Точность, точность и запоминание.
  • Precision или Recall?
  • Содержание

    1. Матрица ошибок для бинарной классификации
    2. Матрица ошибок для мультиклассовой классификации
    3. Расчет матрицы ошибок с помощью Scikit-Learn
    4. Accuracy, Precision и Recall
    5. Метрика Accuracy
    6. Precision
    7. Recall
    8. Precision или Recall?
    9. Вывод

    Матрица ошибок для бинарной классификации

    При бинарной классификации каждый образец принадлежит к одному из двух классов. Обычно они обозначаются как «1» и «0», «положительный» и «отрицательный» и так далее. Можно использовать и более конкретные метки классов, например, злокачественный или доброкачественный, если проблема связана с классификацией раковых заболеваний, или успех или неудача, если проблема связана с классификацией тестовых оценок студентов.

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

    positive, negative, negative, positive, positive, positive, negative

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

    0.6, 0.2, 0.55, 0.9, 0.4, 0.8, 0.5

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

    positive (0.6), negative (0.2), positive (0.55), positive (0.9), negative (0.4), positive (0.8), positive (0.5)

    Сравнивая истинные метки с полученными, мы имеем 4 истинных и 3 ложных прогноза. Следует также добавить, что изменение граничных условий повлияет на результаты. Например, если мы установим порог в 0,6, у нас останется только 2 ложных предсказания.

    Реальность: positive, negative, negative, positive, positive, positive, negative Предсказания: positive, negative, positive, positive, negative, positive, positive

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

    Оценка ML/DL моделей: матрица ошибок, точность, прецизионность, отзыв

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

    1. Правда или ложь.
    2. Положительные или отрицательные.

    True, если получено правильное предсказание, т.е. эталонная метка и предсказанная метка класса совпадают, и False, если не совпадают. Positive или Negative — это название метки, которую нужно предсказать.

    Таким образом, если предсказание неверно, то первое слово ячейки будет False, а если верно, то True. Наша цель — максимизировать метрики со словом «True» (True Positive и True Negative) и минимизировать две другие метрики (False Positive и False Negative). Четыре метрики матрицы ошибок представляют собой следующее

    1. Верхний левый элемент (True Positive): сколько раз модель правильно классифицировала модель как положительную?
    2. Справа вверху (Ложное отрицание): Сколько раз модель ошибочно классифицировала Положительное как Отрицательное?
    3. Нижний левый (False Positive): Сколько раз модель ошибочно классифицировала Negative как Positive?
    4. Справа внизу (True Negative): Сколько раз модель правильно классифицировала Negative как Negative?

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

    Оценка ML/DL моделей: матрица ошибок, точность, прецизионность, отзыв

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

    Матрица ошибок для мультиклассовой классификации

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

    Предположим, что у нас есть 9 образцов, каждый из которых принадлежит к одному из трех классов «Белый», «Черный» и «Красный», и допустимые метки для этих 9 образцов следующие

    Red, Black, Red, White, White, Red, Black, Red, White

    После ознакомления с данными модель делает следующие прогнозы

    Red, White, Black, White, Red, Red, Black, White, Red

    Для удобства сравнения они перечислены здесь.

    Реальность: Red, Black, Red, White, White, Red, Black, Red, White Предсказания: Red, White, Black, White, Red, Red, Black, White, Red

    Прежде чем вычислить матрицу ошибок, необходимо выбрать целевой класс. Давайте назначим класс Red на эту роль. Это будет отмечено как положительное, а все остальные — как отрицательные.

    Positive, Negative, Positive, Negative, Negative, Positive, Negative, Positive, Negative Positive, Negative, Negative, Negative, Positive, Positive, Negative, Negative, Positive

    Следует отметить, что полученная матрица относится только к классу Red.

    Оценка ML/DL моделей: матрица ошибок, точность, прецизионность, отзыв

    Затем мы заменяем каждое вхождение класса White на Positive, а метки других классов на Negative. Мы получаем достоверные прогнозируемые метки, такие как.

    Negative, Negative, Negative, Positive, Positive, Negative, Negative, Negative, Positive Negative, Positive, Negative, Positive, Negative, Negative, Negative, Positive, Negative

    На следующем рисунке показана матрица ошибок для класса White.

    Оценка ML/DL моделей: матрица ошибок, точность, прецизионность, отзыв

    Матрица ошибок для Блэка получается аналогичным образом.

    Расчет матрицы ошибок с помощью Scikit-Learn

    Scikit-learn, популярная библиотека Python, имеет модуль metricsкоторые можно использовать для вычисления метрик матриц ошибок.

    В задаче с двумя классами функция confusion_matrix(). В функцию передаются следующие параметры

    1. y_true: Справочная этикетка
    2. y_pred: Предсказанная метка.

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

    копия копия копия копия используйте другой браузер

     
    import sklearn.metrics y_true = ["положительный", "отрицательный", "отрицательный", "положительный", "положительный"] y_pred = ["положительный", "отрицательный", "положительный", " положительный"] r = sklearn.metrics.confusion_matrix(y_true, y_pred) print(r) 

    array([[1, 2], [1, 3]], dtype=int64)

    Обратите внимание, что порядок метрик не такой, как выше. Например, «True Positive» отображается в правом нижнем углу, а «True Negative» — в левом верхнем. Чтобы решить эту проблему, инвертируйте матрицу.

    Копировать Копировать Использовать другой браузер

     
    import numpy r = numpy.flip(r) print(r) 

    array([[3, 1], [2, 1]], dtype=int64)

    Чтобы вычислить матрицу ошибок для задач с большим количеством классов, используйте функцию multilabel_confusion_matrix()следующим образом В дополнение к параметрам y_true и y_pred Третий параметр labels принимает список меток классов.

    копия копия копия копия используйте другой браузер

     
    import sklearn.metrics import numpy y_true = ["Красный", "Черный", "Красный", "Белый", "Белый", "Красный", "Черный", "Красный", "Белый"] y_pred = ["Красный", "Белый", " Черный", "Белый", "Красный"] r = sklearn.metrics.multilabel_confusion_matrix(y_true, y_pred, labels=["Белый", "Черный", "Красный"]) print(r) 

    array([ [[4 2] [2 1]] [[6 1] [1 1]] [[3 2] [2 2]]], dtype=int64)

    Функция вычисляет матрицу ошибок для каждого класса и возвращает все матрицы Порядок следования меток соответствует порядку следования labels. Чтобы изменить порядок метрик в матрице, используйте еще раз numpy.flip().

    Копировать Копировать Использовать другой браузер

     
    print(numpy.flip(r[0])) # матрица ошибок для класса Белый print(numpy.flip(r[1])) # матрица ошибок для класса Черный print(numpy.flip(r[2])) # матрица ошибок для класса Красный 

    # матрица ошибок для класса White [[1 2] [2 4]] # матрица ошибок для класса Black [[1 1] [1 6]] # матрица ошибок для класса Red [[2 2] [2 3]]

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

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

    1. Точность
    2. Точность
    3. Отзыв

    В следующих подразделах описаны эти три метрики.

    Метрика Accuracy

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

    Давайте рассчитаем точность в Scikit-learn, основываясь на матрице ошибок, полученной ранее. Переменными являются acc Переменная содержит результат деления суммы метрик True Positive и True Negative на сумму всех значений матрицы. Таким образом, точность 0,5714 означает, что модель делает правильные прогнозы с точностью 57,14%.

    копия копия копия копия используйте другой браузер

     
    import numpy import sklearn.metrics y_true = ["положительный", "отрицательный", "отрицательный", "положительный", "отрицательный", "положительный", "отрицательный"] y_pred = ["положительный", " отрицательный", "положительный", "положительный"] r = sklearn.metrics.confusion_matrix(y_true, y_pred) r = numpy.flip(r) acc = (r[0][0] + r[-1][-1]) / numpy.sum( r) print(acc) # Вывод 0,571. 

    Модуль sklearn.metrics имеет следующие функции precision_score()также для расчета точности. В качестве аргументов он принимает действительные и предсказанные метки.

    Копировать Копировать Копировать Использовать другой браузер

     
    acc = sklearn.metrics.precision_score(y_true, y_pred) 

    Стоит учитывать, что точные показатели могут вводить в заблуждение. Одним из таких примеров являются несбалансированные данные. Например, предположим, у вас есть 600 единиц данных, из которых 550 являются положительными и только 50 — отрицательными. Поскольку большинство образцов принадлежит к одному классу, точность этого класса выше, чем точность других классов.

    Если положительный класс сделал 530 правильных предсказаний из 550, а отрицательный класс сделал 5 предсказаний из 50, общая точность составляет (530 + 5) / 600 = 0,8917. Это означает, что точность модели составляет 89,17%. Опираясь на это значение, вы можете подумать, что для любой выборки (независимо от класса) модель сделает правильный прогноз с вероятностью 89,17%. Это неправда. Это не так, потому что модель имеет очень низкую производительность на классе отрицаний.

    Precision

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

    Чем больше неверно классифицированных Позитивов, тем больше знаменатель и тем ниже точность. С другой стороны, если точность высока

    1. Модель делает большое количество правильных положительных прогнозов класса (максимизируя показатель True Positive).
    2. Модель делает меньше ложных положительных классификаций (минимизация ложных положительных результатов).

    Представьте себе человека, которому все доверяют. Когда он что-то предсказывает, окружающие верят ему. Метрика точности подобна такому персонажу. Если он высокий, мы можем доверять суждению модели о том, что следующая выборка будет Положительной. Таким образом, точность помогает нам узнать, насколько точна модель, когда она говорит, что выборка имеет Положительный класс.

    Исходя из предыдущего обсуждения, вот определение понятия «Точность».

    Точность представляет собой надежность модели при классификации метки «Положительный».

    На изображении ниже зеленая метка означает, что зеленый образец классифицирован как положительный, а красный крест — как отрицательный. Модель правильно определила два положительных образца, но неправильно классифицировала один отрицательный образец как положительный. Это означает, что когда индекс ложноположительных результатов равен 1, индекс истинно положительных результатов равен 2, что дает точность 2 / (2 + 1) = 0,667. Это означает, что уровень доверия к суждению модели о том, что образец принадлежит к классу «Позитивный», составляет 66,7%.

    Оценка ML/DL моделей: матрица ошибок, точность, прецизионность, отзыв

    Цель точности — классифицировать все образцы как положительные и избежать ошибочного определения отрицательных образцов как положительных. Согласно следующей диаграмме, если все три положительных образца предсказаны правильно, а один отрицательный образец классифицирован неверно, точность составляет 3 / (3 + 1) = 0,75. Таким образом, утверждение модели о том, что образец принадлежит к классу «Положительный», верно с точностью 75%.

    Оценка ML/DL: матрица ошибок, точность, прецизионность, отзыв

    Единственный способ получить 100% точность — классифицировать все образцы как положительные, не классифицируя отрицательные как положительные.

    В Scikit-learn модуль sklearn.metrics имеет следующие функции precision_score()принимает в качестве аргументов метку ссылки и метку предсказания и возвращает точность. Параметр pos_label Указывает метку для класса Positive (по умолчанию 1).

    Копировать Копировать Копировать Использовать другой браузер

     
    import sklearn.metrics y_true = ["положительный", "положительный", "положительный", "отрицательный", "отрицательный"] y_pred = ["положительный", "положительный", "отрицательный", " отрицательный"] precision = sklearn.metrics.precision_score(y_true, y_pred, pos_label="положительный") print(precision) 

    Выход. 0.6666666666666666.

    Recall

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

    Recall заботится только о том, как классифицируются образцы Positive. В отличие от точности, эта мера не зависит от того, как предсказаны отрицательные образцы. Если модель правильно классифицирует все положительные образцы, отзыв будет равен 100%, даже если все члены класса «Отрицательные» будут неправильно идентифицированы как положительные. Давайте рассмотрим несколько примеров.

    На следующем рисунке показаны четыре различных случая (от A до D), все с одинаковым отзывом 0,667. В этом примере единственным отличием является способ классификации отрицательных образцов. Например, в случае A все отрицательные образцы идентифицированы правильно, в то время как в случае D все наоборот. Независимо от того, как модель предсказывает класс Negative, отзыв относится только к образцам, принадлежащим к классу Positive.

    Оценка ML/DL: матрица ошибок, точность, прецизионность, отзыв

    Из четырех случаев, показанных выше, только два положительных образца были определены правильно. Таким образом, индекс истинного позитива равен 2. В случае ложноотрицательного результата только один положительный образец классифицируется как отрицательный, в результате чего значение равно 1. В результате коэффициент восстановления составляет 2 / (2 + 1) = 2/3 = 0,667.
    Не важно, как предсказываются объекты класса Negative, поэтому лучше просто игнорировать их, как в следующей схеме. При расчете отзывов следует рассматривать только образцы Positive.

    Оценка ML/DL: матрица ошибок, точность, прецизионность, отзыв

    Что означает, если отзыв высокий или низкий? Если отзыв высокий, это означает, что все положительные образцы были правильно классифицированы. Поэтому мы можем полагаться на способность модели обнаруживать членов класса «Позитив».

    На следующем рисунке отзыв равен 1,0, поскольку все образцы Positive были правильно классифицированы. Оценка за истинно положительный результат равна 3, а за ложноотрицательный — 0. Поэтому отзыв рассчитывается как 3 / (3 + 0) = 1. Это означает, что модель обнаружила все положительные образцы. Поскольку отзыв не учитывает, как предсказываются отрицательные члены класса, может быть большое количество неправильно определенных отрицательных образцов (высокий показатель False Positive).

    Оценка ML/DL: матрица ошибок, точность, прецизионность, отзыв

    С другой стороны, если не обнаружено ни одного положительного образца, то Recall равен 0,0. Это означает, что 0% положительных образцов были обнаружены. Значение для истинно положительного результата равно 0, а значение для ложноотрицательного результата равно 3, поэтому отзыв равен 0 / (0 + 3) = 0.

    Если значение recall находится в диапазоне от 0,0 до 1,0, это число представляет собой процент положительных образцов, которые модель классифицировала правильно. Например, если имеется 10 экземпляров Positive и recall равен 0,6, то модель правильно определила 60% образцов Positive (т.е. 0,6 * 10 = 6).

    Аналогично функции Precision_score(), функция repl_score() в модуле sklearn.metrics вычисляет Recall. Следующий блок кода показывает пример его использования.

    копия копия копия копия копия копия с помощью другого браузера

     
    import sklearn.metrics y_true = ["положительный", "положительный", "положительный", "отрицательный", "отрицательный"] y_pred = ["положительный", "положительный", "отрицательный", " отрицательный"] recall = sklearn.metrics.recall_score(y_true, y_pred, pos_label="положительный") print(recall) 

    Выход. 0.6666666666666666.

    Дав определение Precision и Recall, давайте кратко подытожим их.

  • Precision представляет собой надежность модели в классификации положительных образцов, а Recall — количество положительных образцов, правильно предсказанных моделью.
  • Precision учитывает классификацию как положительных, так и отрицательных образцов, в то время как Recall использует только положительные образцы. Другими словами, Precision зависит как от отрицательных, так и от положительных образцов, а Recall — только от положительных.
  • Прецизионность учитывается при определении образца как Положительного, но не для правильной классификации всех объектов класса Положительных. Recall, с другой стороны, учитывает правильное предсказание всех положительных образцов, но не заботится о неправильной классификации отрицательных представителей как положительных.
  • В случае модели с высоким индексом Recall и низким индексом Precision такая модель правильно идентифицирует большинство положительных образцов, но имеет много ложных срабатываний (классификация отрицательных образцов как положительных). Если модель обладает высокой точностью, а уровень восстановления низкий, она будет определять положительные классы и делать высокоточные прогнозы, но таких прогнозов будет сделано всего несколько.
  • Также есть вопрос для проверки понимания.

  • Если recall равен 1.0, а в наборе данных имеется 5 объектов класса Positive, сколько образцов Positive правильно классифицировано моделью?
  • Если отзыв равен 0,3, а набор данных содержит 30 положительных образцов, сколько положительных образцов предсказано правильно?
  • Если Recall равен 0,0, а набор данных содержит 14 положительных образцов, сколько положительных образцов правильно предсказывает модель?
  • Precision или Recall?

    Что использовать — Precision или Recall — зависит от типа проблемы. Если ваша цель — выявить все положительные образцы (не заботясь о том, классифицируются ли отрицательные образцы как положительные или нет), используйте отзыв. Используйте точность, если задача включает сложные предсказания класса «Положительный», т.е. если вы хотите учесть отрицательные образцы, которые были неправильно классифицированы как положительные.

    Предположим, вам дают изображение и просят опознать все автомобили на нем. Какую метрику вы бы использовали? Мы используем функцию отзыва, поскольку наша цель — обнаружить все автомобили. Этот метод может неправильно классифицировать некоторые объекты как цели, но в конечном итоге он сможет предсказать все автомобили.

    Теперь предположим, что вас попросили сделать маммографию, чтобы проверить наличие рака. Какие показатели вы бы использовали? Мы должны быть уверены, когда классифицируем изображение как положительное (т.е. имеющее рак), поскольку это чувствительно к неправильной интерпретации изображения как злокачественного. Поэтому предпочтительной мерой в данном случае является «точность».

    Вывод

    В этом руководстве мы описали матрицу ошибок и рассчитали четыре метрики (истинно/ложно положительно/отрицательно) для задач бинарной и мультиклассовой классификации. Мы видели, как получить матрицу ошибок в Python с помощью модуля metrics библиотеки Scikit-learn.

    На основе этих четырех метрик мы обсудили метрики точности, корректности и воспроизводимости. Каждое из них было определено и использовано в нескольких примерах. Модуль sklearn.metrics используется для расчета каждой из вышеперечисленных метрик.

    В машинном обучении различают оценки качества для задачи классификации и регрессии. Причем оценка задачи классификации часто значительно сложнее, чем оценка регрессии.

    Содержание

    • 1 Оценки качества классификации
      • 1.1 Матрица ошибок (англ. Сonfusion matrix)
      • 1.2 Аккуратность (англ. Accuracy)
      • 1.3 Точность (англ. Precision)
      • 1.4 Полнота (англ. Recall)
      • 1.5 F-мера (англ. F-score)
      • 1.6 ROC-кривая
      • 1.7 Precison-recall кривая
    • 2 Оценки качества регрессии
      • 2.1 Средняя квадратичная ошибка (англ. Mean Squared Error, MSE)
      • 2.2 Cредняя абсолютная ошибка (англ. Mean Absolute Error, MAE)
      • 2.3 Коэффициент детерминации
      • 2.4 Средняя абсолютная процентная ошибка (англ. Mean Absolute Percentage Error, MAPE)
      • 2.5 Корень из средней квадратичной ошибки (англ. Root Mean Squared Error, RMSE)
      • 2.6 Cимметричная MAPE (англ. Symmetric MAPE, SMAPE)
      • 2.7 Средняя абсолютная масштабированная ошибка (англ. Mean absolute scaled error, MASE)
    • 3 Кросс-валидация
    • 4 Примечания
    • 5 См. также
    • 6 Источники информации

    Оценки качества классификации

    Матрица ошибок (англ. Сonfusion matrix)

    Перед переходом к самим метрикам необходимо ввести важную концепцию для описания этих метрик в терминах ошибок классификации — confusion matrix (матрица ошибок).
    Допустим, что у нас есть два класса и алгоритм, предсказывающий принадлежность каждого объекта одному из классов.
    Рассмотрим пример. Пусть банк использует систему классификации заёмщиков на кредитоспособных и некредитоспособных. При этом первым кредит выдаётся, а вторые получат отказ. Таким образом, обнаружение некредитоспособного заёмщика () можно рассматривать как «сигнал тревоги», сообщающий о возможных рисках.

    Любой реальный классификатор совершает ошибки. В нашем случае таких ошибок может быть две:

    • Кредитоспособный заёмщик распознается моделью как некредитоспособный и ему отказывается в кредите. Данный случай можно трактовать как «ложную тревогу».
    • Некредитоспособный заёмщик распознаётся как кредитоспособный и ему ошибочно выдаётся кредит. Данный случай можно рассматривать как «пропуск цели».

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

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

    • Некредитоспособный заёмщик классифицирован как некредитоспособный, т.е. положительный класс распознан как положительный. Наблюдения, для которых это имеет место называются истинно-положительными (True PositiveTP).
    • Кредитоспособный заёмщик классифицирован как кредитоспособный, т.е. отрицательный класс распознан как отрицательный. Наблюдения, которых это имеет место, называются истинно отрицательными (True NegativeTN).
    • Кредитоспособный заёмщик классифицирован как некредитоспособный, т.е. имела место ошибка, в результате которой отрицательный класс был распознан как положительный. Наблюдения, для которых был получен такой исход классификации, называются ложно-положительными (False PositiveFP), а ошибка классификации называется ошибкой I рода.
    • Некредитоспособный заёмщик распознан как кредитоспособный, т.е. имела место ошибка, в результате которой положительный класс был распознан как отрицательный. Наблюдения, для которых был получен такой исход классификации, называются ложно-отрицательными (False NegativeFN), а ошибка классификации называется ошибкой II рода.

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

    Истинно-положительный (True Positive — TP) Ложно-положительный (False Positive — FP)
    Ложно-отрицательный (False Negative — FN) Истинно-отрицательный (True Negative — TN)

    Здесь — это ответ алгоритма на объекте, а — истинная метка класса на этом объекте.
    Таким образом, ошибки классификации бывают двух видов: False Negative (FN) и False Positive (FP).
    P означает что классификатор определяет класс объекта как положительный (N — отрицательный). T значит что класс предсказан правильно (соответственно F — неправильно). Каждая строка в матрице ошибок представляет спрогнозированный класс, а каждый столбец — фактический класс.

     # код для матрицы ошибок
     # Пример классификатора, способного проводить различие между всего лишь двумя
     # классами, "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.metrics import confusion_matrix
     from sklearn.linear_model import SGDClassifier
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (англ. Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распозновать пятерки на целом обучающем наборе
     # Для расчета матрицы ошибок сначала понадобится иметь набор прогнозов, чтобы их можно было сравнивать с фактическими целями
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     print(confusion_matrix(y_train_5, y_train_pred))
     # array([[53892, 687],
     #        [ 1891, 3530]])
    

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

     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.metrics import confusion_matrix
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     y_train_perfect_predictions = y_train_5 # притворись, что мы достигли совершенства
     print(confusion_matrix(y_train_5, y_train_perfect_predictions))
     # array([[54579, 0],
     #        [ 0, 5421]])
    

    Аккуратность (англ. Accuracy)

    Интуитивно понятной, очевидной и почти неиспользуемой метрикой является accuracy — доля правильных ответов алгоритма:

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

    Допустим, мы хотим оценить работу спам-фильтра почты. У нас есть 100 не-спам писем, 90 из которых наш классификатор определил верно (True Negative = 90, False Positive = 10), и 10 спам-писем, 5 из которых классификатор также определил верно (True Positive = 5, False Negative = 5).
    Тогда accuracy:

    Однако если мы просто будем предсказывать все письма как не-спам, то получим более высокую аккуратность:

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

     # код для для подсчета аккуратности:
     # Пример классификатора, способного проводить различие между всего лишь двумя
     # классами, "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.metrics import accuracy_score
     from sklearn.linear_model import SGDClassifier
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распозновать пятерки на целом обучающем наборе
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     # print(confusion_matrix(y_train_5, y_train_pred))
     # array([[53892, 687]
     #        [ 1891, 3530]])
     print(accuracy_score(y_train_5, y_train_pred)) # == (53892 + 3530) / (53892 + 3530  + 1891 +687)
     
     # 0.9570333333333333
    

    Точность (англ. Precision)

    Точностью (precision) называется доля правильных ответов модели в пределах класса — это доля объектов действительно принадлежащих данному классу относительно всех объектов которые система отнесла к этому классу.

    Именно введение precision не позволяет нам записывать все объекты в один класс, так как в этом случае мы получаем рост уровня False Positive.

    Полнота (англ. Recall)

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

    Полнота (recall) демонстрирует способность алгоритма обнаруживать данный класс вообще.

    Имея матрицу ошибок, очень просто можно вычислить точность и полноту для каждого класса. Точность (precision) равняется отношению соответствующего диагонального элемента матрицы и суммы всей строки класса. Полнота (recall) — отношению диагонального элемента матрицы и суммы всего столбца класса. Формально:

    Результирующая точность классификатора рассчитывается как арифметическое среднее его точности по всем классам. То же самое с полнотой. Технически этот подход называется macro-averaging.

     # код для для подсчета точности и полноты:
     # Пример классификатора, способного проводить различие между всего лишь двумя
     # классами, "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.metrics import precision_score, recall_score
     from sklearn.linear_model import SGDClassifier
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распозновать пятерки на целом обучающем наборе
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     # print(confusion_matrix(y_train_5, y_train_pred))
     # array([[53892, 687]
     #        [ 1891, 3530]])
     print(precision_score(y_train_5, y_train_pred)) # == 3530 / (3530 + 687)
     print(recall_score(y_train_5, y_train_pred)) # == 3530 / (3530 + 1891)
       
     # 0.8370879772350012
     # 0.6511713705958311
    

    F-мера (англ. F-score)

    Precision и recall не зависят, в отличие от accuracy, от соотношения классов и потому применимы в условиях несбалансированных выборок.
    Часто в реальной практике стоит задача найти оптимальный (для заказчика) баланс между этими двумя метриками. Понятно что чем выше точность и полнота, тем лучше. Но в реальной жизни максимальная точность и полнота не достижимы одновременно и приходится искать некий баланс. Поэтому, хотелось бы иметь некую метрику которая объединяла бы в себе информацию о точности и полноте нашего алгоритма. В этом случае нам будет проще принимать решение о том какую реализацию запускать в производство (у кого больше тот и круче). Именно такой метрикой является F-мера.

    F-мера представляет собой гармоническое среднее между точностью и полнотой. Она стремится к нулю, если точность или полнота стремится к нулю.

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

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

    • Рис.1 Сбалансированная F-мера,

    • Рис.2 F-мера c приоритетом точности,

    • Рис.3 F-мера c приоритетом полноты,

    F-мера достигает максимума при максимальной полноте и точности, и близка к нулю, если один из аргументов близок к нулю.

    F-мера является хорошим кандидатом на формальную метрику оценки качества классификатора. Она сводит к одному числу две других основополагающих метрики: точность и полноту. Имея «F-меру» гораздо проще ответить на вопрос: «поменялся алгоритм в лучшую сторону или нет?»

     # код для подсчета метрики F-mera:
     # Пример классификатора, способного проводить различие между всего лишь двумя
     # классами, "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.linear_model import SGDClassifier
     from sklearn.metrics import f1_score
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распознавать пятерки на целом обучающем наборе
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     print(f1_score(y_train_5, y_train_pred))
     
     # 0.7325171197343846
    

    ROC-кривая

    Кривая рабочих характеристик (англ. Receiver Operating Characteristics curve).
    Используется для анализа поведения классификаторов при различных пороговых значениях.
    Позволяет рассмотреть все пороговые значения для данного классификатора.
    Показывает долю ложно положительных примеров (англ. false positive rate, FPR) в сравнении с долей истинно положительных примеров (англ. true positive rate, TPR).

    ROC 2.png

    Доля FPR — это пропорция отрицательных образцов, которые были некорректно классифицированы как положительные.

    ,

    где TNR — доля истинно отрицательных классификаций (англ. Тrие Negative Rate), пред­ставляющая собой пропорцию отрицательных образцов, которые были кор­ректно классифицированы как отрицательные.

    Доля TNR также называется специфичностью (англ. specificity). Следовательно, ROC-кривая изображает чувствительность (англ. seпsitivity), т.е. полноту, в срав­нении с разностью 1 — specificity.

    Прямая линия по диагонали представляет ROC-кривую чисто случайного классификатора. Хороший классификатор держится от указанной линии настолько далеко, насколько это
    возможно (стремясь к левому верхнему углу).

    Один из способов сравнения классификаторов предусматривает измере­ние площади под кривой (англ. Area Under the Curve — AUC). Безупречный клас­сификатор будет иметь площадь под ROC-кривой (ROC-AUC), равную 1, тогда как чисто случайный классификатор — площадь 0.5.

     # Код отрисовки ROC-кривой
     # На примере классификатора, способного проводить различие между всего лишь двумя классами
     # "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     from sklearn.metrics import roc_curve
     import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.linear_model import SGDClassifier
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5)  # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распозновать пятерки на целом обучающем наборе
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
     fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
     def plot_roc_curve(fpr, tpr, label=None):
         plt.plot(fpr, tpr, linewidth=2, label=label)
         plt.plot([0, 1], [0, 1], 'k--') # dashed diagonal
         plt.xlabel('False Positive Rate, FPR (1 - specificity)')
         plt.ylabel('True Positive Rate, TPR (Recall)')
         plt.title('ROC curve')
         plt.savefig("ROC.png")
     plot_roc_curve(fpr, tpr)
     plt.show()
    

    Precison-recall кривая

    Чувствительность к соотношению классов.
    Рассмотрим задачу выделения математических статей из множества научных статей. Допустим, что всего имеется 1.000.100 статей, из которых лишь 100 относятся к математике. Если нам удастся построить алгоритм , идеально решающий задачу, то его TPR будет равен единице, а FPR — нулю. Рассмотрим теперь плохой алгоритм, дающий положительный ответ на 95 математических и 50.000 нематематических статьях. Такой алгоритм совершенно бесполезен, но при этом имеет TPR = 0.95 и FPR = 0.05, что крайне близко к показателям идеального алгоритма.
    Таким образом, если положительный класс существенно меньше по размеру, то AUC-ROC может давать неадекватную оценку качества работы алгоритма, поскольку измеряет долю неверно принятых объектов относительно общего числа отрицательных. Так, алгоритм , помещающий 100 релевантных документов на позиции с 50.001-й по 50.101-ю, будет иметь AUC-ROC 0.95.

    Precison-recall (PR) кривая. Избавиться от указанной проблемы с несбалансированными классами можно, перейдя от ROC-кривой к PR-кривой. Она определяется аналогично ROC-кривой, только по осям откладываются не FPR и TPR, а полнота (по оси абсцисс) и точность (по оси ординат). Критерием качества семейства алгоритмов выступает площадь под PR-кривой (англ. Area Under the Curve — AUC-PR)

    PR curve.png

     # Код отрисовки Precison-recall кривой
     # На примере классификатора, способного проводить различие между всего лишь двумя классами
     # "пятерка" и "не пятерка" из набора рукописных цифр MNIST
     from sklearn.metrics import precision_recall_curve
     import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.datasets import fetch_openml
     from sklearn.model_selection import cross_val_predict
     from sklearn.linear_model import SGDClassifier
     mnist = fetch_openml('mnist_784', version=1)
     X, y = mnist["data"], mnist["target"]
     y = y.astype(np.uint8)
     X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
     y_train_5 = (y_train == 5) # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки
     y_test_5 = (y_test == 5)
     sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)
     sgd_clf.fit(X_train, y_train_5) # обучаем классификатор распозновать пятерки на целом обучающем наборе
     y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
     y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
     precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
     def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
         plt.plot(recalls, precisions, linewidth=2)
         plt.xlabel('Recall')
         plt.ylabel('Precision')
         plt.title('Precision-Recall curve')
         plt.savefig("Precision_Recall_curve.png")
     plot_precision_recall_vs_threshold(precisions, recalls, thresholds)
     plt.show()
    

    Оценки качества регрессии

    Наиболее типичными мерами качества в задачах регрессии являются

    Средняя квадратичная ошибка (англ. Mean Squared Error, MSE)

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

    и

    Cредняя абсолютная ошибка (англ. Mean Absolute Error, MAE)

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

    Среднеквадратичная ошибка подходит для сравнения двух моделей или для контроля качества во время обучения, но не позволяет сделать выводов о том, на сколько хорошо данная модель решает задачу. Например, MSE = 10 является очень плохим показателем, если целевая переменная принимает значения от 0 до 1, и очень хорошим, если целевая переменная лежит в интервале (10000, 100000). В таких ситуациях вместо среднеквадратичной ошибки полезно использовать коэффициент детерминации —

    Коэффициент детерминации

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

    Средняя абсолютная процентная ошибка (англ. Mean Absolute Percentage Error, MAPE)

    Это коэффициент, не имеющий размерности, с очень простой интерпретацией. Его можно измерять в долях или процентах. Если у вас получилось, например, что MAPE=11.4%, то это говорит о том, что ошибка составила 11,4% от фактических значений.
    Основная проблема данной ошибки — нестабильность.

    Корень из средней квадратичной ошибки (англ. Root Mean Squared Error, RMSE)

    Примерно такая же проблема, как и в MAPE: так как каждое отклонение возводится в квадрат, любое небольшое отклонение может значительно повлиять на показатель ошибки. Стоит отметить, что существует также ошибка MSE, из которой RMSE как раз и получается путем извлечения корня.

    Cимметричная MAPE (англ. Symmetric MAPE, SMAPE)

    Средняя абсолютная масштабированная ошибка (англ. Mean absolute scaled error, MASE)

    MASE является очень хорошим вариантом для расчета точности, так как сама ошибка не зависит от масштабов данных и является симметричной: то есть положительные и отрицательные отклонения от факта рассматриваются в равной степени.
    Обратите внимание, что в MASE мы имеем дело с двумя суммами: та, что в числителе, соответствует тестовой выборке, та, что в знаменателе — обучающей. Вторая фактически представляет собой среднюю абсолютную ошибку прогноза. Она же соответствует среднему абсолютному отклонению ряда в первых разностях. Эта величина, по сути, показывает, насколько обучающая выборка предсказуема. Она может быть равна нулю только в том случае, когда все значения в обучающей выборке равны друг другу, что соответствует отсутствию каких-либо изменений в ряде данных, ситуации на практике почти невозможной. Кроме того, если ряд имеет тенденцию к росту либо снижению, его первые разности будут колебаться около некоторого фиксированного уровня. В результате этого по разным рядам с разной структурой, знаменатели будут более-менее сопоставимыми. Всё это, конечно же, является очевидными плюсами MASE, так как позволяет складывать разные значения по разным рядам и получать несмещённые оценки.

    Недостаток MASE в том, что её тяжело интерпретировать. Например, MASE=1.21 ни о чём, по сути, не говорит. Это просто означает, что ошибка прогноза оказалась в 1.21 раза выше среднего абсолютного отклонения ряда в первых разностях, и ничего более.

    Кросс-валидация

    Хороший способ оценки модели предусматривает применение кросс-валидации (cкользящего контроля или перекрестной проверки).

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

    Примечания

    1. [1] Лекция «Оценивание качества» на www.coursera.org
    2. [2] Лекция на www.stepik.org о кросвалидации
    3. [3] Лекция на www.stepik.org о метриках качества, Precison и Recall
    4. [4] Лекция на www.stepik.org о метриках качества, F-мера
    5. [5] Лекция на www.stepik.org о метриках качества, примеры

    См. также

    • Оценка качества в задаче кластеризации
    • Кросс-валидация

    Источники информации

    1. [6] Соколов Е.А. Лекция линейная регрессия
    2. [7] — Дьяконов А. Функции ошибки / функционалы качества
    3. [8] — Оценка качества прогнозных моделей
    4. [9] — HeinzBr Ошибка прогнозирования: виды, формулы, примеры
    5. [10] — egor_labintcev Метрики в задачах машинного обучения
    6. [11] — grossu Методы оценки качества прогноза
    7. [12] — К.В.Воронцов, Классификация
    8. [13] — К.В.Воронцов, Скользящий контроль

    Гораздо легче что-то измерить, чем понять, что именно вы измеряете

    Джон Уильям Салливан

    Задачи машинного обучения с учителем как правило состоят в восстановлении зависимости между парами (признаковое описание, целевая переменная) по данным, доступным нам для анализа. Алгоритмы машинного обучения (learning algorithm), со многими из которых вы уже успели познакомиться, позволяют построить модель, аппроксимирующую эту зависимость. Но как понять, насколько качественной получилась аппроксимация?

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

    Перед чтением этой главы мы хотели бы ещё раз напомнить, что качество модели нельзя оценивать на обучающей выборке. Как минимум, это стоит делать на отложенной (тестовой) выборке, но, если вам это позволяют время и вычислительные ресурсы, стоит прибегнуть и к более надёжным способам проверки – например, кросс-валидации (о ней вы узнаете в отдельной главе).

    Выбор метрик в реальных задачах

    Возможно, вы уже участвовали в соревнованиях по анализу данных. На таких соревнованиях метрику (критерий качества модели) организатор выбирает за вас, и она, как правило, довольно понятным образом связана с результатами предсказаний. Но на практике всё бывает намного сложнее.

    Например, мы хотим:

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

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

    1. Самый верхний уровень: будущий доход сервиса – невозможно измерить в моменте, сложным образом зависит от совокупности всех наших усилий;
    2. Медианная длина сессии, возможно, служащая оценкой радости пользователей, которая, как мы надеемся, повлияет на их желание продолжать платить за подписку – её нам придётся измерять в продакшене, ведь нас интересует реакция настоящих пользователей на новшество;
    3. Доля удовлетворённых качеством сгенерированной музыки асессоров, на которых мы потестируем её до того, как выставить на суд пользователей;
    4. Функция потерь, на которую мы будем обучать генеративную сеть.

    На этом примере мы можем заметить сразу несколько общих закономерностей. Во-первых, метрики бывают offline и online (оффлайновыми и онлайновыми). Online метрики вычисляются по данным, собираемым с работающей системы (например, медианная длина сессии). Offline метрики могут быть измерены до введения модели в эксплуатацию, например, по историческим данным или с привлечением специальных людей, асессоров. Последнее часто применяется, когда метрикой является реакция живого человека: скажем, так поступают поисковые компании, которые предлагают людям оценить качество ранжирования экспериментальной системы еще до того, как рядовые пользователи увидят эти результаты в обычном порядке. На самом же нижнем этаже иерархии лежат оптимизируемые в ходе обучения функции потерь.

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

    Функция потерь $neq$ метрика качества

    Как мы узнали ранее, методы обучения реализуют разные подходы к обучению:

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

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

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

    Важно понимать разницу между функцией потерь и метрикой качества. Её можно сформулировать следующим образом:

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

    • Метрика – внешний, объективный критерий качества, обычно зависящий не от параметров модели, а только от предсказанных меток.

    В некоторых случаях метрика может совпадать с функцией потерь. Например, в задаче регрессии MSE играет роль как функции потерь, так и метрики. Но, скажем, в задаче бинарной классификации они почти всегда различаются: в качестве функции потерь может выступать кросс-энтропия, а в качестве метрики – число верно угаданных меток (accuracy). Отметим, что в последнем примере у них различные аргументы: на вход кросс-энтропии нужно подавать логиты, а на вход accuracy – предсказанные метки (то есть по сути argmax логитов).

    Бинарная классификация: метки классов

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

    Напомним постановку задачи бинарной классификации: нам нужно по обучающей выборке ${(x_i, y_i)}_{i=1}^N$, где $y_iin{0, 1}$ построить модель, которая по объекту $x$ предсказывает метку класса $f(x)in{0, 1}$.

    Первым критерием качества, который приходит в голову, является accuracy – доля объектов, для которых мы правильно предсказали класс:

    $$ color{#348FEA}{text{Accuracy}(y, y^{pred}) = frac{1}{N} sum_{i=1}^N mathbb{I}[y_i = f(x_i)]} $$

    Или же сопряженная ей метрика – доля ошибочных классификаций (error rate):

    $$text{Error rate} = 1 — text{Accuracy}$$

    Познакомившись чуть внимательнее с этой метрикой, можно заметить, что у неё есть несколько недостатков:

    • она не учитывает дисбаланс классов. Например, в задаче диагностики редких заболеваний классификатор, предсказывающий всем пациентам отсутствие болезни будет иметь достаточно высокую accuracy просто потому, что больных людей в выборке намного меньше;
    • она также не учитывает цену ошибки на объектах разных классов. Для примера снова можно привести задачу медицинской диагностики: если ошибочный положительный диагноз для здорового больного обернётся лишь ещё одним обследованием, то ошибочно отрицательный вердикт может повлечь роковые последствия.

    Confusion matrix (матрица ошибок)

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

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

    Заметим, что для каждого объекта в выборке возможно 4 ситуации:

    • мы предсказали положительную метку и угадали. Будет относить такие объекты к true positive (TP) группе (true – потому что предсказали мы правильно, а positive – потому что предсказали положительную метку);
    • мы предсказали положительную метку, но ошиблись в своём предсказании – false positive (FP) (false, потому что предсказание было неправильным);
    • мы предсказали отрицательную метку и угадалиtrue negative (TN);
    • и наконец, мы предсказали отрицательную метку, но ошиблисьfalse negative (FN). Для удобства все эти 4 числа изображают в виде таблицы, которую называют confusion matrix (матрицей ошибок):

    6_1.png

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

    6_2.png

    Пример

    Попробуем воспользоваться введёнными метриками в боевом примере: сравним работу нескольких моделей классификации на Breast cancer wisconsin (diagnostic) dataset.

    Объектами выборки являются фотографии биопсии грудных опухолей. С их помощью было сформировано признаковое описание, которое заключается в характеристиках ядер клеток (таких как радиус ядра, его текстура, симметричность). Положительным классом в такой постановке будут злокачественные опухоли, а отрицательным – доброкачественные.

    Модель 1. Константное предсказание.

    Решение задачи начнём с самого простого классификатора, который выдаёт на каждом объекте константное предсказание – самый часто встречающийся класс.

    Зачем вообще замерять качество на такой модели?При разработке модели машинного обучения для проекта всегда желательно иметь некоторую baseline модель. Так нам будет легче проконтролировать, что наша более сложная модель действительно дает нам прирост качества.

    from sklearn.datasets 
    import load_breast_cancer 
    the_data = load_breast_cancer()    
    
    # 0 – "доброкачественный" 
    # 1 – "злокачественный" 
    relabeled_target = 1 - the_data["target"] 
    
    from sklearn.model_selection import train_test_split 
    X = the_data["data"] 
    y = relabeled_target 
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) 
    
    from sklearn.dummy import DummyClassifier 
    dc_mf = DummyClassifier(strategy="most_frequent") 
    dc_mf.fit(X_train, y_train) 
    
    from sklearn.metrics import confusion_matrix 
    y_true = y_test y_pred = dc_mf.predict(X_test) 
    dc_mf_tn, dc_mf_fp, dc_mf_fn, dc_mf_tp = confusion_matrix(y_true, y_pred, labels = [0, 1]).ravel() 
    
    Прогнозируемый класс + Прогнозируемый класс —
    Истинный класс + TP = 0 FN = 53
    Истинный класс — FP = 0 TN = 90

    Обучающие данные таковы, что наш dummy-классификатор все объекты записывает в отрицательный класс, то есть признаёт все опухоли доброкачественными. Такой наивный подход позволяет нам получить минимальный штраф за FP (действительно, нельзя ошибиться в предсказании, если положительный класс вообще не предсказывается), но и максимальный штраф за FN (в эту группу попадут все злокачественные опухоли).

    Модель 2. Случайный лес.

    Настало время воспользоваться всем арсеналом моделей машинного обучения, и начнём мы со случайного леса.

    from sklearn.ensemble import RandomForestClassifier 
    rfc = RandomForestClassifier()       
    rfc.fit(X_train, y_train)       
    y_true = y_test       
    y_pred = rfc.predict(X_test)       
    rfc_tn, rfc_fp, rfc_fn, rfc_tp = confusion_matrix(y_true, y_pred, labels = [0, 1]).ravel()
    
    Прогнозируемый класс + Прогнозируемый класс —
    Истинный класс + TP = 52 FN = 1
    Истинный класс — FP = 4 TN = 86

    Можно сказать, что этот классификатор чему-то научился, т.к. главная диагональ матрицы стала содержать все объекты из отложенной выборки, за исключением 4 + 1 = 5 объектов (сравните с 0 + 53 объектами dummy-классификатора, все опухоли объявляющего доброкачественными).

    Отметим, что вычисляя долю недиагональных элементов, мы приходим к метрике error rate, о которой мы говорили в самом начале:

    $$text{Error rate} = frac{FP + FN}{ TP + TN + FP + FN}$$

    тогда как доля объектов, попавших на главную диагональ – это как раз таки accuracy:

    $$text{Accuracy} = frac{TP + TN}{ TP + TN + FP + FN}$$

    Модель 3. Метод опорных векторов.

    Давайте построим еще один классификатор на основе линейного метода опорных векторов.

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

    from sklearn.svm import LinearSVC
    from sklearn.preprocessing import StandardScaler 
    ss = StandardScaler() ss.fit(X_train) 
    scaled_linsvc = LinearSVC(C=0.01,random_state=42) 
    scaled_linsvc.fit(ss.transform(X_train), y_train) 
    y_true = y_test 
    y_pred = scaled_linsvc.predict(ss.transform(X_test)) 
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred, labels = [0, 1]).ravel() 
    
    Прогнозируемый класс + Прогнозируемый класс —
    Истинный класс + TP = 50 FN = 3
    Истинный класс — FP = 1 TN = 89

    Сравним результаты

    Легко заметить, что каждая из двух моделей лучше классификатора-пустышки, однако давайте попробуем сравнить их между собой. С точки зрения error rate модели практически одинаковы: 5/143 для леса против 4/143 для SVM.

    Посмотрим на структуру ошибок чуть более внимательно: лес – (FP = 4, FN = 1), SVM – (FP = 1, FN = 3). Какая из моделей предпочтительнее?

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

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

    Что же всё-таки важнее уменьшить: FP или FN? Вернёмся к задаче: FP – доля доброкачественных опухолей, которым ошибочно присваивается метка злокачественной, а FN – доля злокачественных опухолей, которые классификатор пропускает. В такой постановке становится понятно, что при сравнении выиграет модель с меньшим FN (то есть лес в нашем примере), ведь каждая не обнаруженная опухоль может стоить человеческой жизни.

    Рассмотрим теперь другую задачу: по данным о погоде предсказать, будет ли успешным запуск спутника. FN в такой постановке – это ошибочное предсказание неуспеха, то есть не более, чем упущенный шанс (если вас, конечно не уволят за срыв сроков). С FP всё серьёзней: если вы предскажете удачный запуск спутника, а на деле он потерпит крушение из-за погодных условий, то ваши потери будут в разы существеннее.

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

    Точность и полнота

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

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

    Пусть мы хотим решить задачу бинарной классификации «документ d релевантен по запросу q». Благодаря большому дисбалансу, Accuracy dummy-классификатора, объявляющего все документы нерелевантными, будет близка к единице. Напомним, что $text{Accuracy} = frac{TP + TN}{TP + TN + FP + FN}$, и в нашем случае высокое значение метрики будет обеспечено членом TN, в то время для пользователей более важен высокий TP.

    Поэтому в случае ассиметрии классов, можно использовать метрики, которые не учитывают TN и ориентируются на TP.

    Если мы рассмотрим долю правильно предсказанных положительных объектов среди всех объектов, предсказанных положительным классом, то мы получим метрику, которая называется точностью (precision)

    $$color{#348FEA}{text{Precision} = frac{TP}{TP + FP}}$$

    Интуитивно метрика показывает долю релевантных документов среди всех найденных классификатором. Чем меньше ложноположительных срабатываний будет допускать модель, тем больше будет её Precision.

    Если же мы рассмотрим долю правильно найденных положительных объектов среди всех объектов положительного класса, то мы получим метрику, которая называется полнотой (recall)

    $$color{#348FEA}{text{Recall} = frac{TP}{TP + FN}}$$

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

    Например, в задаче предсказания злокачественности опухоли точность показывает, сколько из определённых нами как злокачественные опухолей действительно являются злокачественными, а полнота – какую долю злокачественных опухолей нам удалось выявить.

    Хорошее понимание происходящего даёт следующая картинка: 6_3.png (источник картинки)

    Recall@k, Precision@k

    Метрики Recall и Precision хорошо подходят для задачи поиска «документ d релевантен запросу q», когда из списка рекомендованных алгоритмом документов нас интересует только первый. Но не всегда алгоритм машинного обучения вынужден работать в таких жестких условиях. Может быть такое, что вполне достаточно, что релевантный документ попал в первые k рекомендованных. Например, в интерфейсе выдачи первые три подсказки видны всегда одновременно и вообще не очень понятно, какой у них порядок. Тогда более честной оценкой качества алгоритма будет «в выдаче D размера k по запросу q нашлись релевантные документы». Для расчёта метрики по всей выборке объединим все выдачи и рассчитаем precision, recall как обычно подокументно.

    F1-мера

    Как мы уже отмечали ранее, модели очень удобно сравнивать, когда их качество выражено одним числом. В случае пары Precision-Recall существует популярный способ скомпоновать их в одну метрику — взять их среднее гармоническое. Данный показатель эффективности исторически носит название F1-меры (F1-measure).

    $$
    color{#348FEA}{F_1 = frac{2}{frac{1}{Recall} + frac{1}{Precision}}} = $$

    $$ = 2 frac{Recall cdot Precision }{Recall + Precision} = frac
    {TP} {TP + frac{FP + FN}{2}}
    $$

    Стоит иметь в виду, что F1-мера предполагает одинаковую важность Precision и Recall, если одна из этих метрик для вас приоритетнее, то можно воспользоваться $F_{beta}$ мерой:

    $$
    F_{beta} = (beta^2 + 1) frac{Recall cdot Precision }{Recall + beta^2Precision}
    $$

    Бинарная классификация: вероятности классов

    Многие модели бинарной классификации устроены так, что класс объекта получается бинаризацией выхода классификатора по некоторому фиксированному порогу:

    $$fleft(x ; w, w_{0}right)=mathbb{I}left[g(x, w) > w_{0}right].$$

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

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

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

    AUC

    Пусть мы хотим учитывать ошибки на объектах обоих классов. При уменьшении порога отсечения мы будем находить (правильно предсказывать) всё большее число положительных объектов, но также и неправильно предсказывать положительную метку на всё большем числе отрицательных объектов. Естественным кажется ввести две метрики TPR и FPR:

    TPR (true positive rate) – это полнота, доля положительных объектов, правильно предсказанных положительными:

    $$ TPR = frac{TP}{P} = frac{TP}{TP + FN} $$

    FPR (false positive rate) – это доля отрицательных объектов, неправильно предсказанных положительными:

    $$FPR = frac{FP}{N} = frac{FP}{FP + TN}$$

    Обе эти величины растут при уменьшении порога. Кривая в осях TPR/FPR, которая получается при варьировании порога, исторически называется ROC-кривой (receiver operating characteristics curve, сокращённо ROC curve). Следующий график поможет вам понять поведение ROC-кривой.

    Желтая и синяя кривые показывают распределение предсказаний классификатора на объектах положительного и отрицательного классов соответственно. То есть значения на оси X (на графике с двумя гауссианами) мы получаем из классификатора. Если классификатор идеальный (две кривые разделимы по оси X), то на правом графике мы получаем ROC-кривую (0,0)->(0,1)->(1,1) (убедитесь сами!), площадь под которой равна 1. Если классификатор случайный (предсказывает одинаковые метки положительным и отрицательным объектам), то мы получаем ROC-кривую (0,0)->(1,1), площадь под которой равна 0.5. Поэкспериментируйте с разными вариантами распределения предсказаний по классам и посмотрите, как меняется ROC-кривая.

    Чем лучше классификатор разделяет два класса, тем больше площадь (area under curve) под ROC-кривой – и мы можем использовать её в качестве метрики. Эта метрика называется AUC и она работает благодаря следующему свойству ROC-кривой:

    AUC равен доле пар объектов вида (объект класса 1, объект класса 0), которые алгоритм верно упорядочил, т.е. предсказание классификатора на первом объекте больше:

    $$
    color{#348FEA}{operatorname{AUC} = frac{sumlimits_{i = 1}^{N} sumlimits_{j = 1}^{N}mathbb{I}[y_i < y_j] I^{prime}[f(x_{i}) < f(x_{j})]}{sumlimits_{i = 1}^{N} sumlimits_{j = 1}^{N}mathbb{I}[y_i < y_j]}}
    $$

    $$
    I^{prime}left[f(x_{i}) < f(x_{j})right]=
    left{
    begin{array}{ll}
    0, & f(x_{i}) > f(x_{j}) \
    0.5 & f(x_{i}) = f(x_{j}) \
    1, & f(x_{i}) < f(x_{j})
    end{array}
    right.
    $$

    $$
    Ileft[y_{i}< y_{j}right]=
    left{
    begin{array}{ll}
    0, & y_{i} geq y_{j} \
    1, & y_{i} < y_{j}
    end{array}
    right.
    $$

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

    В каких случаях лучше отдать предпочтение этой метрике? Рассмотрим следующую задачу: некоторый сотовый оператор хочет научиться предсказывать, будет ли клиент пользоваться его услугами через месяц. На первый взгляд кажется, что задача сводится к бинарной классификации с метками 1, если клиент останется с компанией и $0$ – иначе.

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

    Таким образом, в любой задаче, где нам важна не метка сама по себе, а правильный порядок на объектах, имеет смысл применять AUC.

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

    ПодробнееУтверждение выше может вызывать у вас желание использовать AUC в качестве метрики в задачах ранжирования, но мы призываем вас быть аккуратными.» details=»Продемонстрируем это на следующем примере: пусть наша выборка состоит из $9100$ объектов класса $0$ и $10$ объектов класса $1$, и модель расположила их следующим образом:

    $$underbrace{0 dots 0}_{9000} ~ underbrace{1 dots 1}_{10} ~ underbrace{0 dots 0}_{100}$$

    Тогда AUC будет близка к единице: количество пар правильно расположенных объектов будет порядка $90000$, в то время как общее количество пар порядка $91000$.

    Однако самыми высокими по вероятности положительного класса будут совсем не те объекты, которые мы ожидаем.

    Average Precision

    Будем постепенно уменьшать порог бинаризации. При этом полнота будет расти от $0$ до $1$, так как будет увеличиваться количество объектов, которым мы приписываем положительный класс (а количество объектов, на самом деле относящихся к положительному классу, очевидно, меняться не будет). Про точность же нельзя сказать ничего определённого, но мы понимаем, что скорее всего она будет выше при более высоком пороге отсечения (мы оставим только объекты, в которых модель «уверена» больше всего). Варьируя порог и пересчитывая значения Precision и Recall на каждом пороге, мы получим некоторую кривую примерно следующего вида:

    6_4.png (источник картинки)

    Рассмотрим среднее значение точности (оно равно площади под кривой точность-полнота):

    $$ text { AP }=int_{0}^{1} p(r) d r$$

    Получим показатель эффективности, который называется average precision. Как в случае матрицы ошибок мы переходили к скалярным показателям эффективности, так и в случае с кривой точность-полнота мы охарактеризовали ее в виде числа.

    Многоклассовая классификация

    Если классов становится больше двух, расчёт метрик усложняется. Если задача классификации на $K$ классов ставится как $K$ задач об отделении класса $i$ от остальных ($i=1,ldots,K$), то для каждой из них можно посчитать свою матрицу ошибок. Затем есть два варианта получения итогового значения метрики из $K$ матриц ошибок:

    1. Усредняем элементы матрицы ошибок (TP, FP, TN, FN) между бинарными классификаторами, например $TP = frac{1}{K}sum_{i=1}^{K}TP_i$. Затем по одной усреднённой матрице ошибок считаем Precision, Recall, F-меру. Это называют микроусреднением.
    2. Считаем Precision, Recall для каждого классификатора отдельно, а потом усредняем. Это называют макроусреднением.

    Порядок усреднения влияет на результат в случае дисбаланса классов. Показатели TP, FP, FN — это счётчики объектов. Пусть некоторый класс обладает маленькой мощностью (обозначим её $M$). Тогда значения TP и FN при классификации этого класса против остальных будут не больше $M$, то есть тоже маленькие. Про FP мы ничего уверенно сказать не можем, но скорее всего при дисбалансе классов классификатор не будет предсказывать редкий класс слишком часто, потому что есть большая вероятность ошибиться. Так что FP тоже мало. Поэтому усреднение первым способом сделает вклад маленького класса в общую метрику незаметным. А при усреднении вторым способом среднее считается уже для нормированных величин, так что вклад каждого класса будет одинаковым.

    Рассмотрим пример. Пусть есть датасет из объектов трёх цветов: желтого, зелёного и синего. Желтого и зелёного цветов почти поровну — 21 и 20 объектов соответственно, а синих объектов всего 4.

    6_5.png

    Модель по очереди для каждого цвета пытается отделить объекты этого цвета от объектов оставшихся двух цветов. Результаты классификации проиллюстрированы матрицей ошибок. Модель «покрасила» в жёлтый 25 объектов, 20 из которых были действительно жёлтыми (левый столбец матрицы). В синий был «покрашен» только один объект, который на самом деле жёлтый (средний столбец матрицы). В зелёный — 19 объектов, все на самом деле зелёные (правый столбец матрицы).

    6_6.png

    Посчитаем Precision классификации двумя способами:

    1. С помощью микроусреднения получаем $$
      text{Precision} = frac{dfrac{1}{3}left(20 + 0 + 19right)}{dfrac{1}{3}left(20 + 0 + 19right) + dfrac{1}{3}left(5 + 1 + 0right)} = 0.87
      $$
    2. С помощью макроусреднения получаем $$
      text{Precision} = dfrac{1}{3}left( frac{20}{20 + 5} + frac{0}{0 + 1} + frac{19}{19 + 0}right) = 0.6
      $$

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

    Как оптимизировать метрики классификации?

    Пусть мы выбрали, что метрика качества алгоритма будет $F(a(X), Y)$. Тогда мы хотим обучить модель так, чтобы $F$ на валидационной выборке была минимальная/максимальная. Лучший способ добиться минимизации метрики $F$ — оптимизировать её напрямую, то есть выбрать в качестве функции потерь ту же $F(a(X), Y)$. К сожалению, это не всегда возможно. Рассмотрим, как оптимизировать метрики иначе.

    Метрики precision и recall невозможно оптимизировать напрямую, потому что эти метрики нельзя рассчитать на одном объекте, а затем усреднить. Они зависят от того, какими были правильная метка класса и ответ алгоритма на всех объектах. Чтобы понять, как оптимизировать precision, recall, рассмотрим, как расчитать эти метрики на отложенной выборке. Пусть модель обучена на стандартную для классификации функцию потерь (LogLoss). Для получения меток класса специалист по машинному обучению сначала применяет на объектах модель и получает вещественные предсказания модели ($p_i in left(0, 1right)$). Затем предсказания бинаризуются по порогу, выбранному специалистом: если предсказание на объекте больше порога, то метка класса 1 (или «положительная»), если меньше — 0 (или «отрицательная»). Рассмотрим, что будет с метриками precision, recall в крайних положениях порога.

    1. Пусть порог равен нулю. Тогда всем объектам будет присвоена положительная метка. Следовательно, все объекты будут либо TP, либо FP, потому что отрицательных предсказаний нет, $TP + FP = N$, где $N$ — размер выборки. Также все объекты, у которых метка на самом деле 1, попадут в TP. По формуле точность $text{Precision} = frac{TP}{TP + FP} = frac1N sum_{i = 1}^N mathbb{I} left[ y_i = 1 right]$ равна среднему таргету в выборке. А полнота $text{Recall} = frac{TP}{TP + FN} = frac{TP}{TP + 0} = 1$ равна единице.
    2. Пусть теперь порог равен единице. Тогда ни один объект не будет назван положительным, $TP = FP = 0$. Все объекты с меткой класса 1 попадут в FN. Если есть хотя бы один такой объект, то есть $FN ne 0$, будет верна формула $text{Recall} = frac{TP}{TP + FN} = frac{0}{0+ FN} = 0$. То есть при пороге единица, полнота равна нулю. Теперь посмотрим на точность. Формула для Precision состоит только из счётчиков положительных ответов модели (TP, FP). При единичном пороге они оба равны нулю, $text{Precision} = frac{TP}{TP + FP} = frac{0}{0 + 0}$то есть при единичном пороге точность неопределена. Пусть мы отступили чуть-чуть назад по порогу, чтобы хотя бы несколько объектов были названы моделью положительными. Скорее всего это будут самые «простые» объекты, которые модель распознает хорошо, потому что её предсказание близко к единице. В этом предположении $FP approx 0$. Тогда точность $text{Precision} = frac{TP}{TP + FP} approx frac{TP}{TP + 0} approx 1$ будет близка к единице.

    Изменяя порог, между крайними положениями, получим графики Precision и Recall, которые выглядят как-то так:

    6_7.png

    Recall меняется от единицы до нуля, а Precision от среднего тагрета до какого-то другого значения (нет гарантий, что график монотонный).

    Итого оптимизация precision и recall происходит так:

    1. Модель обучается на стандартную функцию потерь (например, LogLoss).
    2. Используя вещественные предсказания на валидационной выборке, перебирая разные пороги от 0 до 1, получаем графики метрик в зависимости от порога.
    3. Выбираем нужное сочетание точности и полноты.

    Пусть теперь мы хотим максимизировать метрику AUC. Стандартный метод оптимизации, градиентный спуск, предполагает, что функция потерь дифференцируема. AUC этим качеством не обладает, то есть мы не можем оптимизировать её напрямую. Поэтому для метрики AUC приходится изменять оптимизационную задачу. Метрика AUC считает долю верно упорядоченных пар. Значит от исходной выборки можно перейти к выборке упорядоченных пар объектов. На этой выборке ставится задача классификации: метка класса 1 соответствует правильно упорядоченной паре, 0 — неправильно. Новой метрикой становится accuracy — доля правильно классифицированных объектов, то есть доля правильно упорядоченных пар. Оптимизировать accuracy можно по той же схеме, что и precision, recall: обучаем модель на LogLoss и предсказываем вероятности положительной метки у объекта выборки, считаем accuracy для разных порогов по вероятности и выбираем понравившийся.

    Регрессия

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

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

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

    Общая рекомендация такова: оценивайте весь каскад решающих правил: и те «внутренние», которые вы получаете в результате обучения, и те «итоговые», которые вы отдаёте бизнес-заказчику.

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

    Итак, напомним постановку задачи регрессии: нам нужно по обучающей выборке ${(x_i, y_i)}_{i=1}^N$, где $y_i in mathbb{R}$ построить модель f(x).

    Величину $ e_i = f(x_i) — y_i $ называют ошибкой на объекте i или регрессионным остатком.

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

    MSE, RMSE, $R^2$

    MSE – одна из самых популярных метрик в задаче регрессии. Она уже знакома вам, т.к. применяется в качестве функции потерь (или входит в ее состав) во многих ранее рассмотренных методах.

    $$ MSE(y^{true}, y^{pred}) = frac1Nsum_{i=1}^{N} (y_i — f(x_i))^2 $$

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

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

    • Берут наилучшее константное предсказание с точки зрения MSE — среднее арифметическое меток $bar{y}$. При этом чтобы не было подглядывания в test, среднее нужно вычислять по обучающей выборке

    • Рассматривают в качестве показателя ошибки:

      $$ R^2 = 1 — frac{sum_{i=1}^{N} (y_i — f(x_i))^2}{sum_{i=1}^{N} (y_i — bar{y})^2}.$$

      У идеального решающего правила $R^2$ равен $1$, у наилучшего константного предсказания он равен $0$ на обучающей выборке. Можно заметить, что $R^2$ показывает, какая доля дисперсии таргетов (знаменатель) объяснена моделью.

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

    Пусть теперь мы хотим использовать MSE для оценки наших регрессионных моделей. Если большие ошибки для нас действительно неприемлемы, то квадратичный штраф за них — очень полезное свойство (и его даже можно усиливать, повышая степень, в которую мы возводим ошибку на объекте). Однако если в наших тестовых данных присутствуют выбросы, то нам будет сложно объективно сравнить модели между собой: ошибки на выбросах будет маскировать различия в ошибках на основном множестве объектов.

    Таким образом, если мы будем сравнивать две модели при помощи MSE, у нас будет выигрывать та модель, у которой меньше ошибка на объектах-выбросах, а это, скорее всего, не то, чего требует от нас наша бизнес-задача.

    История из жизни про бананы и квадратичный штраф за ошибкуИз-за неверно введенных данных метка одного из объектов оказалась в 100 раз больше реального значения. Моделировалась величина при помощи градиентного бустинга над деревьями решений. Функция потерь была MSE.

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

    Было решено проверить гипотезу, что был выброс в данных для обучения. Так оно и оказалось: всего одна точка давала такую потерю на объекте, что алгоритм обучения решил, что лучше переобучиться под этот выброс, чем смириться с большим штрафом на этом объекте. А в эксплуатации у нас возникли точки, которые плюс-минус попадали в такие же листья ансамбля, что и объект-выброс.

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

    Аналогично, можно поступать и в случае, когда мы разрабатываем метрику качества: менее жёстко штрафовать за большие отклонения от истинного таргета.

    MAE

    Использовать RMSE для сравнения моделей на выборках с большим количеством выбросов может быть неудобно. В таких случаях прибегают к также знакомой вам в качестве функции потери метрике MAE (mean absolute error):

    $$ MAE(y^{true}, y^{pred}) = frac{1}{N}sum_{i=1}^{N} left|y_i — f(x_i)right| $$

    Метрики, учитывающие относительные ошибки

    И MSE и MAE считаются как сумма абсолютных ошибок на объектах.

    Рассмотрим следующую задачу: мы хотим спрогнозировать спрос товаров на следующий месяц. Пусть у нас есть два продукта: продукт A продаётся в количестве 100 штук, а продукт В в количестве 10 штук. И пусть базовая модель предсказывает количество продаж продукта A как 98 штук, а продукта B как 8 штук. Ошибки на этих объектах добавляют 4 штрафных единицы в MAE.

    И есть 2 модели-кандидата на улучшение. Первая предсказывает товар А 99 штук, а товар B 8 штук. Вторая предсказывает товар А 98 штук, а товар B 9 штук.

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

    MAPE, SMAPE

    Когда речь заходит об относительных ошибках, сразу возникает вопрос: что мы будем ставить в знаменатель?

    В метрике MAPE (mean absolute percentage error) в знаменатель помещают целевое значение:

    $$ MAPE(y^{true}, y^{pred}) = frac{1}{N} sum_{i=1}^{N} frac{ left|y_i — f(x_i)right|}{left|y_iright|} $$

    С особым случаем, когда в знаменателе оказывается $0$, обычно поступают «инженерным» способом: или выдают за непредсказание $0$ на таком объекте большой, но фиксированный штраф, или пытаются застраховаться от подобного на уровне формулы и переходят к метрике SMAPE (symmetric mean absolute percentage error):

    $$ SMAPE(y^{true}, y^{pred}) = frac{1}{N} sum_{i=1}^{N} frac{ 2 left|y_i — f(x_i)right|}{y_i + f(x_i)} $$

    Если же предсказывается ноль, штраф считаем нулевым.

    Таким переходом от абсолютных ошибок на объекте к относительным мы сделали объекты в тестовой выборке равнозначными: даже если мы делаем абсурдно большое предсказание, на фоне которого истинная метка теряется, мы получаем штраф за этот объект порядка 1 в случае MAPE и 2 в случае SMAPE.

    WAPE

    Как и любая другая метрика, MAPE имеет свои границы применимости: например, она плохо справляется с прогнозом спроса на товары с прерывистыми продажами. Рассмотрим такой пример:

    Понедельник Вторник Среда
    Прогноз 55 2 50
    Продажи 50 1 50
    MAPE 10% 100% 0%

    Среднее MAPE – 36.7%, что не очень отражает реальную ситуацию, ведь два дня мы предсказывали с хорошей точностью. В таких ситуациях помогает WAPE (weighted average percentage error):

    $$ WAPE(y^{true}, y^{pred}) = frac{sum_{i=1}^{N} left|y_i — f(x_i)right|}{sum_{i=1}^{N} left|y_iright|} $$

    Если мы предсказываем идеально, то WAPE = 0, если все предсказания отдаём нулевыми, то WAPE = 1.

    В нашем примере получим WAPE = 5.9%

    RMSLE

    Альтернативный способ уйти от абсолютных ошибок к относительным предлагает метрика RMSLE (root mean squared logarithmic error):

    $$ RMSLE(y^{true}, y^{pred}| c) = sqrt{ frac{1}{N} sum_{i=1}^N left(vphantom{frac12}log{left(y_i + c right)} — log{left(f(x_i) + c right)}right)^2 } $$

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

    Веса в метриках

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

    Доля предсказаний с абсолютными ошибками больше, чем d

    Еще одним способом охарактеризовать качество модели в задаче регрессии является доля предсказаний с абсолютными ошибками больше заданного порога $d$:

    $$frac{1}{N} sum_{i=1}^{N} mathbb{I}left[ left| y_i — f(x_i) right| > d right] $$

    Например, можно считать, что прогноз погоды сбылся, если ошибка предсказания составила меньше 1/2/3 градусов. Тогда рассматриваемая метрика покажет, в какой доле случаев прогноз не сбылся.

    Как оптимизировать метрики регрессии?

    Пусть мы выбрали, что метрика качества алгоритма будет $F(a(X), Y)$. Тогда мы хотим обучить модель так, чтобы F на валидационной выборке была минимальная/максимальная. Аналогично задачам классификации лучший способ добиться минимизации метрики $F$ — выбрать в качестве функции потерь ту же $F(a(X), Y)$. К счастью, основные метрики для регрессии: MSE, RMSE, MAE можно оптимизировать напрямую. С формальной точки зрения MAE не дифференцируема, так как там присутствует модуль, чья производная не определена в нуле. На практике для этого выколотого случая в коде можно возвращать ноль.

    Для оптимизации MAPE придётся изменять оптимизационную задачу. Оптимизацию MAPE можно представить как оптимизацию MAE, где объектам выборки присвоен вес $frac{1}{vert y_ivert}$.

    В компьютерном зрении обнаружение объекта — это проблема определения местоположения одного или нескольких объектов на изображении. Помимо традиционных методов обнаружения, продвинутые модели глубокого обучения, такие как R-CNN и YOLO, могут обеспечить впечатляющие результаты при различных типах объектов. Эти модели принимают изображение в качестве входных данных и возвращают координаты прямоугольника, ограничивающего пространство вокруг каждого найденного объекта.

    В этом руководстве обсуждается матрица ошибок и то, как рассчитываются precision, recall и accuracy метрики.

    Здесь мы рассмотрим:

    • Матрицу ошибок для двоичной классификации.
    • Матрицу ошибок для мультиклассовой классификации.
    • Расчет матрицы ошибок с помощью Scikit-learn.
    • Accuracy, Precision и Recall.
    • Precision или Recall?

    Матрица ошибок для бинарной классификации

    В бинарной классификации каждая выборка относится к одному из двух классов. Обычно им присваиваются такие метки, как 1 и 0, или положительный и отрицательный (Positive и Negative). Также могут использоваться более конкретные обозначения для классов: злокачественный или доброкачественный (например, если проблема связана с классификацией рака), успех или неудача (если речь идет о классификации результатов тестов учащихся).

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

    positive, negative, negative, positive, positive, positive, negative

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

    0.6, 0.2, 0.55, 0.9, 0.4, 0.8, 0.5

    На основании полученных оценок каждой выборке присваивается соответствующий класс. Такое преобразование числовых результатов в метки происходит с помощью порогового значения. Данное граничное условие является гиперпараметром модели и может быть определено пользователем. Например, если порог равен 0.5, тогда любая оценка, которая больше или равна 0.5, получает положительную метку. В противном случае — отрицательную. Вот предсказанные алгоритмом классы:

    positive (0.6), negative (0.2), positive (0.55), positive (0.9), negative (0.4), positive (0.8), positive (0.5)

    Сравните достоверные и полученные метки — мы имеем 4 верных и 3 неверных предсказания. Стоит добавить, что изменение граничного условия отражается на результатах. Например, установка порога, равного 0.6, оставляет только два неверных прогноза.

    Реальность: positive, negative, negative, positive, positive, positive, negative 
    Предсказания: positive, negative, positive, positive, negative, positive, positive

    Для получения дополнительной информации о характеристиках модели используется матрица ошибок (confusion matrix). Матрица ошибок помогает нам визуализировать, «ошиблась» ли модель при различении двух классов. Как видно на следующем рисунке, это матрица 2х2. Названия строк представляют собой эталонные метки, а названия столбцов — предсказанные.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

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

    1. True или False.
    2. Positive или Negative.

    True, если получено верное предсказание, то есть эталонные и предсказанные метки классов совпадают, и False, когда они не совпадают. Positive или Negative — названия предсказанных меток.

    Таким образом, всякий раз, когда прогноз неверен, первое слово в ячейке False, когда верен — True. Наша цель состоит в том, чтобы максимизировать показатели со словом «True» (True Positive и True Negative) и минимизировать два других (False Positive и False Negative). Четыре метрики в матрице ошибок представляют собой следующее:

    1. Верхний левый элемент (True Positive): сколько раз модель правильно классифицировала Positive как Positive?
    2. Верхний правый (False Negative): сколько раз модель неправильно классифицировала Positive как Negative?
    3. Нижний левый (False Positive): сколько раз модель неправильно классифицировала Negative как Positive?
    4. Нижний правый (True Negative): сколько раз модель правильно классифицировала Negative как Negative?

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

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

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

    Матрица ошибок для мультиклассовой классификации

    Что, если у нас более двух классов? Как вычислить эти четыре метрики в матрице ошибок для задачи мультиклассовой классификации? Очень просто!

    Предположим, имеется 9 семплов, каждый из которых относится к одному из трех классов: White, Black или Red. Вот достоверные метки для 9 выборок:

    Red, Black, Red, White, White, Red, Black, Red, White

    После загрузки данных модель делает следующее предсказание:

    Red, White, Black, White, Red, Red, Black, White, Red

    Для удобства сравнения здесь они расположены рядом.

    Реальность: Red, Black, Red, White, White, Red, Black, Red, White Предсказания: Red, White, Black, White, Red, Red, Black, White, Red

    Перед вычислением матрицы ошибок необходимо выбрать целевой класс. Давайте назначим на эту роль класс Red. Он будет отмечен как Positive, а все остальные отмечены как Negative.

    Positive, Negative, Positive, Negative, Negative, Positive, Negative, Positive, Negative Positive, Negative, Negative, Negative, Positive, Positive, Negative, Negative, Positive

    11111111111111111111111После замены остались только два класса (Positive и Negative), что позволяет нам рассчитать матрицу ошибок, как было показано в предыдущем разделе. Стоит заметить, что полученная матрица предназначена только для класса Red.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    Далее для класса White заменим каждое его вхождение на Positive, а метки всех остальных классов на Negative. Мы получим такие достоверные и предсказанные метки:

    Negative, Negative, Negative, Positive, Positive, Negative, Negative, Negative, Positive Negative, Positive, Negative, Positive, Negative, Negative, Negative, Positive, Negative

    На следующей схеме показана матрица ошибок для класса White.

    матрица ошибок для класса White

    Точно так же может быть получена матрица ошибок для Black.

    Расчет матрицы ошибок с помощью Scikit-Learn

    В популярной Python-библиотеке Scikit-learn есть модуль metrics, который можно использовать для вычисления метрик в матрице ошибок.

    Для задач с двумя классами используется функция confusion_matrix(). Мы передадим в функцию следующие параметры:

    1. y_true: эталонные метки.
    2. y_pred: предсказанные метки.

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

    import sklearn.metrics
    
    y_true = ["positive", "negative", "negative", "positive", "positive", "positive", "negative"]
    y_pred = ["positive", "negative", "positive", "positive", "negative", "positive", "positive"]
    
    r = sklearn.metrics.confusion_matrix(y_true, y_pred)
    print(r)
    

    array([[1, 2],
           [1, 3]], dtype=int64)

    Обратите внимание, что порядок метрик отличается от описанного выше. Например, показатель True Positive находится в правом нижнем углу, а True Negative — в верхнем левом углу. Чтобы исправить это, мы можем перевернуть матрицу.

    import numpy
    
    r = numpy.flip(r)
    print(r)
    

    array([[3, 1],
           [2, 1]], dtype=int64)

    Чтобы вычислить матрицу ошибок для задачи с большим числом классов, используется функция multilabel_confusion_matrix(), как показано ниже. В дополнение к параметрам y_true и y_pred третий параметр labels принимает список классовых меток.

    import sklearn.metrics
    import numpy
    
    y_true = ["Red", "Black", "Red",   "White", "White", "Red", "Black", "Red",   "White"]
    y_pred = ["Red", "White", "Black", "White", "Red",   "Red", "Black", "White", "Red"]
    
    r = sklearn.metrics.multilabel_confusion_matrix(y_true, y_pred, labels=["White", "Black", "Red"])
    print(r)
    

    array([
        [[4 2]
         [2 1]]
    
        [[6 1]
         [1 1]]
        
        [[3 2]
         [2 2]]], dtype=int64)

    Функция вычисляет матрицу ошибок для каждого класса и возвращает все матрицы. Их порядок соответствует порядку меток в параметре labels. Чтобы изменить последовательность метрик в матрицах, мы будем снова использовать функцию numpy.flip().

    print(numpy.flip(r[0]))  # матрица ошибок для класса White
    print(numpy.flip(r[1]))  # матрица ошибок для класса Black
    print(numpy.flip(r[2]))  # матрица ошибок для класса Red
    

    # матрица ошибок для класса White
    [[1 2]
     [2 4]]
    
    # матрица ошибок для класса Black
    [[1 1]
     [1 6]]
    
    # матрица ошибок для класса Red
    [[2 2]
     [2 3]]

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

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

    1. Accuracy
    2. Precision
    3. Recall

    В следующих подразделах обсуждается каждый из этих трех показателей.

    Метрика Accuracy

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

    Рассчитаем accuracy с помощью Scikit-learn на основе ранее полученной матрицы ошибок. Переменная acc содержит результат деления суммы True Positive и True Negative метрик на сумму всех значений матрицы. Таким образом, accuracy, равная 0.5714, означает, что модель с точностью 57,14% делает верный прогноз.

    import numpy
    import sklearn.metrics
    
    y_true = ["positive", "negative", "negative", "positive", "positive", "positive", "negative"]
    y_pred = ["positive", "negative", "positive", "positive", "negative", "positive", "positive"]
    
    r = sklearn.metrics.confusion_matrix(y_true, y_pred)
    r = numpy.flip(r)
    
    acc = (r[0][0] + r[-1][-1]) / numpy.sum(r)
    print(acc)
    # вывод будет 0.571
    

    В модуле sklearn.metrics есть функция precision_score(), которая также может вычислять accuracy. Она принимает в качестве аргументов достоверные и предсказанные метки.

    acc = sklearn.metrics.accuracy_score(y_true, y_pred)
    

    Стоит учесть, что метрика accuracy может быть обманчивой. Один из таких случаев — это несбалансированные данные. Предположим, у нас есть всего 600 единиц данных, из которых 550 относятся к классу Positive и только 50 — к Negative. Поскольку большинство семплов принадлежит к одному классу, accuracy для этого класса будет выше, чем для другого.

    Если модель сделала 530 правильных прогнозов из 550 для класса Positive, по сравнению с 5 из 50 для Negative, то общая accuracy равна (530 + 5) / 600 = 0.8917. Это означает, что точность модели составляет 89.17%. Полагаясь на это значение, вы можете подумать, что для любой выборки (независимо от ее класса) модель сделает правильный прогноз в 89.17% случаев. Это неверно, так как для класса Negative модель работает очень плохо.

    Precision

    Precision представляет собой отношение числа семплов, верно классифицированных как Positive, к общему числу выборок с меткой Positive (распознанных правильно и неправильно). Precision измеряет точность модели при определении класса Positive.

    Когда модель делает много неверных Positive классификаций, это увеличивает знаменатель и снижает precision. С другой стороны, precision высока, когда:

    1. Модель делает много корректных предсказаний класса Positive (максимизирует True Positive метрику).
    2. Модель делает меньше неверных Positive классификаций (минимизирует False Positive).

    Представьте себе человека, который пользуется всеобщим доверием; когда он что-то предсказывает, окружающие ему верят. Метрика precision похожа на такого персонажа. Если она высока, вы можете доверять решению модели по определению очередной выборки как Positive. Таким образом, precision помогает узнать, насколько точна модель, когда она говорит, что семпл имеет класс Positive.

    Основываясь на предыдущем обсуждении, вот определение precision:

    Precision отражает, насколько надежна модель при классификации Positive-меток.

    На следующем изображении зеленая метка означает, что зеленый семпл классифицирован как Positive, а красный крест – как Negative. Модель корректно распознала две Positive выборки, но неверно классифицировала один Negative семпл как Positive. Из этого следует, что метрика True Positive равна 2, когда False Positive имеет значение 1, а precision составляет 2 / (2 + 1) = 0.667. Другими словами, процент доверия к решению модели, что выборка относится к классу Positive, составляет 66.7%.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    Цель precision – классифицировать все Positive семплы как Positive, не допуская ложных определений Negative как Positive. Согласно следующему рисунку, если все три Positive выборки предсказаны правильно, но один Negative семпл классифицирован неверно, precision составляет 3 / (3 + 1) = 0.75. Таким образом, утверждения модели о том, что выборка относится к классу Positive, корректны с точностью 75%.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    Единственный способ получить 100% precision — это классифицировать все Positive выборки как Positive без классификации Negative как Positive.

    В Scikit-learn модуль sklearn.metrics имеет функцию precision_score(), которая получает в качестве аргументов эталонные и предсказанные метки и возвращает precision. Параметр pos_label принимает метку класса Positive (по умолчанию 1).

    import sklearn.metrics
    
    y_true = ["positive", "positive", "positive", "negative", "negative", "negative"]
    y_pred = ["positive", "positive", "negative", "positive", "negative", "negative"]
    
    precision = sklearn.metrics.precision_score(y_true, y_pred, pos_label="positive")
    print(precision)
    

    Вывод: 0.6666666666666666.

    Recall

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

    Recall заботится только о том, как классифицируются Positive выборки. Эта метрика не зависит от того, как предсказываются Negative семплы, в отличие от precision. Когда модель верно классифицирует все Positive выборки, recall будет 100%, даже если все представители класса Negative были ошибочно определены как Positive. Давайте посмотрим на несколько примеров.

    На следующем изображении представлены 4 разных случая (от A до D), и все они имеют одинаковый recall, равный 0.667. Представленные примеры отличаются только тем, как классифицируются Negative семплы. Например, в случае A все Negative выборки корректно определены, а в случае D – наоборот. Независимо от того, как модель предсказывает класс Negative, recall касается только семплов относящихся к Positive.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    Из 4 случаев, показанных выше, только 2 Positive выборки определены верно. Таким образом, метрика True Positive равна 2. False Negative имеет значение 1, потому что только один Positive семпл классифицируется как Negative. В результате recall будет равен 2 / (2 + 1) = 2/3 = 0.667.
    Поскольку не имеет значения, как предсказываются объекты класса Negative, лучше их просто игнорировать, как показано на следующей схеме. При расчете recall необходимо учитывать только Positive выборки.

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    Что означает, когда recall высокий или низкий? Если recall имеет большое значение, все Positive семплы классифицируются верно. Следовательно, модели можно доверять в ее способности обнаруживать представителей класса Positive.

    На следующем изображении recall равен 1.0, потому что все Positive семплы были правильно классифицированы. Показатель True Positive равен 3, а False Negative – 0. Таким образом, recall вычисляется как 3 / (3 + 0) = 1. Это означает, что модель обнаружила все Positive выборки. Поскольку recall не учитывает, как предсказываются представители класса Negative, могут присутствовать множество неверно определенных Negative семплов (высокая False Positive метрика).

    Оценка моделей ML/DL: матрица ошибок, Accuracy, Precision и Recall

    С другой стороны, recall равен 0.0, если не удается обнаружить ни одной Positive выборки. Это означает, что модель обнаружила 0% представителей класса Positive. Показатель True Positive равен 0, а False Negative имеет значение 3. Recall будет равен 0 / (0 + 3) = 0.

    Когда recall имеет значение от 0.0 до 1.0, это число отражает процент Positive семплов, которые модель верно классифицировала. Например, если имеется 10 экземпляров Positive и recall равен 0.6, получается, что модель корректно определила 60% объектов класса Positive (т.е. 0.6 * 10 = 6).

    Подобно precision_score(), функция repl_score() из модуля sklearn.metrics вычисляет recall. В следующем блоке кода показан пример ее использования.

    import sklearn.metrics
    
    y_true = ["positive", "positive", "positive", "negative", "negative", "negative"]
    y_pred = ["positive", "positive", "negative", "positive", "negative", "negative"]
    
    recall = sklearn.metrics.recall_score(y_true, y_pred, pos_label="positive")
    print(recall)
    

    Вывод: 0.6666666666666666.

    После определения precision и recall давайте кратко подведем итоги:

    • Precision измеряет надежность модели при классификации Positive семплов, а recall определяет, сколько Positive выборок было корректно предсказано моделью.
    • Precision учитывает классификацию как Positive, так и Negative семплов. Recall же использует при расчете только представителей класса Positive. Другими словами, precision зависит как от Negative, так и от Positive-выборок, но recall — только от Positive.
    • Precision принимает во внимание, когда семпл определяется как Positive, но не заботится о верной классификации всех объектов класса Positive. Recall в свою очередь учитывает корректность предсказания всех Positive выборок, но не заботится об ошибочной классификации представителей Negative как Positive.
    • Когда модель имеет высокий уровень recall метрики, но низкую precision, такая модель правильно определяет большинство Positive семплов, но имеет много ложных срабатываний (классификаций Negative выборок как Positive). Если модель имеет большую precision, но низкий recall, то она делает высокоточные предсказания, определяя класс Positive, но производит всего несколько таких прогнозов.

    Некоторые вопросы для проверки понимания:

    • Если recall равен 1.0, а в датасете имеются 5 объектов класса Positive, сколько Positive семплов было правильно классифицировано моделью?
    • Учитывая, что recall составляет 0.3, когда в наборе данных 30 Positive семплов, сколько представителей класса Positive будет предсказано верно?
    • Если recall равен 0.0 и в датасете14 Positive-семплов, сколько корректных предсказаний класса Positive было сделано моделью?

    Precision или Recall?

    Решение о том, следует ли использовать precision или recall, зависит от типа вашей проблемы. Если цель состоит в том, чтобы обнаружить все positive выборки (не заботясь о том, будут ли negative семплы классифицированы как positive), используйте recall. Используйте precision, если ваша задача связана с комплексным предсказанием класса Positive, то есть учитывая Negative семплы, которые были ошибочно классифицированы как Positive.

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

    Теперь предположим, что вам дали снимок с результатами маммографии, и вас попросили определить наличие рака. Какой показатель вы используете? Поскольку он обязан быть чувствителен к неверной идентификации изображения как злокачественного, мы должны быть уверены, когда классифицируем снимок как Positive (то есть с раком). Таким образом, предпочтительным показателем в данном случае является precision.

    Вывод

    В этом руководстве обсуждалась матрица ошибок, вычисление ее 4 метрик (true/false positive/negative) для задач бинарной и мультиклассовой классификации. Используя модуль metrics библиотеки Scikit-learn, мы увидели, как получить матрицу ошибок в Python.

    Основываясь на этих 4 показателях, мы перешли к обсуждению accuracy, precision и recall метрик. Каждая из них была определена и использована в нескольких примерах. Модуль sklearn.metrics применяется для расчета каждого вышеперечисленного показателя.

    На чтение 3 мин. Опубликовано 13.06.2019

    Перевод статьи – Understanding Confusion Matrix – Sarang Narkhede

    https://cdn-images-1.medium.com/max/1600/1*va6qO1E_MK9Yg8PaCghy3A.jpeg

    Когда мы получаем данные после очистки, предварительной обработки и обработки данных, первым шагом, который мы делаем, является создание модели  и, конечно, получение результатов в вероятностях. Но держись! Как, черт возьми, мы можем измерить эффективность нашей модели? Лучшая эффективность, лучшая производительность и это именно то, что мы хотим. В данном случае мы начинаем использовать матрицу ошибок. Матрица ошибок (Confusion Matrix) – это измерение производительности для классификации машинного обучения.

    Содержание

    1. Этот пост призван ответить на следующие вопросы:
    2. Что такое матрица ошибок, и зачем она нужна?
    3. Как вычислить матрицу ошибок  для задачи классификации с бинарными классами?

    Этот пост призван ответить на следующие вопросы:

    • Что такое Матрица ошибок и зачем она нужна?
    • Как вычислить матрицу ошибок для задач бинарной классификации?

    Сегодня давайте разберемся с матрицей путаницы раз и навсегда.

    Что такое матрица ошибок, и зачем она нужна?

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

    https://cdn-images-1.medium.com/max/1600/1*Z54JgbS4DUwWSknhDCvNTQ.png

    Это чрезвычайно полезно для вычисления Полноты, Точности, Специфичность, Точность и, что наиболее важно кривой ошибок AUC-ROC.

    Давайте поймем термины TP, FP, FN, TN  на примере аналогии с  беременностью.

    https://cdn-images-1.medium.com/max/1600/1*7EYylA6XlXSGBCF77j_rOA.png

    TP — истино-положительное решение:

    Интерпретация: Вы предсказали положительное, и это правда.

    Вы предсказали, что женщина беременна, и она на самом деле беременна.

    TN — истино-отрицательное решение:

    Интерпретация: Вы прогнозировали отрицательное значения, и это правда.

    Вы предсказали, что мужчина не беременен, а он на самом деле не беременен.

    FP — ложно-положительное решение (Ошибка типа 1):

    Интерпретация: Вы предсказали положительное значение, и это неверно.

    Вы предсказали, что мужчина беременен, но на самом деле это не так.

    FN— ложно-отрицательное решение (Ошибка Типа 2):

    Интерпретация: Вы предсказали отрицательное значение, и это неверно.

    Вы предсказали, что женщина не беременна, но она на самом деле беременная.

    Только помните, мы описываем прогнозируемые значения как положительные и отрицательные, а фактические значения как истинные и ложные.

    https://cdn-images-1.medium.com/max/1600/1*2lptVD05HarbzGKiZ44l5A.png

    How to Calculate Confusion Matrix for a 2-class classification problem?

    Как вычислить матрицу ошибок  для задачи классификации с бинарными классами?

    https://cdn-images-1.medium.com/max/1200/1*kVeqcousZ3jTeEhWiT06Vw.png

    https://cdn-images-1.medium.com/max/1200/1*uR09zTlPgIj5PvMYJZScVg.png

    Давайте разберемся с матрицей ошибок посредством математик

    Полнота Recall

    https://cdn-images-1.medium.com/max/1600/1*BT3awaBdZHsit5s41LPb9A.png

    Из всех положительных классов, сколько мы предсказали правильно. Это должно быть как можно выше.

    Точность Precision

    https://cdn-images-1.medium.com/max/1600/1*QRIZDkk_FffXKs_07ZlhZw.png

    Из всех классов, сколько мы предсказали правильно. Это должно быть как можно выше.

    F-мера

    https://cdn-images-1.medium.com/max/1600/1*98FaAKfPWo-EBTbjsxm4GA.png

    Трудно сравнить две модели с низкой точностью и высокой отзывчивостью или наоборот. Поэтому, чтобы сделать их сопоставимыми, мы используем F-меру. F-мера помогает измерять Полноту и Точность одновременно. Она использует гармоническое среднее вместо среднего арифметического, наказывая экстремальные значения больше.

    https://towardsdatascience.com/understanding-confusion-matrix-a9ad42dcfd62

    • Редакция Кодкампа

    17 авг. 2022 г.
    читать 2 мин


    Логистическая регрессия — это тип регрессии, который мы можем использовать, когда переменная ответа является двоичной.

    Одним из распространенных способов оценки качества модели логистической регрессии является создание матрицы путаницы , которая представляет собой таблицу 2 × 2, в которой показаны прогнозируемые значения из модели и фактические значения из тестового набора данных.

    В следующем пошаговом примере показано, как создать матрицу путаницы в Excel.

    Шаг 1: введите данные

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

    Шаг 2: Создайте матрицу путаницы

    Далее мы будем использовать формулу COUNTIFS() для подсчета количества значений, равных «0» в столбце «Фактическое», а также «0» в столбце «Прогноз»:

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

    матрица путаницы в Excel

    Шаг 3: Рассчитайте точность, точность и полноту

    После того, как мы создали матрицу путаницы, мы можем рассчитать следующие показатели:

    • Точность : процент правильных прогнозов
    • Точность : правильные положительные прогнозы по отношению к общему количеству положительных прогнозов.
    • Вспомнить : исправить положительные прогнозы по отношению к общему количеству фактических положительных результатов.

    Следующие формулы показывают, как рассчитать каждую из этих метрик в Excel:

    Чем выше точность, тем лучше модель способна правильно классифицировать наблюдения.

    В этом примере наша модель имеет точность 0,7 , что говорит нам о том, что она правильно классифицировала 70% наблюдений.

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

    Дополнительные ресурсы

    Введение в логистическую регрессию
    3 типа логистической регрессии
    Логистическая регрессия против линейной регрессии

    Написано

    Редакция Кодкампа

    Замечательно! Вы успешно подписались.

    Добро пожаловать обратно! Вы успешно вошли

    Вы успешно подписались на кодкамп.

    Срок действия вашей ссылки истек.

    Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.

    Успех! Ваша платежная информация обновлена.

    Ваша платежная информация не была обновлена.

    Понравилась статья? Поделить с друзьями:
  • Как рассчитать стандартную ошибку среднего
  • Как рассчитать среднюю ошибку выборки
  • Как рассчитать сколько отзывов требуется добавить чтобы исправить рейтинг
  • Как рассчитать процент ошибки
  • Как рассчитать предельную ошибку выборки