Бросьте эти плохие данные, как Обама роняет микрофоны

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

Очистка данных должна быть первым шагом в рабочем процессе Data Science (DS) или машинного обучения (ML). Без чистых данных вам будет гораздо труднее увидеть действительно важные части вашего исследования. Как только вы, наконец, приступите к обучению своих моделей машинного обучения, тренировать их станет излишне сложнее. Главное, что если вы хотите получить максимальную отдачу от своих данных, они должны быть чистыми.

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

Здесь мы рассмотрим несколько вещей, которые мы обычно хотели бы очистить в наших данных, а также код pandas, который вы можете использовать для этого!

Недостающие данные

Большие наборы данных редко бывают полностью заполненными. Под полным я подразумеваю, что все точки данных имеют значения для всех их переменных функций. Обычно есть некоторые отсутствующие значения, которые при загрузке в pandas с чем-то вроде pd.read_csv() помечаются как NaN или None. Есть ряд вполне практических причин, по которым такие данные могут отсутствовать. Человек, собирающий данные, возможно, просто забыл или, возможно, он не начал собирать эту переменную характеристики до середины процесса сбора данных.

Перед началом работы с набором данных необходимо обработать недостающие данные. Например, предположим, что вы находитесь в середине процесса исследования данных и обнаруживаете некоторую ключевую информацию о своих данных, поступающую из определенной переменной функции, скажем, «переменной F». Но позже вы обнаружите, что 95% значений «переменной F» в вашем наборе данных - NaN; вы не сможете сделать какие-либо конкретные выводы о своем наборе данных на основе переменной, которая правильно представляет только 5% от него! Когда вы приступите к обучению своей модели машинного обучения, ваша программа может также обработать NaN как 0 или бесконечность, полностью отбросив ваше обучение!

Есть несколько способов справиться с отсутствующими данными в пандах:

  • Проверка NAN: pd.isnull(object) обнаружение пропущенных значений в ваших данных; это обнаруживает как «NaN», так и «None»
  • Удалить отсутствующие данные: df.dropna(axis=0, how='any') Возвращает ваш фрейм данных, из которого были удалены все точки данных, содержащие NaN.
  • Заменить отсутствующие данные: df.replace(to_replace=None, value=None) Заменить значения, указанные в "to_replace", на "значение". Это полезно, если вы знаете какое-то значение, которым должна быть эта переменная функции.
  • Удаление функции: df.drop('feature_variable_name', axis=1) Если вы обнаружите, что некоторые переменные функции имеют ›90% значений NaN в наборе данных, имеет смысл просто удалить все это из ваших данных.

Выбросы

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

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

Кроме того, если вы хотите отфильтровать эти выбросы, вы можете использовать следующий метод:

# Get the 98th and 2nd percentile as the limits of our outliers
upper_limit = np.percentile(train_df.logerror.values, 98) 
lower_limit = np.percentile(train_df.logerror.values, 2) 
# Filter the outliers from the dataframe
data[‘target’].loc[train_df[‘target’]>upper_limit] = upper_limit data[‘target’].loc[train_df[‘target’]<lower_limit] = lower_limit

Плохие данные и дубликаты

Плохие данные означают любые точки данных или значения, которых не должно быть или они просто неверны. Например, предположим, что одна из переменных вашей характеристики называется «пол», где большинство значений - «мужской» или «женский». Но затем, просматривая свой набор данных, вы замечаете, что есть пара точек данных, которые имеют значение 67,3 для пола! Ясно, что 67,3 ничего не значит в контексте этой переменной. Более того, если вы попытаетесь преобразовать функциональную переменную «пол» в категориальные числа с плавающей запятой: мужской = 0,0 и женский = 1,0, у вас будет дополнительная переменная: 67,3 = 2,0!

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

Плохие данные можно обработать либо путем удаления, либо с помощью какой-либо интеллектуальной замены. Например, мы могли бы посмотреть на точки данных, которые имеют 67,3 для пола, и увидеть, что для всех из них правильным значением должно быть «женский». Таким образом, мы просто преобразовали бы все значения 67,3 в «женский». Приятно то, что мы эффективно вернули эти данные для обучения машинному обучению, а не просто выбросили их. Вы можете сделать такое преобразование в пандах следующим образом:

value_map = {'male': 'male', 'female': 'female', '67.3': 'female'}
pd_dataframe['gender'].map(value_map)

Неактуальные особенности

Не все функции одинаковы. Некоторые вещи могут даже не понадобиться! Например, возможно, вы просматриваете набор данных о книгах, купленных на Amazon за последний год, где одна из переменных функций называется «font-type», что указывает на тип шрифта, использованного в книге. Это не имеет отношения к прогнозированию продаж книги! Вы, вероятно, можете безопасно отказаться от этой функции все вместе вот так:

df.drop('feature_variable_name', axis=1)

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

Стандартизация

Все ваши данные в каждой переменной функции должны быть в одном стандартизированном формате. Это значительно упростит технические аспекты исследования и моделирования данных. Например, давайте снова возьмем пример переменной «пол» со значениями «мужской» или «женский». Если данные были собраны человеком, вы можете получить много разных значений, которых вы не ожидали:

  • мужчина, женщина (это хорошо)
  • МУЖСКОЙ, ЖЕНСКИЙ (вводится с заглавными буквами)
  • Мужской, Женский (некоторые используют заглавные буквы)
  • Make, Femall (опечатки!)

Если бы мы просто преобразовали функциональную переменную в категориальные числа с плавающей запятой, мы бы получили больше, чем 2 значения 0 и 1, которые нам нужны! На самом деле мы получили бы что-то вроде этого:

{
    'male': 0,
    'female': 1,
    'MALE': 2,
    'FEMALE': 3,
    'Male': 4,
    'Female': 5,
    'Make': 6,
    'Femall': 7
}

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

# Make the whole string lower case
s.lower()
# Make the first letter capitalised
s.capitalize()

Если есть опечатки, вам нужно использовать функцию сопоставления, которую мы видели раньше:

value_map = {'Make': 'male', 'Femall': 'female'}
pd_dataframe['gender'].map(value_map)

Любите учиться?

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