Де в робочому процесі ми маємо мати справу з відсутніми даними?


16

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

Це досить просто зробити в Python, або з sklearn.preprocessing.Imputerкласом, використовуючи pandas.DataFrame.fillnaметод, або вручну (залежно від складності використовуваного методу імпутації). Але оскільки я буду використовувати це для десятків чи сотень стовпців у сотнях мільйонів записів, мені цікаво, чи існує більш ефективний спосіб зробити це безпосередньо через SQL достроково. Окрім потенційної ефективності цього на розподіленій платформі, як Vertica, це матиме додаткову перевагу, що дозволяє нам створити автоматизований конвеєр для побудови "повних" версій таблиць, тому нам не потрібно заповнювати новий набір пропущених значень з нуля кожного разу, коли ми хочемо запустити модель.

Мені не вдалося знайти багато настанов з цього приводу, але я думаю, що ми могли б:

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

Це розумна справа в Vertica / SQL, чи є вагомий привід не турбуватися і просто обробляти це на Python? І якщо останнє, чи є вагомий випадок робити це в пандах, а не в склеарні чи навпаки? Спасибі!

Відповіді:


14

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

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

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

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

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


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

4

Therriault, дуже раді почути, що ви використовуєте Vertica! Повне розкриття, я головний науковець там :). Опис робочого процесу, який ви описуєте, - це саме те, з чим я стикаюся досить часто, і я справді вірую в попередню обробку цих дуже великих наборів даних у базі даних перед будь-якими роботами pyODBC і пандами. Я б запропонував створити подання або таблицю за допомогою файлового запиту просто для забезпечення відтворюваної роботи. Щасти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.