Взгляд на дисбаланс данных под другим углом

Лучший угол для решения любой проблемы - это попытка.

- Анонимный

Вступление

Продолжение предыдущей статьи. Прежде чем идти по следу, позвольте нам очень кратко рассказать о том, что мы сделали ранее. У нас есть набор данных о столкновениях автомобилей в Сиэтле, где серьезность аварии (степень тяжести 1, 2, 3 и 4) должна быть спрогнозирована с использованием предикторов, таких как состояние дороги, тип столкновения, состояние освещения, тип перекрестка и т. Д. С этими данными мы выполнили данные очистка, визуализация данных, вменение данных, исследовательский анализ данных, выбор функций и быстрое кодирование.

С этого момента, выбирая легкий путь, мы

а) преобразовал проблему с несколькими классами в проблему с двумя классами (уровень серьезности 4 по сравнению с остальными уровнями серьезности)

б) произвольно отобранный класс меньшинства (уровень серьезности 4) для получения сбалансированного набора данных.

c) разделить данные на набор для обучения и тестирования, просто разделив данные на две части в соответствии с указанным коэффициентом разделения, используя train_test_split библиотеки Scikit-learn (также называемой Hold-Out )

г) опробовали модели классификации с точностью в качестве меры оценки модели.

Повторное посещение

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

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

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

Удержание против перекрестной проверки

В нашем случае количество точек данных для уровня серьезности 4 составляет всего 349 из 1,99 404. Итак, для обучения и тестирования, когда мы разделяем данные с помощью

X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.2, shuffle = True, stratify = y)

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

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

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

  1. Перемешать данные в случайном порядке
  2. Разбейте данные на k групп или фрагментов примерно равного размера случайным образом.
  3. Для i = от 1 до k обучите, протестируйте и оцените модель, выполнив i - -я группа как тестовая, а остальные группы как тренировочные данные. Сохраните оценочную оценку и выбросьте модель. Возьмите следующую группу.

4. Сообщите о производительности модели, используя индивидуальные оценочные баллы (обычно средние) из шага 3.

Это означает, что каждое расщепление / образец / группа / складка может использоваться в наборе удержания один раз и использоваться для обучения модели (k-1). раз. Это известно как метод k-Fold.

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

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

Чтобы исправить эту ситуацию, мы должны разбить набор данных случайным образом, но таким образом, чтобы одинаковое распределение классов (одинаковая пропорция разных классов) сохранялось в каждом подмножестве или свертке. Это называется стратифицированной k-кратной перекрестной проверкой, где класс целевой переменной (y) используется для управления процессом выборки. Стратификация требует, чтобы в каждом разбиении / свертке распределение классов соответствовало распределению полных данных обучения. Итак, train_test_split (описанный выше) на самом деле является частным случаем стратифицированной k-кратной перекрестной проверки, когда k = 2. С увеличением значения k стратифицированная k-кратная перекрестная проверка становится все более требовательной к вычислениям.

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

Какое значение k мы выбираем? Существует компромисс смещения и дисперсии, связанный с выбором k в k-кратном перекрестной проверке . Эмпирически показано, что значения k = 5 и k = 10 являются оптимальными.

В поисках показателей оценки модели

Это критический аспект построения модели машинного обучения, который необходимо принять во внимание перед подгонкой модели. В нашем случае прогнозирование ложноотрицательного результата, то есть прогнозирование низкой степени серьезности (например, материального ущерба), когда фактическая степень серьезности равна 4 (смертельный исход), очень дорого обходится, поскольку касается жизни и смерти. Хотя это довольно легко понять, «точность» (пропорция предсказанного правильного результата) может быть не лучшим выбором! Если классификатор может правильно угадать класс 70 раз из 100, точность составляет 70%. Это интуитивно понятно, чем выше точность, тем лучше производительность классификатора, но так ли это на самом деле? Давайте рассмотрим.

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

Здесь мы можем иметь четыре случая: i) правильно предсказал положительный (True Positive, TP) ii) предсказал положительный неправильно (False Positive, FP) iii) правильно предсказал отрицательный (True Negative, TN) и iv) предсказал неверно отрицательный (False Negative , FN). Согласно определению,

точность = количество правильных прогнозов (TP + TN) / общее количество прогнозов (TP + FP + TN + FN).

Возьмем пример:

Точность = (5 + 50) / (5 + 20 + 10 + 50) = 65%.

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

Теперь точность = 50 / (20 + 50) = 71,4%! Как ни странно, худшая модель показывает большую точность!

Парадокс точности. Когда TP ‹FP, то точность всегда будет повышаться, если мы изменим правило классификации, чтобы всегда выводить« отрицательную »категорию. И наоборот, когда TN ‹FN, то же самое произойдет, когда мы изменим наше правило, чтобы всегда выводить« положительный ».

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

Из приведенной выше матрицы путаницы мы можем получить еще несколько показателей:

a) Точность: это отвечает на вопрос: «Из всех« положительных »прогнозов (TP + FP) какая доля действительно положительных (TP)»?

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

б) Напомнить: здесь делается попытка ответить: «Из всех положительных примеров (TP + FN), какую долю классификатор подобрал правильно»?

Напомним = TP / (TP + FN)

Когда классификатор не ошибается, мы имеем Precision = Recall = 1. Для других значений, если мы попытаемся увеличить точность, количество повторных вызовов уменьшится, и наоборот. Предпочтение точности перед отзывом или наоборот часто продиктовано бизнес-целью. Для обнаружения мошенничества у нас должен быть очень высокий уровень отзыва, то есть большинство мошеннических транзакций выявляются, вероятно, с потерей точности, поскольку все мошенничества должны быть идентифицированы или, по крайней мере, возникают подозрения. Аналогичным образом, в нашем случае нас больше интересует функция «Отзыв», которая позволяет прогнозировать все автомобильные аварии самой высокой степени тяжести.

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

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

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

Точность = TP / (TP + FP) = 8 / (8 + 2) = 0,8

Отзыв - это из всех фактических мошенничеств (всего 12 красных точек), какую долю мы правильно определили как мошенничество (т.е. сколько красных точек справа от пороговой линии, 8). Следовательно,

Напомним = TP / (TP + FN) = 8 / (8 + 4) = 0,66

Если теперь немного сдвинуть линию порога вправо, точка данных, которая была TP, будет исключена из группы мошенничества и включена в классификацию отсутствия мошенничества как FN. Эффект состоит в том, что количество FP уменьшается, но FN увеличивается.

Новые значения Precision = 7 / (7 + 1) = 0,875 и Recall = 7 / (7 + 5) = 0,58. Таким образом, Точность увеличивается, а Напоминание уменьшается.

Мы должны искать баланс между точностью и отзывчивостью. Можно выбрать оптимизацию меры, которая объединяет точность и отзыв в одно значение, например F-меру:

F1 = 2. (Точность. Вызов) / (Точность + Вызов)

Введем еще несколько определений.

Чувствительность, отзыв, частота совпадений или истинно положительный рейтинг (TPR)

TPR = TP / (TP + FN)

Выпадение или Частота ложных срабатываний (FPR)

FPR = FP / (FP + TN)

Предположим, у нас есть фактические метки и соответствующие вероятности, предсказанные моделью классификаторов, и мы конвертируем данные вероятностей в предсказанные метки, определяя различные пороговые значения (см. Таблицу ниже). Мы видим, что в зависимости от порогового значения (0,6, 0,7 и 0,8) мы получаем разные значения TPR и FPR.

Не было бы проще увидеть изменение TPR и FPR для всех возможных значений порога?

c) Кривая ROC (R приемника O характерная кривая C) - это график, который показывает эффективность модель классификации для всех пороговых значений классификации. В частности, кривая ROC представляет собой график зависимости TPR от FPR при различных порогах классификации. При понижении порога классификации классификатор классифицирует больше элементов как положительных, тем самым увеличивая как ложные, так и истинные положительные результаты.

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

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

i) AUC = 1 (классификатор правильно различает все классы, как положительные, так и отрицательные)

ii) AUC = 0 (классификатор предсказывает все положительные результаты как отрицательные и наоборот)

iii) AUC = 0,5 (классификатор не может различать положительные и отрицательные классы)

iv) 1 ›AUC› 0,5 (классификатор может различать положительные и отрицательные классы)

Вышеупомянутое обсуждение имеет отношение к бинарной классификации. Как мы применим это к мультиклассу? Для мультиклассов мы используем подход «один против всех», то есть мы вычисляем вероятность каждого класса по сравнению с остальными классами. В нашем случае у нас четыре класса. Таким образом, ROC необходимо будет сгенерировать для классификации уровня серьезности 1 по сравнению с уровнем серьезности 2, 3 и 4. ROC для 2 должен быть 2 по сравнению с 1, 3, 4 и так далее.

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

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

Классификация с учетом затрат

У некоторых алгоритмов классификатора есть параметр class_weight through, который мы можем указать, что имеем дело с несбалансированными классами. В свете приведенного выше обсуждения мы исследуем эффективность чувствительной к стоимости классификации, в которой мы используем перекрестную проверку в качестве метода обучения и точность, отзыв, ROC AUC в качестве показателей. Мы получаем точность, отзывчивость и f-оценку из показателей «precision_recall_fscore_support» в sklearn, рассчитанных для каждого класса.

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

Ранее мы видели, что RandomForestClassifier давал нам максимальную точность. Мы воспринимаем это как приблизительное руководство и опробуем алгоритм с его опциями для работы с несбалансированными данными.

а) Без взвешивания по классам

По умолчанию установлено «Нет», при этом вес всех классов равен 1.

Мы видим, что точность, отзыв, fscore имеют нулевые значения, а также матрица неточностей показывает, что прогноз для класса 4 (серьезность 4) чрезвычайно плохой (TP = 0).

б) class_weight = «сбалансированный»

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

n_samples / (n_classes * np.bincount(y))

Мы видим улучшенный прогноз для класса 4. Мы также видим, что значения AUC несколько уменьшаются.

в) class_weight = «сбалансированная_подвыборка»

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

Особых улучшений нет.

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

Полный исходный код находится здесь.

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

использованная литература

  1. Https://en.wikipedia.org/wiki/Precision_and_recall
  2. Https://en.wikipedia.org/wiki/Receiver_operating_characteristic