Очистка данных
В машинном обучении мы часто слышим поговорку: «Мусор на входе — мусор на выходе». Она наглядно иллюстрирует решающее влияние качества данных на работу модели.
Представьте, что вы шеф-повар, готовящий изысканное блюдо. Даже если ваше кулинарное мастерство исключительно, но ингредиенты несвежие, содержат грязь или их не хватает, итоговое блюдо неизбежно сильно пострадает.
В машинном обучениисырые данные— это наши «ингредиенты», аочистка данных— это тот самый ключевой процесс «подготовки». Она направлена на выявление, исправление или удаление ошибок, несоответствий, дубликатов и неполных фрагментов в данных, подготавливая чистые, высококачественные «ингредиенты» для последующей «готовки» модели.
В этой статье мы систематически познакомим вас с основными концепциями и распространёнными методами очистки данных, а с помощью наглядных примеров кода поможем вам освоить этот необходимый навык для специалистов по данным.
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предоставляет удобные методы.
Пример
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 Выявление и обработка выбросов
Обработка выбросов требует осторожности, так как иногда они представляют важные особые события.
Пример
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 Обработка несоответствий
Обеспечьте согласованность форматов данных и значений.
Пример
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. Итоги и лучшие практики
С помощью описанных выше шагов мы завершили один цикл базовой очистки данных. Помните, что очистка данных — это не одноразовый шаг, а итеративный процесс. Вот несколько лучших практик:
- Сначала исследуйте, затем очищайте: Прежде чем приступать к очистке, обязательно используйте
df.describe()、df.info(), визуализация (например, гистограммы, ящичные диаграммы) и другие методы, чтобы полностью понять ваши данные. - Создайте резервную копию исходных данных: Всегда храните копию исходных, неизменённых данных. Все операции очистки следует выполнять на копии.
- Записывайте шаги очистки: Документируйте логику очистки (например, почему используется импутация медианой, как определять границы выбросов). Это критически важно для воспроизводимости проекта и командной работы.
- Сочетайте с бизнес-логикой: Очистка данных — не чисто математическая операция. Например, «age=0» — ошибка в демографических данных, но может быть разумным в данных о товарах для младенцев. Всегда поддерживайте связь с экспертами в предметной области.
- Действуйте итеративно: После очистки переходите к этапу моделирования. Если модель работает плохо, вернитесь и проверьте качество данных; возможно, потребуется скорректировать стратегию очистки.
Очистка данных может отнимать у проекта по data science60%-80%время. Хотя это утомительно, это краеугольный камень создания мощных, надёжных моделей машинного обучения.
Другие расширения