Подготовка данных¶
Подготовка данных — критически важный этап в машинном обучении, который часто занимает до 80% времени проекта.
1. Сбор данных¶
Источники данных¶
- Базы данных: SQL, NoSQL хранилища
- Файлы: CSV, JSON, XML, Excel
- API: REST, GraphQL endpoints
- Веб-скрапинг: парсинг веб-страниц
- Стриминг: Kafka, RabbitMQ
Пример загрузки данных¶
import pandas as pd
# Из CSV
df = pd.read_csv('data.csv')
# Из Excel
df = pd.read_excel('data.xlsx')
# Из JSON
df = pd.read_json('data.json')
# Из SQL
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql_query('SELECT * FROM table', conn)
2. Очистка данных¶
Обработка пропусков¶
# Проверка пропусков
df.isnull().sum()
# Удаление строк с пропусками
df.dropna()
# Заполнение средним/медианой
df['column'].fillna(df['column'].mean(), inplace=True)
df['column'].fillna(df['column'].median(), inplace=True)
# Заполнение модой (для категориальных)
df['column'].fillna(df['column'].mode()[0], inplace=True)
# Интерполяция
df.interpolate(method='linear', inplace=True)
Обработка дубликатов¶
# Поиск дубликатов
df.duplicated().sum()
# Удаление дубликатов
df.drop_duplicates(inplace=True)
Обработка выбросов¶
from scipy import stats
import numpy as np
# Метод Z-score
z_scores = np.abs(stats.zscore(df['column']))
outliers = df[z_scores > 3]
# Метод IQR
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['column'] < Q1 - 1.5*IQR) | (df['column'] > Q3 + 1.5*IQR)]
# Winsorization (ограничение выбросов)
from scipy.stats.mstats import winsorize
df['column'] = winsorize(df['column'], limits=[0.05, 0.05])
3. Преобразование данных¶
Нормализация и стандартизация¶
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# Мин-макс нормализация [0, 1]
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df[['column']])
# Стандартизация (Z-score normalization)
scaler = StandardScaler()
df_standardized = scaler.fit_transform(df[['column']])
Кодирование категориальных признаков¶
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label Encoding (для порядковых)
le = LabelEncoder()
df['category_encoded'] = le.fit_transform(df['category'])
# One-Hot Encoding (для номинальных)
df_encoded = pd.get_dummies(df, columns=['category'])
# Target Encoding
def target_encode(df, column, target):
mean_target = df.groupby(column)[target].mean()
return df[column].map(mean_target)
Преобразование признаков¶
# Логарифмическое преобразование
df['log_column'] = np.log1p(df['column'])
# Квадратный корень
df['sqrt_column'] = np.sqrt(df['column'])
# Полиномиальные признаки
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
4. Разделение данных¶
from sklearn.model_selection import train_test_split
# Базовое разделение
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42,
stratify=y # Для сохранения распределения классов
)
# Разделение на train/validation/test
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.25, random_state=42)
5. Балансировка классов¶
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
# SMOTE (Synthetic Minority Over-sampling)
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# Random Undersampling
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
# Комбинированный подход
from imblearn.combine import SMOTETomek
smote_tomek = SMOTETomek(random_state=42)
X_resampled, y_resampled = smote_tomek.fit_resample(X, y)
Чек-лист подготовки данных¶
- Проверить типы данных
- Обработать пропуски
- Удалить дубликаты
- Обработать выбросы
- Закодировать категориальные признаки
- Нормализовать/стандартизировать числовые признаки
- Сбалансировать классы (если нужно)
- Разделить на train/validation/test
Рекомендации¶
- Всегда сохраняйте исходные данные — работайте с копиями
- Документируйте все преобразования — для воспроизводимости
- Проверяйте распределения — до и после преобразований
- Избегайте data leakage — fit на train, transform на test
- Автоматизируйте пайплайн — используйте sklearn Pipeline