Где в рабочем процессе мы должны иметь дело с отсутствующими данными?


16

Я строю рабочий процесс для создания моделей машинного обучения (в моем случае, с использованием Python pandasи sklearnпакетов) из данных, извлеченных из очень большой базы данных (здесь, Vertica посредством SQL и pyodbc), и критический шаг в этом процессе включает в себя отсутствие значения предикторов. Это просто в рамках единой платформы аналитики или статистики - будь то Python, R, Stata и т. Д. - но мне интересно, где лучше всего найти этот шаг в многоплатформенном рабочем процессе.

Это достаточно просто сделать в Python, либо с sklearn.preprocessing.Imputerклассом, используя pandas.DataFrame.fillnaметод, либо вручную (в зависимости от сложности используемого метода импутации). Но поскольку я собираюсь использовать это для десятков или сотен столбцов в сотнях миллионов записей, мне интересно, есть ли более эффективный способ сделать это напрямую через SQL заблаговременно. Помимо потенциальной эффективности выполнения этого в распределенной платформе, такой как Vertica, это даст дополнительное преимущество, поскольку позволит нам создать автоматизированный конвейер для построения «полных» версий таблиц, поэтому нам не нужно будет заполнять новый набор. пропущенных значений с нуля каждый раз, когда мы хотим запустить модель.

Я не смог найти много рекомендаций по этому поводу, но я думаю, что мы могли бы:

  1. создать таблицу замещающих значений (например, среднее значение / медиана / режим, общее или по группам) для каждого неполного столбца
  2. соедините таблицу замещающих значений с исходной таблицей, чтобы назначить замещающее значение для каждой строки и неполного столбца
  3. используйте серию операторов case, чтобы получить исходное значение, если оно доступно, и замещающее значение в противном случае

Разумно ли это делать в Vertica / SQL, или есть веская причина не беспокоиться и просто обрабатывать это в Python? И если последнее, есть ли веские основания для этого в пандах, а не в склеарне или наоборот? Благодарность!

Ответы:


14

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

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

Поэтому прежде всего примите мудрое решение. Я часто тратил время на попытки автоматизировать эти вещи, уничтожая мои данные. Я приведу несколько примеров: - рынок, закодированный как N / A, который я пропустил и считал Северной / Америкой - числа вроде -999.0, потому что производитель данных не смог найти лучшую замену отсутствующим данным - число, например 0 для артериальное давление или температура тела вместо отсутствующих данных (трудно представить живого человека с нулевым артериальным давлением) - множественные заполнители для отсутствующих данных из-за того, что данные были собраны из различных источников

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

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


1
+1 автоматизация не обязательно делает вещи лучше, только более последовательно и часто быстрее!
Джеймс

4

Therriault, очень рад слышать, что вы используете Vertica! Полное раскрытие, я главный ученый данных там :). Рабочий процесс, который вы описываете, является именно тем, с чем я сталкиваюсь довольно часто, и я искренне верю в предварительную обработку этих очень больших наборов данных в базе данных перед любой работой pyODBC и pandas. Я бы предложил создать представление или таблицу с помощью файлового запроса, чтобы обеспечить воспроизводимую работу. Удачи

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.