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

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

Типы отсутствующих данных

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

  1. Отсутствует совершенно случайно (MCAR)
  2. Отсутствует случайным образом (MAR)
  3. Пропал не случайно (МНАР)

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

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

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

Выявление типов недостающих данных

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

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

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

  1. За отсутствующими значениями, которые мы принимаем за MNAR, стоит правило, и это правило имеет смысл с точки зрения бизнеса.
  2. Прогностическая сила переменных/предикторов увеличилась после того, как мы разделили пропущенные значения на предполагаемые MNAR и не-MNAR.

Следующий вопрос: как нам идентифицировать MNAR по недостающим данным? Мы можем сделать это:

  1. Используйте обучающую часть наших данных (после разделения на train, test и valid) и снова разделите ее на train_train и train_test.
  2. Используйте наш train_train, чтобы подобрать модель дерева решений, предсказывающую, отсутствует ли переменная или нет. Если у нас недостаточно образцов, мы можем использовать данные поезда для подбора и данные проверки для тестирования.
  3. Проверьте производительность дерева решений с помощью наших данных train_test. Хорошо ли работает модель?
  4. Проверьте правило дерева решений. Правило, предсказывающее пропущенные значения, выглядит корректным с точки зрения бизнеса?
  5. Проверьте взаимосвязь между нашим подозреваемым MNAR, предсказанным деревом решений, и целью. Имеет ли это смысл?
  6. Проверьте прогностическую силу этой конкретной переменной после того, как мы разделим пропущенные значения на MNAR и не-MNAR. Дает ли расщепление дополнительную предсказательную силу?

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

У этого метода есть несколько недостатков. Как мы можем догадаться, этот метод небезопасен. Это потенциально может сделать нашу модель переобученной, особенно если размер данных недостаточно велик для обучения и тестирования дерева решений. Иногда также очень трудно определить, имеют ли смысл отношения между правилом и целью. Пример вероятного действительного правила: цель нашей модели — предсказать, есть ли у человека незаконный наркотик, и мы хотим разделить пропущенные значения на истинную или ложную переменную, спрашивая, употреблял ли человек когда-либо раньше запрещенные наркотики. Наше дерево решений предсказывает, что переменная содержит пропущенные значения, если возраст человека старше восемнадцати лет и он/она когда-либо раньше находился в тюрьме. Если целевая скорость (истинная частота) нашего подозреваемого MNAR значительно выше, чем непропущенные значения, то вполне вероятно, что мы успешно идентифицировали MNAR. В этом случае мы будем использовать правила, сгенерированные деревом решений, для разделения пропущенных значений. В качестве альтернативы мы также можем использовать любые классификаторы для прогнозирования пропущенных значений и использовать Якоря для получения правил.

Вменение пропущенных значений

То, как мы вменяем пропущенные значения, зависит от того, сколько пропущенных значений и какую модель мы хотим использовать. Когда у нас есть достаточно большие пропущенные значения, может быть прогнозируемым, если пропущенные значения не случайны. В этом случае мы должны использовать целевую статистику для вменения пропущенных значений, особенно когда мы используем GLM. Примерами целевой статистики являются интерполяция с целью, целевые средние значения, вес доказательств и т. д. Существует хорошая библиотека Python под названием Feature-engine, которая дает нам простой способ использовать целевую статистику для вменения. Альтернативный метод состоит в том, чтобы заполнить отсутствующие значения нулями и добавить переменную (столбец) в ваш набор данных, содержащую единицу (истина), когда значение в этой конкретной переменной отсутствует, и ноль (ложь), когда значение отсутствует.

Если мы используем ансамблевые модели (например, случайный лес, xgboost, lightgbm, catboost и т. д.), вы можете заменить недостающие значения супервыбросом (например, -2*max(abs(value))) для числовых данных. В случае категориальных данных мы можем рассматривать пропущенные значения как новую категорию. Причина, по которой это так просто в случае ансамблевых моделей, особенно для моделей деревьев с градиентным усилением, заключается в том, что они имеют внутренние взаимодействия функций и целевую статистику, а GLM - нет.

Избегайте использования одномерных статистических данных, таких как среднее значение, медиана и мода, для импутации переменной, поскольку эти значения не объясняют отношения между отсутствующими значениями и целевым значением. Только представьте, у нас тысяча студентов, и 5% ваших студенческих листов с ответами на последнем экзамене где-то потерялись. Если мы знаем, что средний балл наших студентов равен 6,5 из 10 и распределение нормальное, то есть ли смысл приписывать все пропущенные оценки к 6,5, если мы уже знаем, что все студенты с пропущенными оценками не сдали экзамен? Это не так? Мы можем использовать одномерную статистику в реализации модели, чтобы предвидеть пропущенные значения, которые мы не наблюдали во время построения модели. Однако это решение - всего лишь обходной путь. Как только мы получим достоверные данные (цель), мы должны перекалибровать модель (или переобучить ее) и, если возможно, использовать целевую статистику.

Если вам понравилась эта статья, пожалуйста, подпишитесь на меня. Если вы заметили ошибку или считаете, что эта статья не имеет смысла, пожалуйста, подумайте о том, чтобы оставить несколько комментариев. Я расследую, пересмотрю и отдам вам должное. Спасибо!