Очистка данных

В машинном обучении мы часто слышим поговорку: «Мусор на входе — мусор на выходе». Она наглядно иллюстрирует решающее влияние качества данных на работу модели.

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

В машинном обучениисырые данные— это наши «ингредиенты», аочистка данных— это тот самый ключевой процесс «подготовки». Она направлена на выявление, исправление или удаление ошибок, несоответствий, дубликатов и неполных фрагментов в данных, подготавливая чистые, высококачественные «ингредиенты» для последующей «готовки» модели.

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


1. Почему очистка данных так важна?

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

1.1 Повышение производительности и точности модели

«Грязные» данные (например, выбросы и ошибочные значения) могут ввести модель в заблуждение и заставить её выучить неверные закономерности. Очищенные данные позволяют модели точнее улавливать истинные закономерности в данных и тем самым делать более надёжные прогнозы.

1.2 Обеспечение надёжности результатов анализа

Будь то разведочный анализ данных или окончательные бизнес-решения, выводы, сделанные на основе ошибочных данных, опасны. Очистка данных обеспечивает прочную и надёжную основу для анализа.

1.3 Повышение стабильности алгоритма

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

1.4 Экономия вычислительных ресурсов и времени

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

Чтобы более наглядно понять место очистки данных в общем рабочем процессе машинного обучения, см. следующую блок-схему:

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


2. Распространённые проблемы данных и стратегии очистки

Очистка данных обычно решает следующие распространённые проблемы. Мы можем быстро понять их с помощью простой таблицы:

Тип проблемы Описание Возможное влияние Распространённые стратегии очистки
Пропущенные значения Некоторые поля в записи данных имеют пустые значения (NaN, NULL). Приводит к отбрасыванию выборок, потере информации и ошибкам вычислений. Удалить, заполнить (среднее/медиана/мода/предсказание).
Выбросы Экстремальные значения, которые значительно отклоняются от большей части данных. Искажают статистические результаты и влияют на производительность модели. Выявить (IQR, Z-Score), затем удалить или исправить.
Дублирующиеся значения В наборе данных существуют идентичные записи. Приводит к тому, что модель становится чрезмерно смещённой в сторону дублирующихся выборок, что влияет на способность к обобщению. Выявить и удалить дубликаты.
Несогласованности Форматы данных, единицы измерения или кодировки не согласованы (например, "male", "Male", "M"). Приводит к ошибкам группировки и анализа. Стандартизировать, нормализовать, сопоставить/преобразовать.
Ошибочные значения Значения, которые явно нелогичны (например, возраст равен -1 или 300 лет). Приводит к бессмысленным результатам анализа. Исправить на основе бизнес-логики или пометить как пропущенные.

Далее мы будем использоватьpandasиnumpyбиблиотеку Python, чтобы продемонстрировать, как решать эти проблемы с помощью конкретного кода.


3. Практическое занятие: очистка данных с помощью Python

Предположим, у нас естьcustomer_data.csvнабор данных о клиентах, содержащий некоторые типичные проблемы качества данных.

3.1 Подготовка среды и загрузка данных

Сначала убедитесь, что необходимые библиотеки установлены, затем загрузите данные.

Пример

# Импорт необходимых библиотек
import pandas as pd
import numpy as np

# Загрузка набора данных
df = pd.read_csv('customer_data.csv') # Замените на путь к вашему файлу

# Просмотр основной информации и первых нескольких строк данных
print(Форма набора данных (строки, столбцы):, df.shape)
print("\nПервые 5 строк данных:)
print(df.head())
print("\nОсновная информация о данных:)
print(df.info())
print("\nСтатистическое описание данных:)
print(df.describe())

3.2 Обработка пропущенных значений

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

Пример

# 1. Проверка пропущенных значений
print(Количество пропущенных значений в каждом столбце:)
print(df.isnull().sum())

# 2. Обработка пропущенных значений — Метод 1: Удаление
# Удалить все строки, содержащие пропущенные значения (подходит, когда пропущенных значений мало)
df_dropped = df.dropna()
print(f"\nПосле удаления пропущенных значений размер данных: {df_dropped.shape})

# 3. Обработка пропущенных значений — Метод 2: Импутация
# Более распространённый метод — заполнять пропуски на основе характеристик столбца
df_filled = df.copy()

# Для числовых столбцов (например, 'Age') заполнить медианой (более устойчива к выбросам, чем среднее)
if 'Age' in df_filled.columns:
    df_filled['Age'].fillna(df_filled['Age'].median(), inplace=True)

# Для категориальных столбцов (например, 'City') заполните модой (наиболее часто встречающимся значением)
if 'City' in df_filled.columns:
    df_filled['City'].fillna(df_filled['City'].mode()[0], inplace=True)

# Для столбцов, которые могут меняться со временем (например, 'Last Purchase Amount'), иногда заполнение 0 имеет больше смысла с точки зрения бизнеса
if 'Last Purchase Amount' in df_filled.columns:
    df_filled['Last Purchase Amount'].fillna(0, inplace=True)

print("\nПосле заполнения пропущенных значений количество пропущенных значений в каждом столбце:)
print(df_filled.isnull().sum())

3.3 Выявление и обработка выбросов

Обработка выбросов требует осторожности, так как иногда они представляют важные особые события.

Пример

# Возьмём 'Annual Income' в качестве примера, предполагая, что это должно быть разумное положительное значение
if 'Annual Income' in df_filled.columns:
    # Метод 1: Использовать метод межквартильного размаха (IQR) для выявления
    Q1 = df_filled['Annual Income'].quantile(0.25)
    Q3 = df_filled['Annual Income'].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR

    # Найти выбросы
    outliers = df_filled[(df_filled['Annual Income'] < lower_bound) | (df_filled['Annual'] > upper_bound)]
    print(f"\nКоличество выбросов 'Annual Income', найденных с помощью метода IQR: {len(outliers)})

    # Обработка выбросов: здесь мы выбираем ограничить их с помощью нижней и верхней границ (винзоризация)
    df_filled['Annual Income'] = np.where(df_filled['Annual Income'] > upper_bound, upper_bound,
                                   np.where(df_filled['Annual Income'] < lower_bound, lower_bound, df_filled['Annual Income']))

    print(Выбросы в 'Annual Income' были ограничены.)

3.4 Обработка дублирующихся значений

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

Пример

# Проверка и удаление полностью дублирующихся строк
duplicate_rows = df_filled.duplicated()
print(f"\nКоличество найденных полностью дублирующихся строк: {duplicate_rows.sum()})

# Удалить эти дублирующиеся строки, сохранив только первое вхождение
df_cleaned = df_filled.drop_duplicates()
print(fПосле удаления дубликатов, размер данных: {df_cleaned.shape})

3.5 Обработка несоответствий

Обеспечьте согласованность форматов данных и значений.

Пример

# 1. Стандартизируйте текстовый формат: например, унифицируйте столбец 'City', чтобы первая буква была заглавной
if 'City' in df_cleaned.columns:
    df_cleaned['City'] = df_cleaned['City'].str.title()

# 2. Сопоставьте унифицированные значения: например, приведите информацию о поле к 'Male' и 'Female'
if 'Gender' in df_cleaned.columns:
    gender_mapping = {'male': 'Male', 'female': 'Female', 'M': 'Male', 'F': 'Female'}
    df_cleaned['Gender'] = df_cleaned['Gender'].replace(gender_mapping)
    # Вы также можете использовать функцию .map(), но .replace() более гибкий, так как неуказанные значения остаются без изменений

# 3. Преобразуйте типы данных: убедитесь, что числовые столбцы имеют числовой тип
if 'Age' in df_cleaned.columns:
    df_cleaned['Age'] = pd.to_numeric(df_cleaned['Age'], errors='coerce') # errors='coerce' преобразует ошибки в NaN
    # После преобразования вы снова можете использовать медиану, чтобы заполнить новые NaN, появившиеся в результате преобразования
    df_cleaned['Age'].fillna(df_cleaned['Age'].median(), inplace=True)

print("\nОчистка данных завершена! Просмотрите первые 5 строк очищенных данных: ")
print(df_cleaned.head())

4. Итоги и лучшие практики

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

  1. Сначала исследуйте, затем очищайте: Прежде чем приступать к очистке, обязательно используйтеdf.describe()、df.info(), визуализация (например, гистограммы, ящичные диаграммы) и другие методы, чтобы полностью понять ваши данные.
  2. Создайте резервную копию исходных данных: Всегда храните копию исходных, неизменённых данных. Все операции очистки следует выполнять на копии.
  3. Записывайте шаги очистки: Документируйте логику очистки (например, почему используется импутация медианой, как определять границы выбросов). Это критически важно для воспроизводимости проекта и командной работы.
  4. Сочетайте с бизнес-логикой: Очистка данных — не чисто математическая операция. Например, «age=0» — ошибка в демографических данных, но может быть разумным в данных о товарах для младенцев. Всегда поддерживайте связь с экспертами в предметной области.
  5. Действуйте итеративно: После очистки переходите к этапу моделирования. Если модель работает плохо, вернитесь и проверьте качество данных; возможно, потребуется скорректировать стратегию очистки.

Очистка данных может отнимать у проекта по data science60%-80%время. Хотя это утомительно, это краеугольный камень создания мощных, надёжных моделей машинного обучения.

Другие расширения