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.aiLAMA и 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 BeautifulSoup
import requests
 url = 'https://example.com/data'
 response = requests.get(url)
 
soup = BeautifulSoup(response.text, 'html.parser')
 # Пример извлечения данных и создания DataFrame
 table_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.

 

Последнее изменение: Thursday, 2 October 2025, 17:43