Понимание пропущенных данных абсолютное руководство для специалистов по анализу данных
Understanding missing data a comprehensive guide for data analysts
Хроники качества данных
Отсутствующие данные, отсутствующие механизмы и профилирование отсутствующих данных
В начале этого года я начал статью о нескольких проблемах (или характеристиках) качества данных, которые серьезно подрывают наши модели машинного обучения.
Одной из них, неудивительно, являются отсутствующие данные.
Я изучаю эту тему уже много лет (да, я знаю, верно!), но в процессе работы над некоторыми проектами, в которых я участвую в сообществе, посвященном данным, я понял, что многие ученые по данным все еще не полностью осознали всю сложность этой проблемы, что вдохновило меня создать этот исчерпывающий учебник.
Сегодня мы рассмотрим тонкости проблемы отсутствующих данных, узнаем о различных типах отсутствующих данных, с которыми мы можем столкнуться на практике, и рассмотрим, как мы можем идентифицировать и пометить отсутствующие значения в реальных наборах данных.
- Утопая в данных? Озеро данных может стать вашим спасателем
- База данных векторов Руководство для начинающих!
- Картирование Южной Америки с помощью R Погружение в гео-визуализацию
Проблема отсутствующих данных
Отсутствующие данные представляют собой интересное несовершенство данных, поскольку они могут возникать естественным образом из-за особенностей предметной области или быть ненароком созданными в процессе сбора, передачи или обработки данных.
По сути, отсутствующие данные характеризуются появлением отсутствующих значений в данных, то есть отсутствующих значений в некоторых записях или наблюдениях в наборе данных, и могут быть одномерными (одна характеристика имеет отсутствующие значения) или многомерными (несколько характеристик имеют отсутствующие значения):

Давайте рассмотрим пример. Допустим, мы проводим исследование по когорте пациентов, касающееся диабета, например.
Медицинские данные отличный пример, поскольку они часто подвержены отсутствующим значениям: значения пациентов берутся как из опросов, так и из лабораторных результатов, могут измеряться несколько раз в течение диагностики или лечения, хранятся в разных форматах (иногда распределены по институтам) и часто обрабатываются разными людьми. Все это может (и, скорее всего, будет) привести к сложностям!
В нашем исследовании диабета наличие отсутствующих значений может быть связано с проводимым исследованием или собираемыми данными.
Например, отсутствующие данные могут возникать из-за неисправного датчика, который выключается при высоком значении артериального давления. Еще одна возможность заключается в том, что отсутствующие значения в характеристике «вес» более вероятно отсутствуют у старших женщин, которые менее склонны раскрывать эту информацию. Или ожиревшие пациенты могут быть менее склонны делиться своим весом.
С другой стороны, данные также могут отсутствовать по причинам, не связанным с исследованием.
У пациента может отсутствовать часть информации из-за прокола шины, в результате чего он пропустил визит к врачу. Данные также могут отсутствовать из-за человеческой ошибки: например, если человек, проводящий анализ, потерял или неправильно прочитал некоторые документы.
Независимо от причины отсутствия данных, важно исследовать, содержат ли наборы данных отсутствующие данные перед построением модели, поскольку эта проблема может иметь серьезные последствия для классификаторов:
- Некоторые классификаторы не могут обрабатывать отсутствующие значения внутренне: Это делает их непригодными для работы с наборами данных, содержащими отсутствующие данные. В некоторых сценариях эти значения кодируются заранее определенным значением, например, “0”, чтобы алгоритмы машинного обучения могли с ними справиться, хотя это не является лучшей практикой, особенно для более высоких процентов отсутствующих данных (или более сложных механизмов отсутствия);
- Прогнозы на основе отсутствующих данных могут быть смещенными и ненадежными: Хотя некоторые классификаторы могут обрабатывать отсутствующие данные внутренне, их прогнозы могут быть компрометированы, поскольку в обучающих данных может отсутствовать важная информация.
Кроме того, хотя отсутствующие значения могут “все выглядеть одинаково”, правда в том, что их основные механизмы (причина их отсутствия) могут следовать 3 основным паттернам: Полное случайное отсутствие (MCAR), Отсутствие не случайно (MNAR) и Отсутствие не случайно (MNAR).
Сохранение этих различных типов механизмов отсутствия в уме важно, потому что они определяют выбор соответствующих методов для эффективной обработки отсутствующих данных и достоверность выводов, полученных из них.
Давайте быстро рассмотрим каждый механизм!
Механизмы отсутствующих данных
Если вы математический человек, я бы порекомендовал ознакомиться с этой статьей (хм, хм), а именно разделами II и III, которые содержат всю нотацию и математическую формулировку, которую вы, возможно, ищете (на самом деле я был вдохновлен этой книгой, которая также является очень интересным руководством, посмотрите разделы 2.2.3 и 2.2.4).
Если вы также визуальный ученик, как и я, вам бы хотелось “увидеть” это, верно?
Для этого мы рассмотрим пример исследования курения подростков, использованного в статье. Мы рассмотрим фиктивные данные, чтобы продемонстрировать каждый механизм отсутствия:

Один момент, который следует иметь в виду: механизмы отсутствия описывают, можно ли и как можно объяснить паттерн отсутствия с помощью наблюдаемых данных и/или отсутствующих данных. Это сложно, я знаю. Но с примером все станет более понятным!
В нашем исследовании по табаку мы сосредоточены на использовании табака подростками. Всего 20 наблюдений, относящихся к 20 участникам, и признак Age
полностью наблюдается, в то время как Number of Cigarettes
(куримых в день) будет отсутствовать в соответствии с разными механизмами.
Полное случайное отсутствие (MCAR): Без вреда, без нарушений!
В механизме полного случайного отсутствия (MCAR) процесс отсутствия полностью не связан ни с наблюдаемыми, ни с отсутствующими данными. Это означает, что вероятность наличия отсутствующих значений для признака полностью случайна.

В нашем примере я просто случайным образом удалил некоторые значения. Обратите внимание, как отсутствующие значения не находятся в определенном диапазоне значений Age
или Number of Cigarettes
. Этот механизм может возникнуть вследствие неожиданных событий, происходящих во время исследования: скажем, ответственное лицо за регистрацию ответов участников случайно пропустило вопрос в опросе.
Отсутствие случайно (MAR): Ищите признаки!
Название на самом деле вводит в заблуждение, поскольку отсутствие случайно (MAR) происходит, когда процесс отсутствия может быть связан с наблюдаемой информацией в данных (хотя не с отсутствующей информацией самой по себе).
Рассмотрим следующий пример, в котором я удалил значения Number of Cigarettes
только для молодых участников (от 15 до 16 лет). Обратите внимание, что несмотря на то, что процесс отсутствия явно связан с наблюдаемыми значениями в Age
, он полностью не связан с количеством сигарет, которые эти подростки курили бы, если бы они были зафиксированы (обратите внимание на столбец “Complete”, где среди отсутствующих значений, если бы они были зафиксированы, было бы найдено низкое и высокое количество сигарет).

Такое могло бы быть, если молодые ребята были бы менее склонны раскрывать количество выкуренных ими сигарет в день, избегая признавать, что они регулярные курильщики (независимо от количества выкуриваемых сигарет).
Механизм неслучайного отсутствия (MNAR): Момент аха!
Как и ожидалось, механизм неслучайного отсутствия (MNAR) является самым сложным из всех, поскольку процесс отсутствия может зависеть как от наблюдаемой, так и от отсутствующей информации в данных. Это означает, что вероятность появления пропущенных значений в признаке может быть связана как с наблюдаемыми значениями другого признака в данных, так и с пропущенными значениями этого признака самого по себе!
Взгляните на следующий пример: значения отсутствуют для более высоких значений “Количество сигарет”, что означает, что вероятность появления пропущенных значений в “Количество сигарет” связана с самими отсутствующими значениями, если бы они были наблюдены (обратите внимание на столбец “Полный”).

Такое могло бы быть в случае подростков, отказавшихся сообщать о количестве выкуренных ими сигарет в день, так как они выкуривают очень большое количество.
Влияние механизмов пропущенных данных
В нашем простом примере мы видели, что MCAR – самый простой из механизмов пропущенных данных. В таком сценарии мы можем игнорировать множество сложностей, возникающих из-за появления пропущенных значений, и некоторые простые методы исправления, такие как удаление случаев или простые статистические методы заполнения, могут сработать.
Однако, хотя это удобно, правда в том, что в реальных областях MCAR часто нереалистичен, и большинство исследователей обычно предполагают, что по крайней мере есть MAR в своих исследованиях, что является более общим и реалистичным, чем MCAR. В таком сценарии мы можем рассматривать более надежные стратегии, которые могут извлекать пропущенную информацию из наблюдаемых данных. В этом отношении стратегии импутации данных на основе машинного обучения обычно являются наиболее популярными.
Наконец, MNAR – самый сложный случай, поскольку очень сложно определить причины пропусков. Текущие подходы сосредоточены на отображении причин отсутствующих значений с использованием корректирующих коэффициентов, определенных экспертами в области, на выводе пропущенных данных из распределенных систем, на расширении современных моделей (например, генеративных моделей) для включения множественной импутации или на проведении анализа чувствительности для определения, как меняются результаты в различных условиях.
Также, когда речь идет об идентифицируемости, проблема не становится проще.
Хотя есть некоторые тесты для различения MCAR и MAR, они не пользуются широкой популярностью и имеют ограничительные предположения, которые не соблюдаются для сложных реальных наборов данных. Невозможно также отличить MNAR от MAR, так как отсутствует информация, которая была бы необходима.
Для диагностики и отличия отсутствующих механизмов на практике мы можем сосредоточиться на проверке гипотез, анализе чувствительности, получении некоторых идей от экспертов в области и исследовании визуализационных техник, которые могут дать понимание областей.
Естественно, есть и другие сложности, которые необходимо учитывать и которые определяют применение стратегий обработки недостающих данных, а именно процент данных, которые отсутствуют, количество признаков, которые они затрагивают, и конечная цель техники (например, питание модели обучения для классификации или регрессии, восстановление исходных значений наиболее аутентичным способом?).
В общем, не легкая задача.
Выявление и отметка отсутствующих данных
Давайте разберемся постепенно. Мы только что узнали о перегрузке информацией о отсутствующих данных и их сложных взаимосвязях.
В этом примере мы рассмотрим основы того, как отмечать и визуализировать отсутствующие данные в реальном наборе данных и подтвердить проблемы, которые отсутствующие данные вносят в проекты по науке о данных.
Для этой цели мы воспользуемся набором данных Pima Indians Diabetes, доступным на Kaggle (лицензия – CC0: общественное достояние). Если вы хотите следовать учебнику, не стесняйтесь загружать блокнот из репозитория Data-Centric AI Community на GitHub.
Чтобы быстро проанализировать свои данные, мы также используем ydata-profiling
, который дает нам полный обзор нашего набора данных всего за несколько строк кода. Давайте начнем с его установки:
Установка последней версии ydata-profiling. Фрагмент кода автора.
Теперь мы можем загрузить данные и создать быстрый профиль:
Загрузка данных и создание отчета профилирования. Фрагмент кода автора.
Просмотрев данные, мы можем определить, что этот набор данных состоит из 768 записей/строк/наблюдений (768 пациентов) и 9 атрибутов или признаков. Фактически, Outcome
– это целевой класс (1/0), поэтому у нас есть 8 предикторов (8 числовых признаков и 1 категориальный).

С первого взгляда набор данных не кажется имеющим отсутствующие данные. Однако известно, что этот набор данных подвержен отсутствующим данным! Как мы можем это подтвердить?
Просмотрев раздел “Оповещения”, мы видим несколько оповещений о “нулях”, которые указывают нам на то, что есть несколько признаков, для которых нулевые значения не имеют смысла или являются биологически невозможными: например, нулевое значение индекса массы тела или артериального давления является недопустимым!
Пробежавшись по всем признакам, мы можем определить, что количество беременностей выглядит нормально (нулевые беременности разумны), но для остальных признаков нулевые значения вызывают подозрение:

В большинстве реальных наборов данных отсутствующие данные кодируются особыми значениями:
- Значения вне диапазона, например,
999
; - Отрицательные числа, когда признак имеет только положительные значения, например,
-1
; - Нулевые значения для признака, который не может быть равным 0.
В нашем случае отсутствующие данные есть у признаков Glucose
, BloodPressure
, SkinThickness
, Insulin
и BMI
. Посчитаем количество нулевых значений для этих признаков:
Подсчет количества нулевых значений. Фрагмент кода автора.
Мы видим, что Glucose
, BloodPressure
и BMI
имеют всего несколько нулевых значений, в то время как SkinThickness
и Insulin
имеют гораздо больше, покрывая почти половину существующих наблюдений. Это означает, что мы можем рассмотреть различные стратегии для обработки этих признаков: некоторые могут требовать более сложных методик заполнения, чем другие, например.
Чтобы сделать наш набор данных согласованным с конкретными соглашениями, мы должны заменить эти отсутствующие значения на NaN
значения.
Это стандартный способ обработки отсутствующих данных в Python и соглашение, которому следуют популярные пакеты, такие как pandas
и scikit-learn
. Эти значения игнорируются при некоторых вычислениях, таких как sum
или count
, и распознаются некоторыми функциями для выполнения других операций (например, удаление отсутствующих значений, их заполнение, замена на фиксированное значение и т. д.).
Мы отметим наши отсутствующие значения с помощью функции replace()
, а затем вызовем isnan()
, чтобы проверить, правильно ли они закодированы:
Отметим нулевые значения как значения NaN. Фрагмент автора.
Количество значений NaN
совпадает с количеством значений 0
, что означает, что мы правильно отметили наши отсутствующие значения! Затем мы можем снова использовать отчет профилирования, чтобы проверить, что теперь отсутствующие данные распознаются. Вот как выглядят наши “новые” данные:

Мы также можем дополнительно проверить некоторые характеристики процесса отсутствия данных, просматривая раздел “Отсутствующие значения” отчета:

Помимо диаграммы “Count”, которая дает нам обзор всех отсутствующих значений для каждой функции, мы можем подробнее изучить диаграммы “Matrix” и “Heatmap”, чтобы сформулировать гипотезы о подлежащих отсутствующим механизмах данных. В частности, корреляция между отсутствующими признаками может быть информативной. В этом случае кажется, что существует значительная корреляция между Insulin
и SkinThicknes
: оба значения кажутся одновременно отсутствующими для некоторых пациентов. Независимо от того, это совпадение (маловероятно) или процесс отсутствия можно объяснить известными факторами, такими как механизмы MAR или MNAR, это то, во что нам следует погрузиться!
Тем не менее, теперь у нас есть готовые данные для анализа! К сожалению, процесс обработки отсутствующих данных далеко не завершен. Многие классические алгоритмы машинного обучения не могут работать с отсутствующими данными, и нам нужно найти экспертные способы смягчения этой проблемы. Давайте попробуем оценить алгоритм линейного дискриминантного анализа (LDA) на этом наборе данных:
Оценка алгоритма линейного дискриминантного анализа (LDA) с отсутствующими значениями. Фрагмент автора.
Если вы попытаетесь запустить этот код, он сразу же выдаст ошибку:

Самый простой способ исправить это (и самый наивный!) – удалить все записи, содержащие отсутствующие значения. Мы можем сделать это, создав новый фрейм данных, из которого удалены строки с отсутствующими значениями, с помощью функции dropna()
…
Удаление всех строк/наблюдений с отсутствующими значениями. Фрагмент автора.
… и попытаться снова:
Оценка алгоритма LDA без отсутствующих значений. Фрагмент автора.

И вот оно! Путем удаления отсутствующих значений алгоритм LDA теперь может работать нормально.
Однако размер набора данных существенно уменьшился до всего 392 наблюдений, что означает, что мы теряем почти половину доступной информации.
Поэтому, вместо простого удаления наблюдений, мы должны искать стратегии импутации, либо статистические, либо основанные на машинном обучении. Мы также можем использовать синтетические данные для замены отсутствующих значений, в зависимости от нашего конечного применения.
И для этого мы можем попытаться получить представление о скрытых механизмах отсутствующих значений в данных. Что-то, на что стоит обратить внимание в будущих статьях?
Заключительные мысли
В этой статье мы рассмотрели все основы, с которыми должны ознакомиться специалисты по обработке данных, начиная работу с отсутствующими данными.
От самой проблемы до механизмов отсутствия данных, мы обнаружили влияние, которое отсутствующая информация может оказывать на наши проекты по анализу данных, и то, что, несмотря на то, что все NaN
могут выглядеть одинаково, они могут рассказывать совершенно разные истории.
В моих следующих статьях я рассмотрю каждый конкретный механизм отсутствия данных, сосредоточившись на стратегиях генерации, импутации и визуализации для каждого из них, так что следите за новыми публикациями в блоге и не забудьте поставить звездочку репозиторию Data-Centric AI, чтобы не упустить обновления кода!
Как всегда, отзывы, вопросы и предложения очень приветствуются! Вы можете оставить комментарий, внести свой вклад в репозиторий, и даже найти меня в сообществе Data-Centric AI, чтобы обсудить другие вопросы, связанные с данными. Увидимся там?
Обо мне
Доктор философии, исследователь машинного обучения, преподаватель, сторонник данных и в общем “универсал”. Здесь, на VoAGI, я пишу о Центрированном на данных искусственном интеллекте и качестве данных, обучая сообщество науки о данных и машинного обучения, как перейти от неполных данных к интеллектуальным данным.
Developer Relations @ YData | Data-Centric AI Community | GitHub | Instagram | Google Scholar | LinkedIn