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

Мы привыкли видеть проблемы с наукой о данных в Kaggle, где разница в 0,1% в балле ROC может иметь значение между выигрышем 100 000 долларов или ничего.

Возьмем, к примеру, вызов Data Science Bowl 2017. Призы составили 500 000 долларов за 1 место, 200 000 за 2 место, 100 000 за 3 место и так далее. В качестве показателя для оценки была выбрана логарифмическая потеря. Это была финальная таблица лидеров:

Теперь, в чем, на ваш взгляд, разница между моделью на 1-м месте и моделью на 2-м месте?

Если ваш ответ был: «Разница в том, что 1-я модель лучше 2-й, потому что у нее меньший лог-лосс», то вы, вероятно, торопите события. Фактически,

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

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

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

Что такое «лучшая модель» на самом деле?

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

Представьте, что у нас есть две модели, A и B, и мы хотим выбрать лучшую. Мы все согласны с тем, что лучшая модель — это модель, которая лучше всего работает с невидимыми данными.

Таким образом, мы собираем некоторые тестовые данные (не используемые при обучении) и оцениваем на них наши модели. Скажем, модель А имеет показатель ROC 86%, а модель Б — 85%. Означает ли это, что модель А лучше, чем Б? Пока что да.

Но представьте, что через какое-то время вы собрали больше данных и добавили их к предыдущему тестовому набору. Теперь доля модели А по-прежнему составляет 86%, а доля модели Б увеличилась до 87%. На данный момент B лучше, чем A. Как это возможно?

Представляется очевидным, что единственным недвусмысленным определением является следующее:

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

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

Для решения этой проблемы нам нужна новая концепция.

Знакомство со Вселенной

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

Истинная эффективность модели – это ее эффективность во вселенной. В этом случае истинный показатель ROC модели составляет 80,4%. Однако мы никогда не сможем наблюдать Вселенную и, как следствие, никогда не сможем наблюдать истинный ROC модели.

Все, что мы можем наблюдать, — это оценка ROC, рассчитанная на тестовом наборе. Иногда он будет выше (81,6%), иногда меньше (79,9% и 78,5%), но мы не можем узнать, насколько истинный показатель ROC отличается от наблюдаемого показателя ROC.

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

Как смоделировать Вселенную?

Наша цель — получить совокупность наблюдений с заданной оценкой ROC. Оказывается, есть довольно простой способ сделать это.

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

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

Где α можно получить из ROC по следующей формуле:

Когда ROC составляет 50%, α равно 0, что означает, что распределение негативов и позитивов одинаково. Наоборот, когда ROC составляет 100%, α равно 1, что означает, что все положительные моменты сосредоточены на 1: между отрицательными и положительными сторонами нет перекрытия.

В Python это можно перевести в следующую функцию:

def get_y_proba(roc, n=100000, prevalence=.5):
  '''Get two arrays, y and proba, for a given roc (greater than .5)'''
  n_ones = int(round(n * prevalence))
  n_zeros = n - n_ones
  y = np.array([0] * n_zeros + [1] * n_ones)
  alpha = (roc - .5) * 2
  proba_zeros = np.linspace(0, 1, n_zeros)
  proba_ones = np.linspace(alpha, 1, n_ones)
  proba = np.concatenate([proba_zeros, proba_ones])
  return y, proba

Получение нашей меры неопределенности

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

y_universe, proba_universe = get_y_proba(roc=.8, n=100000, prevalence=.5)

Итак, наша Вселенная состоит из 100 000 наблюдений, половина из которых положительные, а показатель ROC составляет 80%.

Теперь давайте смоделируем извлечение различных наборов тестов. Мы извлечем 5000 различных тестовых наборов, каждый из которых будет состоять из 1000 наблюдений из Вселенной. Это соответствующий код:

rocs_sample = []
for i in range(5_000):
  index = np.random.choice(range(len(y_universe)), 1_000, replace=True)
  y_sample, proba_sample = y[index], proba[index]
  roc_sample = roc_auc_score(y_sample, proba_sample)
  rocs_sample.append(roc_sample)

Это распределение наблюдаемых оценок ROC:

Как видите, результаты довольно разные: от менее 76% до более 84%.

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

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

import numpy as np
from sklearn.metrics import pairwise_distances

dist = pairwise_distances(np.array(rocs_sample).reshape(-1,1))
dist = dist[np.triu_indices(len(rocs_sample), k=1)]

Давайте визуализируем попарные расстояния между оценками ROC в эмпирической кумулятивной функции распределения.

95-й процентиль (выделен пунктирной линией) составляет около 4%. Это означает, что разница между двумя моделями (с одинаковой производительностью) превышает 4% только в пяти процентах случаев.

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

Чтобы получить еще одну визуализацию этой концепции, я смоделировал три разные вселенные, одну с оценкой ROC 75 %, другую с 80 % и последнюю с 81 %. Это распределения их наблюдаемых оценок ROC.

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

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

Могу ли я что-нибудь с этим сделать?

То есть вы говорите мне, что я не могу быть на 100% уверен, что одна модель лучше другой? Это звучит как кошмар. Конечно: в науке о данных нет такой вещи, как 100% уверенность. Однако не отчаивайтесь.

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

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

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

  • Истинный ROC: 70%, 80% и 90%.
  • Размер выборки: 1 000, 5 000 и 10 000 наблюдений.
  • Распространенность выборки: 1%, 5% и 20%.

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

Для каждой комбинации я смоделировал вселенную, затем отобрал 1000 различных наборов тестов и измерил соответствующие оценки ROC. Затем я вычислил матрицу расстояний для 1000 баллов ROC. Наконец, я взял 95-й процентиль расстояний (далее именуемый «d»). Как я уже говорил выше, это мера неопределенности в выборе модели.

Например, это первые 5 испытаний из 27.

Мы измеряем неопределенность с помощью 95-го процентиля. Чем выше это число, тем выше неопределенность при сравнении ROC-кривых.

Поскольку мы хотим знать, как неопределенность зависит от трех параметров, интересно измерить частичную корреляцию между каждым параметром и «d». Вот результат:

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

  • Истинная РПЦ. Более высокий показатель ROC во вселенной означает меньшую неопределенность. Это имеет смысл, потому что более высокий ROC по определению означает меньшую степень неопределенности.
  • Примерный размер. Увеличение размерности выборки снижает неопределенность. Это довольно очевидно и постоянно происходит в статистике.
  • Распространенность выборки. Увеличение распространенности снижает неопределенность. Меньшая распространенность означает меньше положительных результатов. Меньшее количество положительных результатов означает, что случайность имеет больший вес при их выборке. Отсюда и большая неопределенность.

Из любопытства давайте также визуализируем распределения наблюдаемых показателей ROC при изменении размера выборки и распространенности выборки для фиксированного истинного ROC (в данном случае 80%).

Думаю, этот образ говорит сам за себя. Возьмите верхний левый график. И размер выборки, и распространенность очень малы: у нас 1000 наблюдений и 1% положительных результатов, что означает 10 положительных и 990 отрицательных результатов. В этом случае неопределенность очень высока, и результирующее распределение баллов ROC почти однородно, от 75% до 85%. Кроме того, 95-й процентиль расстояния между показателями ROC составляет 10%, что означает, что нет существенной разницы между наблюдаемым ROC в 75% и наблюдаемым ROC в 85%.

Однако по мере того, как мы постепенно увеличиваем размер выборки и/или распространенность, ситуация улучшается, и распределение наблюдаемой оценки ROC все больше и больше концентрируется вокруг истинного значения (в данном случае 80%). Например, при 10 000 наблюдений и 20% распространенности 95-й процентиль становится гораздо более разумным значением 1,2%.

Это полезно для меня?

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

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

Вы можете найти весь код Python, использованный в этой статье, на моей странице Github.

Если вы хотите прочитать подробное обсуждение этой темы, больше с точки зрения проверки гипотез (а не с точки зрения моделирования), вы можете прочитать этот пост в блоге Лорен Окден Рейнер: «Соревнования по ИИ не создают полезных моделей.

Спасибо, что прочитали! Надеюсь, вам понравилась эта статья. Если хотите, добавьте меня в Linkedin!