2.4 Предварительная обработка данных
Предобработка — это подготовка набора данных перед загрузкой в модель. Данные в исходном виде часто содержат артефакты, такие как шум, пропуски или дубликаты, которые усложняют их анализ и снижают качество работы алгоритмов.
Артефакты могут появляться по разным причинам:
· Человеческий фактор: ошибки при ручном вводе — опечатки, пропуски или неправильные значения.
· Неполные данные: информация может быть недоступна, например, сотрудник не указал свое место проживания.
· Ошибки при сборе: сбои в автоматических системах, например временные проблемы с сетью, из-за чего часть данных теряется.
· Объединение данных из разных источников: разные форматы или отсутствие значений при объединении нескольких баз.
· Технические ограничения: например, система принимает только положительные числа, а передали отрицательное значение.
· Устаревшая информация: данные не обновляются вовремя, из-за чего информация устаревает.
· Ошибки при миграции: повреждение или потеря данных при переносе из одной системы в другую.
Пример датасета с артефактами:
|
ID |
Имя |
Возраст |
Зарплата |
Город |
Дата приема |
Отдел |
|
1 |
Иванов Иван |
28 |
100000 |
Москва |
2024-05-20 |
Продажи |
|
2 |
NaN |
NaN |
60000 |
Санкт-Петербург |
2023-03-15 |
Маркетинг |
|
3 |
Ольга Петрова |
35 |
-1500 |
Новосибирск |
NaN |
Разработка |
|
4 |
Андрей Сидоров |
NaN |
70000 |
Неизвестно |
2025-11-10 |
NaN |
|
5 |
NaN |
45 |
80000 |
Казань |
2020-08-01 |
HR |
|
6 |
Елена Белова |
29 |
NaN |
NaN |
2022-09-23 |
Продажи |
Пропуски: пропущенные значения в столбцах: Имя, Возраст, Зарплата, Город, Дата приема на работу, Отдел (NaN).
Ошибки в данных: отрицательное значение в столбце Зарплата (значение -1500).
Неоднородные данные:
1. В столбце Город указан заполнитель «Неизвестно» вместо названия города.
2. Разное представление пропущенных или неизвестных значений:
· NaN (Not a Number) автоматически используется в некоторых системах, например при выгрузке данных из баз или при считывании в библиотеке для анализа данных (такой как pandas);
· «Неизвестно» — это пример текстового заполнителя, который вводят вручную, когда нет информации, — его также нужно обрабатывать как пропуск.
Предобработка помогает устранить все эти проблемы, а в результате — улучшить качество данных и повысить точность модели.
Автоматизация предобработки сокращает время на рутинные задачи и снижает риск ошибок.
Для этого можно использовать различные инструменты и подходы:
1.
Использование библиотек для
предобработки: библиотеки, такие как Scikit-Learn, предоставляют
множество готовых инструментов: например, SimpleImputer для
заполнения пропусков, StandardScaler для
масштабирования, LabelEncoder для
кодирования категориальных данных.
Эти инструменты можно объединить в Pipeline — последовательность
шагов для автоматической обработки данных.
2.
Pipeline из Scikit-Learn: объединяет
несколько этапов предобработки в один процесс, облегчая повторное применение
тех же шагов к разным наборам данных и делая код более структурированным и
понятным.
Пример: создание Pipeline для автоматического
выполнения всех необходимых шагов предобработки, таких как заполнение
пропусков, масштабирование и кодирование признаков.
3. Автоматизация с помощью библиотек для подготовки данных:
· Pandas: часто используют для ручной предобработки, но можно создать функции, которые автоматически заполняют пропуски, масштабируют данные и кодируют признаки.
· Feature-engine: библиотека с удобными функциями для автоматизации задач: создание новых признаков, кодирование категорий и работа с выбросами.
· Polars: новая библиотека для высокоэффективной работы с данными и их анализа на Python, альтернатива Pandas для работы с очень большими объемами данных.
4. Другие подходы:
· Платформы для машинного обучения: инструменты AutoML, такие как H2O.ai, LAMA и TPOT, автоматически подбирают модели и выполняют предобработку данных, что упрощает процесс для пользователя.
· Написание собственных функций: можно написать функции для типовых задач, например заполнения пропусков медианой или удаления выбросов, и использовать их каждый раз для обработки данных. Это экономит время и обеспечивает единообразие.
Как проводится предобработка данных — на примере
Предобработка данных — это главный этап подготовки набора данных перед загрузкой в модель машинного обучения.
На каждом этапе можно выполнить ручную обработку, использовать автоматические инструменты для упрощения задачи или комбинировать оба способа.
Представим, что у нас есть набор данных о квартирах:
|
ID |
Площадь (кв. м) |
Число комнат |
Возраст дома (лет) |
Стоимость (млн тен.) |
Тип недвижимости |
Район |
|
1 |
80 |
3 |
20 |
8 |
квартира |
А |
|
2 |
100 |
NaN |
150 |
10 |
дом |
Б |
|
3 |
2000 |
2 |
NaN |
50 |
квартира |
А |
|
4 |
100 |
4 |
30 |
6 |
апартаменты |
В |
|
5 |
150 |
3 |
5 |
NaN |
дом |
Б |
|
6 |
500 |
5 |
300 |
70 |
квартира |
А |
|
7 |
100 |
3 |
25 |
14 |
дом |
Б |
|
8 |
80 |
3 |
-5 |
8 |
апартаменты |
В |
|
9 |
-150 |
3 |
15 |
12 |
дом |
Б |
|
10 |
100 |
3 |
25 |
14 |
квартира |
А |
Разберем поэтапно обработку данных с использованием информации выше.
Используем следующие инструменты:
· Pandas: библиотека для работы с таблицами данных (DataFrame), очистки данных, заполнения пропусков, удаления дубликатов и фильтрации данных.
· Scikit-Learn: библиотека для машинного обучения. Включает инструменты для предобработки данных, которые используются для заполнения пропусков, масштабирования признаков и работы с выбросами.
· Matplotlib и Seaborn: библиотеки для визуализации данных, используемые для анализа, в том числе обнаружения выбросов и шумов.
· Numpy: библиотека для быстрой и эффективной работы с числовыми массивами, включая сложные математические преобразования.
Читайте также10 библиотек Python для машинного обучения
Этап 1 — сбор и анализ данных
На первом этапе важно собрать данные и проанализировать их качество, так как это напрямую влияет на качество модели. На этом этапе можно понять структуру данных, выявить проблемы (пропуски, дубликаты, выбросы) и спланировать методы их устранения.
Сбор данных вручную. Данные можно получить из различных источников: баз данных, веб-скрейпинга, API, CSV-файлов и др. Например, вы можете загрузить данные с использованием Pandas.
Пример кода для загрузки данных:
import pandas as pd # Создание DataFrame с данными о недвижимости data = { 'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'Площадь (кв. м)': [80, 100, 2000, None, 150, 500, 120, 80, -150, 100], 'Число комнат': [3, None, 2, 4, 3, 5, 3, 3, 3, 3], 'Возраст дома (лет)': [20, 150, None, 30, 5, 300, 25, -5, 15, 25], 'Цена (млн тен.)': [8, 10, 50, 6, None, 70, 14, 8, 12, 14], 'Тип недвижимости': ['квартира', 'дом', 'квартира', 'апартаменты', 'дом', 'квартира', 'дом', 'апартаменты', 'дом', 'квартира'], 'Район': ['А', 'Б', 'А', 'В', 'Б', 'А', 'Б', 'В', 'Б', 'А'] } df = pd.DataFrame(data)
Автоматизированный сбор данных. Сбор данных можно автоматизировать, чтобы уменьшить время и трудозатраты на их подготовку. Примеры автоматизации включают:
· API-запросы: использование библиотек, таких как requests, для получения данных по API.
import requests import pandas as pd response = requests.get('https://api.example.com/data') data = response.json() df = pd.DataFrame(data)
· Веб-скраппинг: использование библиотек, таких как BeautifulSoup и Selenium, для сбора данных с веб-сайтов.
from bs4 import BeautifulSoupimport requests url = 'https://example.com/data' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # Пример извлечения данных и создания DataFrametable_data = soup.find_all('table')[0] #Найтитаблицу
df = pd.read_html(str(table_data))[0]
· Интеграцию с базами данных: использование библиотек, таких как SQLAlchemy или pyodbc, для подключения и извлечения данных из баз.
from sqlalchemy import create_engine import pandas as pd engine = create_engine('sqlite:///example.db') df = pd.read_sql('SELECT * FROM data_table', con=engine)
Анализ данных
После сбора нужно провести анализ для понимания структуры данных и выявления проблем, которые требуют предобработки.
Можно использовать готовые функции из Pandas для того, чтобы выявить проблемы, такие как пропуски или выбросы:
· head() выводит первые несколько строк таблицы, чтобы вы могли примерно ознакомиться с содержимым данных.
· info() показывает количество непустых значений в каждом столбце и тип данных в них (целые числа, вещественные числа и т. д.).
· describe() предоставляет сводную статистику. Для числовых признаков — среднее, стандартное отклонение, минимальное и максимальное значения; для категориальных — количество уникальных категорий и частота самой топовой.
Пример кода для анализа данных:
# Просмотр первых строк таблицы display(df.head()) # Получение информации о типах данных и наличии пропусков display(df.info()) # Статистическое описание числовых признаков display(df.describe()) # Проверка на наличие дубликатов duplicates_count = df.duplicated().sum()print(f"\nКоличестводубликатов: {duplicates_count}")
Важно: display можно заменить на print, если вы работаете не в Jupyter-notebook, но тогда вывод на экран будет не таким наглядным.
На этом этапе можно найти следующие проблемы, которые потребуют дальнейшей предобработки:
1. Пропуски. В столбцах «Площадь (кв. м)», «Число комнат», «Возраст дома (лет)» и «Цена (млн тен.)» — пропуски, которые нужно заполнить или обработать.
2. Некорректные значения:
o В столбце «Возраст дома (лет)» присутствует значение -5.
o В столбце «Площадь (кв. м)» указано ошибочное отрицательное значение -150.
o Выбросы:
Значения, такие как площадь 2000 кв.
м и 500 кв. м, подозрительно высокие для
квартир и могут считаться выбросами.
o Цена 70 млн тен. также выделяется среди остальных значений, что может указывать на выброс.
Этап 2 — очистка данных
После анализа данных можно приступать к очистке. Цель этапа — устранить проблемы, такие как пропуски, ошибки и выбросы, чтобы повысить качество датасета и, как следствие, предсказания модели.
Ручная очистка данных. Для удаления дубликатов или строк с ошибками можно использовать методы Pandas, для работы с NaN-значениями пригодится Numpy.