Чистка и препроцессинг данных. Готовим датасет для ML.

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

Импорт библиотек

Первое, что вам нужно сделать, это импортировать библиотеки для предварительной обработки данных. Доступно множество библиотек, но наиболее популярными и важными библиотеками Python для работы с данными являются Numpy, Matplotlib и Pandas. Numpy - это библиотека, используемая для всех математических вещей. Pandas - лучший инструмент для импорта и манипуляций с датасетами. Matplotlib (Matplotlib.pyplot) - это библиотека для создания диаграмм. Альтернативными решениями для Matplotlib могут выступать библиотеки Seaborn и Plotly.
Как правило, при импорте считается хорошим тоном задать для каждой библиотеки свой алиас (псевдоним):


Шаг 1. Загрузка данных в Pandas

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


• Удаление первой строки: Если в вашем датасете первой строкой идет, например, заголовок или описание датасета, то этот текст будет мешать правильному анализу датасета в pandas. Вы должны оставить только заголовки самих столбцов. Если первая строка датасета содержит сами заголовки столбцов, то этот шаг пропускаем.

• Удаление столбцов с текстовыми пояснениями, которые вам не понадобятся, столбцов содержащих url, ФИО, адресные строки и других ненужных столбцов.

• Удаление всех столбцов только с одним значением или с отсутствующими значениями более чем на 50%, чтобы работать быстрее (имеет смысл, если ваш датасет достаточно велик)

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

Шаг 2. Изучение набора данных



Понимание данных
Теперь начальная подготовка данных произведена, но вам все равно следует потратить некоторое время на их изучение и понимание того, какую фичу представляет каждый столбец. Такой ручной просмотр датасета важен, чтобы избежать ошибок при анализе данных и процессе моделирования.
Чтобы упростить процесс, вы можете создать DataFrame с именами столбцов, типами данных, значениями первой строки и описанием из словаря данных.
Изучая фичи, следует обращать внимание на столбцы, которые:
• плохо отформатированы,
• требуют больше данных или трудозатратной предварительной обработки, чтобы эта фича стала полезной,
• содержит избыточную информацию,
Все эти вещи могут повредить вашему анализу, если обращаться с ними неправильно.
Также следует держать во внимании проблему утечки данных (data leakage - термин использующийся в ML), которая может привести к переобучению модели. Мы должны быть уверены, что наша модель обучена, используя только те данные, которые она будет иметь в момент совершения предсказуемого действия, но не после его совершения.

Выбор целевой переменной
Изучив отфильтрованный датасет, вам необходимо создать матрицу зависимых переменных и вектор независимых переменных. Сначала вы должны выбрать подходящий столбец для использования в качестве целевой переменной для моделирования на основе вопроса, на который вы хотите ответить. Например, если вы собираетесь спрогнозировать развитие рака или вероятность того, что кредит будет одобрен, вам нужно найти столбец со статусом заболевания (Обнаружено/Нет) или объявлением о предоставлении кредита (Одобрено/Нет) и использовать его значения в качестве целевой переменной..
Например, если целевой столбец является последним, вы можете создать матрицу зависимых переменных, набрав:

Первое двоеточие (:) означает, что мы хотим взять все строки в нашем датасете. : -1 означает, что мы хотим взять все столбцы данных, кроме последнего. .Values ​​в конце означает, что нам нужны значения этих столбцов.
Чтобы получить вектор независимых переменных только с данными из последнего столбца, вы можете набрать команду:


Шаг 3. Подготовка фичей для машинного обучения


Наконец, пришло время провести подготовительную работу по внедрению фичей для машинного обучения. Чтобы очистить датасет, вам необходимо обработать недостающие значения (NaN - наны) и категориальные данные, поскольку математика, лежащая в основе большинства моделей машинного обучения, предполагает, что данные являются числовыми и не содержат пропущенных значений.
Более того, библиотека scikit-learn выдаст вам ошибку, если вы попытаетесь обучить модель, такую ​​как линейная регрессия или логистическая регрессия, с использованием данных, содержащих отсутствующие или нечисловые значения.


Работа с недостающими значениями
Отсутствие данных - это, пожалуй, наиболее частая проблема с нечистыми данными. Такие значения обычно имеют форму NaN или None.
Вот несколько причин пропуска значений: значения отсутствуют, потому что они не существуют, или из-за неправильного сбора данных или пропусков при вводе данных. Например, если мы имеем некоторую марку автомобиля , а вопрос относится к другой марке, то в ответах на этот вопрос будет отсутствующее значение.

Есть несколько способов восполнить недостающие значения:
• вы можете удалить строки с данными, если у вас достаточно большой датасет и высокий процент пропущенных значений (например, более 50%);
• вы можете заполнить все пустые переменные 0, если вы имеете дело с числовыми значениями;
• вы можете использовать Imputerclass из библиотеки scikit-learn, чтобы заполнить отсутствующие значения данными (среднее значение, медиана, наиболее частое значение)
• вы также можете решить заполнить отсутствующие значения любым значением, идущим сразу после него в этом же столбце.

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


Обработка категориальных данных
Машинное обучение использует только числовые значения (тип данных float или int). Однако датасеты часто содержат объектный тип данных, который необходимо преобразовать в числовой. В большинстве случаев категориальные значения являются дискретными и могут быть закодированы как фиктивные переменные, присваивая номер каждой категории. Самый простой способ - использовать OneHotEncoder из библиотеки scikit learn, указав индекс столбца, с которым вы хотите работать:


Работа с несогласованным вводом данных
Несогласованность возникает, например, когда в столбце есть разные уникальные значения, которые, вроде как, должны быть одинаковыми. Слова написанные с заглавной и прописной буквы, разного рода опечатки, знаки доллара ($) в значениях валют, различное форматирование строк. И даже разделитель разрядов в виде запятой в отечественной локали. Один из способов устранения несогласованности данных - это удаление пробелов до или после имен записей и преобразование всех регистров в нижний регистр.
Однако при большом количестве несовместимых уникальных записей невозможно вручную проверить самые близкие совпадения. Вы можете использовать пакет Fuzzy Wuzzy, чтобы определить, какие строки, скорее всего, будут одинаковыми. Он принимает две строки и возвращает соотношение. Чем ближе соотношение к 100, тем больше вероятность, что вам следует объединить эти строки.

Обработка дат и времени
Еще один тип несогласованности данных - это несовместимый формат дат, например дд / мм / гг и мм / дд / гг в одних и тех же столбцах. Ваши значения дат могут быть не в правильном формате, и это не позволит вам правильно обучить модель. В таких случаях вы можете использовать пакет datetime, чтобы исправить тип даты.

Масштабирование и нормализация
Масштабирование важно, если вам нужно указать, что изменение фичи X для одного сэмпла не релевантно изменению этой же фичи для другого. С помощью масштабирования вы гарантируете, что просто потому, что некоторые функции являются большими, они не будут использоваться в качестве основного предиктора. Например, если вы используете возраст и зарплату человека в прогнозировании, некоторые алгоритмы будут уделять больше внимания зарплате, потому что она больше, что не имеет никакого смысла.
Нормализация включает в себя преобразование вашего набора данных в нормальное распределение. Некоторые алгоритмы, такие как SVM, намного быстрее сходятся на нормализованных данных, поэтому имеет смысл нормализовать ваши данные для получения лучших результатов.
Есть много способов выполнить масштабирование функций. Короче говоря, мы помещаем все наши функции в одну шкалу, чтобы ни одна из них не преобладала над другой. Например, вы можете использовать класс StandardScaler из пакета sklearn.preprocessing для соответствия и преобразования вашего набора данных:


Сохранение результатов
Чтобы быть уверенным, что у вас все еще есть необработанные данные, рекомендуется хранить промежуточный вывод каждого раздела или этапа рабочего процесса в отдельном файле CSV. Таким образом, вы сможете вносить изменения в процесс обработки данных без необходимости пересчитывать все заново.
Как и раньше, вы можете сохранить свой датафрейм как csv-файл, используя функцию pandas to_csv ():

Заключение

Это самые основные шаги, необходимые для работы с большими датасетами, их очистки и подготовки для любого проекта в сфере Data Science. Есть и другие формы очистки данных, которые могут оказаться полезными в вашей работе. Главное, чтобы вы понимали, что вам необходимо правильно организовать и привести в порядок свои данные перед построением любой модели. Более качественные и чистые данные зачастую превосходят лучшие алгоритмы. Если вы используете очень простой алгоритм на самых чистых данных, вы получите впечатляющие результаты. И, как видите, выполнить базовую предварительную обработку данных не так уж и сложно.






















Комментарии

Популярные сообщения из этого блога

Быстрый импорт в базу данных с помощью DBeaver

Jupyter-фишки, которые облегчат жизнь аналитику

Два способа загрузить свой датасет в Python

5 приемов при работе с модулем datetime в Python