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

Исходный узел: 1178501

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

Являются ли измерения производительности вашей модели очень точными из-за «большого» набора тестов или очень неопределенными из-за «маленького» или несбалансированного набора тестов?


By Дэвид Б. Розен (доктор философии), Ведущий специалист по обработке и анализу данных по автоматизированному утверждению кредитов в IBM Global Financing



Оранжевая линия показывает 89.7% в качестве нижней границы доверительного интервала Balanced Accuracy, зеленая линия — исходная наблюдаемая Balanced Accuracy = 92.4% (точечная оценка), а красная — верхняя граница 94.7%. (Это и все изображения принадлежат автору, если не указано иное.)

Введение

 
 
Если вы сообщаете о производительности вашего классификатора как имеющую точность = 94.8% и F1 = 92.3% на тестовом наборе, это не имеет большого значения, если вы ничего не знаете о размере и составе тестового набора. Погрешность этих измерений производительности будет сильно различаться в зависимости от размера тестового набора или, для несбалансированного набора данных, в первую очередь в зависимости от того, сколько независимых экземпляров меньшинство класс, который он содержит (большее количество копий одних и тех же экземпляров из передискретизации не помогает для этой цели).

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

Если бы мы взяли много независимых выборочных наборов данных из базовой совокупности, то для 95 % этих наборов данных истинное базовое значение метрики для генеральной совокупности было бы в пределах доверительного интервала 95 %, который мы рассчитали бы для этого конкретного набора выборочных данных.

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

Если вы просто хотите увидеть, как вызвать этот код для расчета доверительных интервалов, перейдите к разделу «Подсчитайте результаты!" внизу.

Методология начальной загрузки

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

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

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

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

  1. Порождать nboots наборы данных «начальной выборки», каждый такого же размера, как и исходный тестовый набор. Каждый образец набора данных получается путем случайного выбора экземпляров из тестового набора с заменой.
  2. В каждом из выборочных наборов данных рассчитайте метрику и сохраните ее.
  3. 95% доверительный интервал задается 2.5th к 97.5th процентиль среди nboots рассчитанные значения метрики. Если nboots=1001 и вы отсортировали значения в ряд/массив/список X длины 1001, 0th процентиль X[0] и 100th процентиль X[1000], поэтому доверительный интервал будет равен X[25] до X[975].

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

Пример набора данных и результатов доверительного интервала

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

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

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

Создание одного набора данных загрузочного образца

 
 
Хотя наш код доверительного интервала может обрабатывать различное количество аргументов данных для передачи в функции метрик, мы сосредоточимся на метриках в стиле sklearn, которые всегда принимают два аргумента данных, y_true и y_pred, где y_pred будет либо предсказанием двоичного класса (0 или 1), или непрерывные предсказания вероятности класса или функции принятия решений, или даже непрерывные предсказания регрессии, если y_true также является непрерывным. Следующая функция создает один набор данных загрузочного примера. Он принимает любые data_args, но в нашем случае эти аргументы будут ytest(наш фактический / истинный тест устанавливает целевые значения в предыдущая статья) и расширение hardpredtst_tuned_thresh (прогнозируемый класс). Оба содержат нули и единицы, чтобы указать истинный или предсказанный класс для каждого экземпляра.

Пользовательская метрика Specificity_score() и служебные функции

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

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

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



Создание каждого набора данных загрузочного образца и расчет метрик для него

 
 
В raw_metric_samples() мы фактически сгенерируем несколько выборочных наборов данных один за другим и сохраним метрики каждого:

Вы даете raw_metric_samples() список интересующих метрик (или только одну метрику), а также истинные и предсказанные данные класса, и он получает выборочные наборы данных nboots и возвращает фрейм данных только со значениями метрик, рассчитанными из каждого набора данных. Через _boot_generator() он вызывает one_boot() по одному в выражении генератора, а не сохраняет все наборы данных сразу как потенциально-огромный .

Посмотрите на метрики по 7 наборам данных загрузочного образца.

 
 
Мы составляем список метрических функций и вызываем raw_metric_samples(), чтобы получить результаты всего для 7 выборочных наборов данных. Мы вызываем здесь raw_metric_samples() для понимания — это не обязательно для получения доверительных интервалов с помощью ci_auto() ниже, хотя указание списка метрик (или только одной метрики) для ci_auto() is необходимо.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



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

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

 
 
В нашей реализации по умолчанию количество загрузочных наборов данных nboots будет рассчитываться автоматически на основе желаемого уровня достоверности (например, 95%), чтобы соответствовать рекомендации Норт, Кертис и Шам иметь минимальное количество результатов загрузки в каждом хвосте дистрибутива. (На самом деле эта рекомендация относится к p-значения и, следовательно, проверка гипотезы области приема, Но доверительные интервалы достаточно похожи на те, что можно использовать в качестве эмпирического правила.) Хотя эти авторы рекомендуют как минимум 10 результатов загрузки в конце, Дэвидсон и Маккиннон рекомендуем не менее 399 ботинок для уверенности 95%, что требует 11 ботинок в хвосте, поэтому мы используем эту более консервативную рекомендацию.

Мы указываем альфу, которая равна 1 – уровень достоверности. Например, 95%-ная достоверность становится 0.95, а альфа = 0.05. Если вы укажете явное количество загрузок (возможно, меньшее nboots потому что вы хотите более быстрых результатов), но этого недостаточно для запрошенной альфы, более высокая альфа будет выбрана автоматически, чтобы получить точный доверительный интервал для этого количества ботинок. Будет использоваться как минимум 51 ботинок, потому что меньшее количество может точно рассчитать только причудливо-малые уровни достоверности (например, 40% достоверности, которая дает интервал от 30th процентиль к 70th процентиль, который имеет 40% внутри интервала, но 60% вне его), и неясно, что рекомендация минимальной загрузки даже рассматривала такой случай.

Функция get_alpha_nboots() устанавливает nboots по умолчанию или изменяет запрошенную альфу и nboots, как указано выше:

Давайте покажем nboots по умолчанию для различных значений альфы:

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



Вот что произойдет, если мы запросим явный nboots:

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



Небольшие значения nboots увеличили альфа до 0.05 и 0.40, а nboots=2 изменено до минимума 51.

Гистограмма выборочных наборов данных начальной загрузки, показывающая доверительный интервал только для Balanced Accuracy

 
 
Опять же, нам не нужно делать это, чтобы получить приведенные ниже доверительные интервалы, вызвав ci_auto().

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



Оранжевая линия показывает 89.7 % как нижнюю границу доверительного интервала Balanced Accuracy, зеленая — исходную наблюдаемую Balanced Accuracy = 92.4 % (точечная оценка), а красная — верхнюю границу 94.7 %. (То же изображение появляется вверху этой статьи.)

Как рассчитать все доверительные интервалы для списка показателей

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

Подсчитайте результаты!

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

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



Обсуждение полученных доверительных интервалов

 
 
Вот матрица путаницы из оригинал статьи. Класс 0 — это негативы (класс большинства), а класс 1 — это позитивы (очень редкий класс).



Отзыв (истинно положительный показатель) 134/(134+14) имеет самый широкий доверительный интервал, потому что это биномиальная пропорция, включающая небольшие подсчеты.

Специфичность (истинно отрицательный показатель) составляет 80,388 80,388/(4,907 XNUMX+XNUMX XNUMX), что включает много большее количество, поэтому он имеет чрезвычайно узкий доверительный интервал всего от [94.11% до 94.40%].

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

Неточность метрических измерений из-за различий в тестовых данных и различий в данных поезда

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

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

Независимость отдельных экземпляров

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

Также вы хотите убедиться, что у вас нет групп, которые были разделены на обучающий и тестовый набор, потому что тогда тестовый набор не обязательно является независимым, и вы можете получить необнаруженное переобучение. Например, если вы используете избыточную выборку, вы обычно должны делать только после он был отделен от тестового набора, а не раньше. И обычно вы бы передискретизировали обучающий набор, но не тестовый набор, поскольку тестовый набор должен оставаться репрезентативным для экземпляров, которые модель увидит при будущем развертывании. И для перекрестной проверки вы хотели бы использовать scikit-learn model_selection.GroupKFold().

Заключение

 
 
Вы всегда можете рассчитать доверительные интервалы для показателей оценки, чтобы увидеть, насколько точно ваши тестовые данные позволяют измерить производительность вашей модели. Я планирую еще одну статью, чтобы продемонстрировать доверительные интервалы для метрик, которые оценивают предсказания вероятности (или оценки достоверности — без отношения к статистической достоверности), то есть мягкую классификацию, такую ​​как Log Loss или ROC AUC, а не метрики, которые мы использовали здесь, которые оценивают дискретный выбор класса по модели (жесткая классификация). Один и тот же код работает как для регрессии, так и для регрессии (предсказывая непрерывную целевую переменную) — вам просто нужно передать ему другой тип прогноза (и другой тип истинных целей в случае регрессии).

Этот блокнот Jupyter доступен на github: bootConfIntAutoV1o_standalone.ipynb

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

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

Некоторые права защищены

 
Bio: Дэвид Б. Розен (доктор философии) является ведущим специалистом по данным в области автоматического одобрения кредитов в IBM Global Financing. Найдите больше работ Дэвида на dabruro.medium.com.

Оригинал, Перемещено с разрешения.

Связанный:

Источник: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html.

Отметка времени:

Больше от КДнаггетс