Внедрение Amazon DataWig в Python для вменения пропущенных значений в табличных данных

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

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

Содержание

(1)Типы отсутствующих данных и методы импутации(необязательно)
(2)О DataWig
(3)Как работает DataWig
(4)Производительность импутации DataWig
(5) Реализация Python
(6)Расширенные возможности

(1) Типы отсутствующих данных и методы вменения

(Необязательный праймер)

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

(2) О DataWig

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

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

(3) Как работает DataWig

DataWig запускает три компонента для импутации разнородных данных: Encode, Featurizer и Imputer.

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

Таким образом, столбец Цвет – это столбец, который необходимо вычислить (он же выходнойстолбец), а остальные столбцы – это столбец >введитестолбцы.

Цель состоит в том, чтобы использовать первые две строки (содержащие полные данные) для обучения модели импутации и прогнозирования отсутствующего значения «Color» в третьей строке.

  1. Типы данных столбцов сначала определяются автоматически с помощью эвристики. Например, столбец определяется как категориальный, а не как обычный текст, если в нем как минимум в десять раз больше строк, чем уникальных значений.
  2. Функции преобразуются в числовое представление с помощью кодировщиков столбцов, например, однократного кодирования.
  3. Столбцы в числовом формате преобразуются в векторы признаков.
  4. Векторы признаков объединяются в скрытое представление для анализа в модели вменения для обучения и прогнозирования.

Давайте рассмотрим каждый из трех компонентов:

(и) Кодировщик

Класс ColumnEncoder преобразует необработанные данные в числовые представления. Существуют различные типы кодировщиков для различных типов данных, например:

  • SequentialEncoder — последовательности строковыхсимволов (например, символов)
  • BowEncoder — Представление строк в виде разреженных векторов в наборе слов
  • CategoricalEncoder — для категориальных переменных (горячее кодирование).
  • NumericalEncoder — для числовых значений (нормализация значений).

(ii) Характеризатор

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

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

Существуют также различные типы функционализаторов для разных типов данных:

  • LSTMFeaturizer – преобразует входные последовательности в скрытые векторы с помощью LSTM.
  • BowFeaturizer — преобразование строковых данных в разреженные векторы.
  • EmbeddingFeaturizer — преобразует закодированные категориальные данные в векторные представления (т. е. встраивания).
  • NumericalFeaturizer — извлечение векторов объектов с использованием полносвязных слоев.

(iii) Вменитель

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

DataWig использует технику MICE для вменения, а модель, используемая внутри, представляет собой нейронную сеть, обученную в бэкэнде с MXNet.

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

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

(4) Производительность импутации DataWig

Команда Amazon Science оценила DataWig, сравнив его с пятью популярными методами заполнения отсутствующих числовых значений.

Эти другие методы вменения включают вменение среднего, kNN, матричную факторизацию (MF) и итеративное вменение (линейная регрессия и случайный лес). Сравнение проводилось по синтетическим и реальным данным с различным количеством отсутствующих данных и типами отсутствующих данных.

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

Более подробную информацию об оценке (в том числе о неструктурированном тексте) можно найти в исследовательской статье.

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

(5) Реализация Python

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

Примечание. Вы можете найти репозиторий GitHub для этого проекта здесь и полную демонстрацию блокнота Jupyter здесь.

В частности, в рамках демонстрации мы выполним два импутации:

  1. Числовое вменение: заполните пропущенные значения в числовом столбце MaxHR (максимальная частота сердечных сокращений, достигнутая человеком).
  2. Категорическое вменение: заполните пропущенные значения в категориальном столбце ChestPain (тип возникшей боли в груди)

Шаг 1 — Первоначальная настройка

  • Создайте и активируйте новую conda среду с помощью Python версии 3.7. Причина в том, что сейчас DataWig работает с версией 3.7 и ниже.
conda create -n myenv python=3.7
conda activate myenv
  • Установить DataWig через pip
pip install datawig
  • Если вы хотите, чтобы среда отображалась в вашем блокноте Jupyter, вы можете запустить следующее:
python -m ipykernel install --user --name myenv --display-name "myenv"

Примечание. Убедитесь, что библиотеки pandas, NumPy и scikit-learn обновлены до последних версий.

Шаг 2 — Предварительная обработка данных

Перед вменением необходимо выполнить два этапа предварительной обработки:

  • Выполните случайное перемешивание поезд-тест (80/20)
  • Случайным образом скройте произвольную долю (например, 25 %) значений в тестовом наборе данных, чтобы имитировать отсутствующие данные. Набор поездов не будет полностью отсутствовать для обучения модели вменения.

Вот пример тестового набора с отсутствующими данными, отображаемыми как NaN:

Шаг 3 — Настройка модели вменения

Самый простой способ построить и развернуть модель вменения — использовать класс SimpleImputer. Он автоматически определяет типы данных столбца и использует набор кодировщиков и функций по умолчанию, которые дают хорошие результаты для различных наборов данных.

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

Затем мы создаем два экземпляра SimpleImputer, по одному для каждого из двух столбцов, подлежащих вменению (т. е. MaxHR и ChestPain).

Шаг 4 — Подгонка модели вменения

Когда наши экземпляры моделей готовы, мы можем поместить их в наш набор данных поездов. Помимо простой подгонки модели, мы можем использовать функцию оптимизации гиперпараметров (HPO) fit_hpo функции SimpleImputer, чтобы найти лучшую модель вменения.

Функция HPO использует случайный поиск в пользовательской сетке гиперпараметров (например, скорость обучения, размер пакета, количество скрытых слоев).

Если HPO не требуется, мы можем опустить аргументы поиска гиперпараметров (как показано в примере категориального вменения)

Шаг 5 — Выполните вменение и сгенерируйте прогнозы

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

Результатом является исходный фрейм данных плюс новый столбец вмененных данных.

Шаг 6 — Оценка

Наконец, давайте посмотрим, как наши модели вменения справились с этими показателями оценки:

  • Среднеквадратическая ошибка (MSE) для численного вменения
  • Коэффициент корреляции Мэтью (MCC) для категориального вменения

Для этой демонстрации MSE составляет 342,4, а MCC — 0,22. Эти значения служат эталоном для сравнения с другими методами условного исчисления.

(6) Дополнительные функции

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

(i) Вменитель

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

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

Вот пример явного определения кодировщика и функции для каждого столбца в Imputer:

Затем экземпляр Imputer можно использовать для выполнения .fit() и .predict().

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

(ii) Обнаружение и исправление смещения метки

Класс SimpleImputer имеет удобную функцию check_for_label_shift, которая помогает нам обнаруживать проблемы дрейфа данных (в частности, сдвиг метки).

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

Функция check_for_label_shift регистрирует серьезность сдвига и возвращает весовые коэффициенты для меток. Вот пример вывода весов:

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

Подведение итогов

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

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

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

Репозиторий GitHub для этого проекта можно найти здесь.

Перед тем, как ты уйдешь

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