В предыдущем посте мы рассказали, что такое conformal prediction и зачем он нужен. Но наверняка у вас появились вопросы:
1. А как именно модель понимает, насколько конкретный объект «странный» или «рискованный»?
2. Как обучается конформный предиктор?
Ответ на первый вопрос: через меру некомфортности.
Мерами некомфортности могут быть как простые функции, например, MAE или hinge_loss:
nonconformity_mae = |y_true - y_pred|
nonconformity_hinge = 1 - P(true_class)
так и более сложные, например, оценка Брайера.
Интуитивный пример
Допустим, модель классифицирует изображения. Для обычной картинки модель говорит:
Barbie: 0.02
Ken: 0.97
Oppenheimer: 0.01
А для размытой картинки животного в лесу:
Barbie: 0.2
Ken: 0.42
Oppenheimer: 0.38
Обычный классификатор во всех случаях выберет класс Ken. Conformal prediction во втором случае может сказать:
{Ken, Oppenheimer}
Потому что мера некомфортности для этих классов будет недостаточно велика, чтобы их явно отвергнуть.
Далее поговорим про то, как это обучать.
TCP: Transductive Conformal Prediction
TCP в строгом смысле не «обучается» как обычная модель. Лучше сформулировать это так:
Давайте рассмотрим пошагово алгоритм TCP.
Допустим, есть выборка:
D = {(x1, y1), ..., (xn, yn)}
и новый объект
x_new.
• Шаг 1. Берём один из классов, например, Barbie. Делаем предположение:
y_new = Barbie
• Шаг 2. Добавляем его в существующий датасет:
D_Barbie = D ∪ {(x_new, Barbie)}
• Шаг 3. Обучим модель на новом наборе данных.
• Шаг 4. Считаем меру некомфортности, например, hinge_loss, для всех объектов, включая новый.
• Шаг 5. Сравниваем новый объект с остальными. Смотрим, насколько некомфортность нового объекта велика относительно остальных объектов в D_Barbie. Упрощённо:
p_value(Barbie) = доля объектов, у которых score ≥ score_x_new
Шаги с первого по пятый повторяются для каждого класса. Финальный prediction set формируется из классов, у которых p_value > α, где α — желаемый уровень значимости.
ICP: Inductive Conformal Prediction
Опытные ML-инженеры, прочитав предыдущую часть, наверняка ужаснулись. Для предсказания на 1000 объектов в 10 классов нам понадобится 10 000 переобучений модели!
Эту проблему решает метод ICP за счёт выделения отдельной калибровочной выборки:
• Шаг 1. Делим данные на train и calibration:
D_train
D_calibration
• Шаг 2. Обучаем модель на D_train. После этого модель больше не переобучается для каждого нового объекта.
• Шаг 3. Считаем меры некомфортности на D_calibration. Для каждого объекта из D_calibration считаем, насколько плохо модель предсказала правильный ответ. Получаем набор calibration scores:
scores = [α1, α2, ..., αm]
• Шаг 4. Задаём уровень значимости α и выбираем порог q. Теперь выбираем такой порог скора q, чтобы нужная доля calibration scores была не больше него. Упрощённо:
q = 90-й процентиль calibration scores
• Шаг 5. Применяем к новому объекту. Для нового объекта считаем score для каждого возможного класса:
score(Barbie) = 1 - P(Barbie)
score(Ken) = 1 - P(Ken)
score(Oppenheimer) = 1 - P(Oppenheimer)
В prediction set попадут те классы, у которых score ≤ q.
Главное отличие от TCP:
💜 Этот пост написал Виталий Прахов, дата-сайентист в Точка Банк
1. А как именно модель понимает, насколько конкретный объект «странный» или «рискованный»?
2. Как обучается конформный предиктор?
Ответ на первый вопрос: через меру некомфортности.
Мера некомфортности — это функция, которая показывает, насколько плохо конкретная пара (x, y) согласуется с моделью и уже известными данными.
Мерами некомфортности могут быть как простые функции, например, MAE или hinge_loss:
nonconformity_mae = |y_true - y_pred|
nonconformity_hinge = 1 - P(true_class)
так и более сложные, например, оценка Брайера.
Интуитивный пример
Допустим, модель классифицирует изображения. Для обычной картинки модель говорит:
Barbie: 0.02
Ken: 0.97
Oppenheimer: 0.01
А для размытой картинки животного в лесу:
Barbie: 0.2
Ken: 0.42
Oppenheimer: 0.38
Обычный классификатор во всех случаях выберет класс Ken. Conformal prediction во втором случае может сказать:
{Ken, Oppenheimer}
Потому что мера некомфортности для этих классов будет недостаточно велика, чтобы их явно отвергнуть.
Далее поговорим про то, как это обучать.
TCP: Transductive Conformal Prediction
TCP в строгом смысле не «обучается» как обычная модель. Лучше сформулировать это так:
В TCP мы для каждого нового объекта и каждого возможного ответа временно добавляем этот ответ в обучающую выборку, переобучаем или переоцениваем модель и проверяем, насколько такой ответ выглядит «некомфортным» относительно остальных данных.
Давайте рассмотрим пошагово алгоритм TCP.
Допустим, есть выборка:
D = {(x1, y1), ..., (xn, yn)}
и новый объект
x_new.
• Шаг 1. Берём один из классов, например, Barbie. Делаем предположение:
y_new = Barbie
• Шаг 2. Добавляем его в существующий датасет:
D_Barbie = D ∪ {(x_new, Barbie)}
• Шаг 3. Обучим модель на новом наборе данных.
• Шаг 4. Считаем меру некомфортности, например, hinge_loss, для всех объектов, включая новый.
• Шаг 5. Сравниваем новый объект с остальными. Смотрим, насколько некомфортность нового объекта велика относительно остальных объектов в D_Barbie. Упрощённо:
p_value(Barbie) = доля объектов, у которых score ≥ score_x_new
Шаги с первого по пятый повторяются для каждого класса. Финальный prediction set формируется из классов, у которых p_value > α, где α — желаемый уровень значимости.
ICP: Inductive Conformal Prediction
Опытные ML-инженеры, прочитав предыдущую часть, наверняка ужаснулись. Для предсказания на 1000 объектов в 10 классов нам понадобится 10 000 переобучений модели!
Эту проблему решает метод ICP за счёт выделения отдельной калибровочной выборки:
• Шаг 1. Делим данные на train и calibration:
D_train
D_calibration
• Шаг 2. Обучаем модель на D_train. После этого модель больше не переобучается для каждого нового объекта.
• Шаг 3. Считаем меры некомфортности на D_calibration. Для каждого объекта из D_calibration считаем, насколько плохо модель предсказала правильный ответ. Получаем набор calibration scores:
scores = [α1, α2, ..., αm]
• Шаг 4. Задаём уровень значимости α и выбираем порог q. Теперь выбираем такой порог скора q, чтобы нужная доля calibration scores была не больше него. Упрощённо:
q = 90-й процентиль calibration scores
• Шаг 5. Применяем к новому объекту. Для нового объекта считаем score для каждого возможного класса:
score(Barbie) = 1 - P(Barbie)
score(Ken) = 1 - P(Ken)
score(Oppenheimer) = 1 - P(Oppenheimer)
В prediction set попадут те классы, у которых score ≤ q.
Главное отличие от TCP:
ICP один раз обучает модель и один раз калибрует порог. После этого для новых объектов он использует уже готовую модель и готовую калибровку, поэтому работает намного быстрее.
💜 Этот пост написал Виталий Прахов, дата-сайентист в Точка Банк