Предобработка данных
Коротко
Definition
Предобработка данных — это этап ML pipeline, на котором данные очищают, проверяют, преобразуют и кодируют так, чтобы модель могла корректно и устойчиво на них обучаться.
Предобработка нужна не для «косметики», а для качества модели.
Она помогает:
- убрать технические ошибки;
- обработать пропуски;
- привести признаки к нужному формату;
- избежать утечек данных;
- сделать признаки пригодными для конкретного алгоритма;
- улучшить устойчивость и интерпретируемость модели.
Предобработка особенно важна для табличных данных, где признаки часто имеют разные типы, масштабы, пропуски, выбросы и категориальные значения.
Интуиция
Модель учится не на «реальном мире», а на том представлении данных, которое мы ей дали.
Если в данных есть:
- пропуски;
- дубликаты;
- разные масштабы признаков;
- неверные типы данных;
- редкие категории;
- выбросы;
- утечки из будущего;
- признаки, недоступные на инференсе;
то модель может обучиться неправильно, даже если алгоритм выбран хорошо.
Предобработка — это способ сделать данные честными, понятными и пригодными для обучения.
Главная идея:
Сначала нужно построить корректное представление данных, и только потом оценивать качество модели.
Основные идеи
Главный риск: data leakage
Important
Все трансформации, которые используют статистики данных, должны обучаться только на train-части. Нельзя считать среднее, медиану, стандартное отклонение, категории, target encoding или отбор признаков на всём датасете до разбиения на train/validation/test.
Правильный порядок:
- Разделить данные на train/validation/test.
- Обучить preprocessing-трансформеры только на train.
- Применить обученные трансформеры к validation/test.
- Сохранить эти же трансформеры для инференса.
Неправильный порядок:
- Заполнить пропуски по всему датасету.
- Отмасштабировать признаки по всему датасету.
- Отобрать признаки по всему датасету.
- Потом разделить на train/test.
Так возникает утечка информации из validation/test в train. Модель получает слишком оптимистичную оценку качества и может провалиться на новых данных.
Типовой порядок предобработки
Примерный порядок:
- Проверить схему данных.
- Проверить типы столбцов.
- Удалить явные дубликаты и технические ошибки.
- Разделить данные на train/validation/test.
- Обработать пропуски.
- Обработать семантические ошибки.
- Обработать выбросы.
- Создать доменные признаки.
- Кодировать категориальные признаки.
- Трансформировать распределения при необходимости.
- Масштабировать численные признаки.
- Отобрать признаки.
- Собрать всё в воспроизводимый pipeline.
Этот порядок не абсолютный. Он зависит от задачи, модели и природы данных. Но принцип остаётся: всё, что «учится» по данным, должно fit-иться только на train.
Что анализировать в данных
| Аспект | Что проверять | Риск без проверки |
|---|---|---|
| Схема | Ожидаемые столбцы, типы, названия | Код ломается или признаки интерпретируются неверно |
| Полнота | Пропуски, пустые строки, дубликаты | Смещение модели, потеря информации |
| Семантика | Допустимые диапазоны, логическая согласованность | Модель учится на невозможных значениях |
| Выбросы | Экстремальные значения, ошибки измерения | Нестабильность неробастных моделей |
| Распределения | Skewness, хвосты, дисбаланс классов | Плохая сходимость, неверный выбор метрик |
| Масштабы | Разные порядки величин | Доминирование одних признаков над другими |
| Категории | Редкие категории, новые категории, порядок | Ошибки кодирования и переобучение |
| Мультиколлинеарность | Корреляции, VIF | Нестабильные коэффициенты и интерпретация |
| Связь с target | Корреляция, mutual information, доменная логика | Шумовые или бесполезные признаки |
Пропуски
Цель обработки пропусков — сохранить полезную информацию и сделать данные пригодными для алгоритмов, которые не умеют работать с missing values.
Типы пропусков:
| Тип | Расшифровка | Что означает |
|---|---|---|
| MCAR | Missing Completely At Random | Пропуски не зависят от данных |
| MAR | Missing At Random | Пропуск зависит от других признаков |
| MNAR | Missing Not At Random | Пропуск зависит от самого скрытого значения |
Примеры обработки:
| Ситуация | Возможное решение |
|---|---|
| Очень мало случайных пропусков | Удалить строки |
| Числовой признак без сильного skew | Заполнить средним |
| Числовой признак со skew или выбросами | Заполнить медианой |
| Категориальный признак | Заполнить модой или отдельной категорией |
| Пропуск сам информативен | Добавить флаг is_missing |
| Много пропусков в неважном признаке | Удалить признак |
| Сложная структура пропусков | KNN/MICE/модельная импутация |
Важно: импьютер обучается только на train, а затем применяется к validation/test.
Выбросы
Выброс — это значение, которое сильно отличается от основной массы данных.
Но не каждый выброс нужно удалять.
Сначала нужно понять тип выброса:
| Тип | Пример | Что делать |
|---|---|---|
| Техническая ошибка | Возраст = 999 | Исправить или удалить |
| Семантически невозможное значение | Отрицательная масса | Исправить или удалить |
| Редкое, но реальное значение | Очень дорогая квартира | Часто оставить |
| Шум измерения | Ошибка сенсора | Обработать |
| Важный экстремальный случай | Аномалия, fraud, дефект | Не удалять без анализа |
Способы обработки:
- удалить некорректные строки;
- winsorization;
- clipping;
- log-transform;
- robust scaling;
- использовать робастную модель;
- оставить как есть, если выбросы важны для задачи.
Деревья решений, случайный лес и градиентный бустинг обычно менее чувствительны к масштабу и умеренным выбросам, чем линейные модели, SVM, k-means и нейросети.
Трансформация распределений
Некоторые признаки имеют сильный skew или тяжёлые хвосты. Это может мешать линейным моделям, градиентной оптимизации и расстояниевым методам.
Примеры трансформаций:
| Условие | Метод | Идея |
|---|---|---|
log1p(x) | Сжать правый хвост | |
| Box-Cox | Подобрать степенную трансформацию | |
| Любые значения | Yeo-Johnson | Универсальная степенная трансформация |
| Сильные выбросы | Quantile transform | Привести к заданному распределению |
Ориентиры по skewness:
- — трансформация обычно не нужна;
- — можно рассмотреть;
- — трансформация часто полезна.
Но трансформация должна быть осмысленной. Нельзя автоматически логарифмировать всё подряд без проверки доменного смысла.
Масштабирование


Масштабирование приводит численные признаки к сопоставимому масштабу.
Оно особенно важно для моделей, которые зависят от расстояний или градиентов:
Деревья решений, случайный лес и градиентный бустинг обычно не требуют масштабирования.
Основные scaler-ы:
| Метод | Формула / идея | Когда использовать |
|---|---|---|
| StandardScaler | Без сильных выбросов, линейные модели, SVM, нейросети | |
| MinMaxScaler | Приведение к | Ограниченный диапазон, некоторые neural network pipeline |
| RobustScaler | Есть выбросы или тяжёлые хвосты | |
| Normalizer | Нормирует объект как вектор | Текстовые/векторные признаки, cosine similarity |
Важно: scaler fit-ится только на train.
Кодирование категориальных признаков
Модели обычно требуют численные признаки, поэтому категории нужно кодировать.
Перед кодированием полезно проверить:
- редкие категории;
- опечатки;
- разные варианты одной категории;
- новые категории, которые могут появиться на инференсе;
- есть ли естественный порядок.
Основные методы:
| Метод | Когда использовать | Риск |
|---|---|---|
| One-hot encoding | Небольшое число категорий без порядка | Рост размерности |
| Ordinal encoding | Есть естественный порядок | Ложный порядок, если порядка нет |
| Frequency encoding | Много категорий, важна частотность | Может потерять смысл категории |
| Target encoding | Много категорий, сильная связь с target | Высокий риск leakage |
| Embeddings | Нейросети, много категорий | Нужно больше данных |
Important
Target encoding нельзя считать по всему датасету. Его нужно делать через K-Fold/OOF-схему, smoothing и только внутри train, иначе модель напрямую получает информацию о target.
Редкие категории часто объединяют в Other, особенно если их слишком мало для устойчивого обучения.
Конструирование признаков
Конструирование признаков — создание новых признаков на основе исходных данных и предметной логики.
Примеры:
| Тип | Пример |
|---|---|
| Даты | год, месяц, день недели, час |
| Отношения | цена за квадратный метр, плотность, отношение масс |
| Разности | разница температур, изменение во времени |
| Агрегации | среднее значение по группе, количество событий |
| Полиномы | , |
| Циклические признаки | sin(hour), cos(hour) |
| Доменная физика | формулы, размерности, нормировки |
Feature engineering особенно важен для табличных данных. Часто хороший доменный признак даёт больше пользы, чем более сложный алгоритм.
Дисбаланс классов
В классификации нужно проверять распределение классов.
Если positive-класс редкий, accuracy может быть бесполезной. Модель может почти всегда предсказывать majority class и выглядеть хорошо по accuracy.
Способы работы:
- class weights;
- oversampling;
- undersampling;
- SMOTE;
- threshold tuning;
- stratified split;
- правильные метрики: precision, recall, F1, PR-AUC.
Подробнее: Метрики качества классификаторов.
Отбор признаков
Отбор признаков удаляет избыточные, шумовые или неинформативные признаки.
Методы:
| Тип | Примеры |
|---|---|
| Filter methods | корреляция, mutual information, chi-square, ANOVA |
| Wrapper methods | forward selection, backward selection, recursive feature elimination |
| Embedded methods | L1-регуляризация, feature importance в деревьях |
| Доменный отбор | удаление признаков, невозможных на инференсе |
Что проверять:
- константные признаки;
- почти константные признаки;
- сильную корреляцию между признаками;
- признаки с утечкой target;
- признаки, недоступные в момент предсказания;
- признаки, которые слишком дороги или нестабильны.
Ориентиры:
- корреляция — признаки почти дублируют друг друга;
- VIF или — возможная мультиколлинеарность;
- доля одного значения — почти константный признак.
Когда использовать
Предобработка нужна почти всегда, когда данные идут в ML-модель.
Особенно важна, если:
- данные табличные;
- есть пропуски;
- есть категориальные признаки;
- признаки имеют разные масштабы;
- используется SVM, k-means, KNN или нейросеть;
- есть риск data leakage;
- данные собираются из разных источников;
- модель будет использоваться на новых данных;
- нужно воспроизводимое обучение и инференс.
Для production-подхода preprocessing должен быть частью pipeline, а не набором разрозненных ручных действий.
Когда не использовать
Предобработку нельзя делать механически.
Не стоит:
- удалять все выбросы без доменного анализа;
- масштабировать признаки для деревьев просто «по привычке»;
- делать target encoding без защиты от leakage;
- считать статистики на всём датасете до split;
- трансформировать признаки так, что они теряют предметный смысл;
- применять train-only признаки, которых не будет на инференсе.
Плохая предобработка может навредить сильнее, чем её отсутствие.
Минимальный пример
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
df = pd.DataFrame({
"age": [20, 35, None, 50],
"city": ["A", "B", "A", None],
"target": [0, 1, 0, 1],
})
X = df.drop(columns=["target"])
y = df["target"]
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.25,
random_state=42,
)
numeric_features = ["age"]
categorical_features = ["city"]
numeric_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
])
categorical_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("encoder", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer([
("num", numeric_pipeline, numeric_features),
("cat", categorical_pipeline, categorical_features),
])
model = Pipeline([
("preprocess", preprocess),
("classifier", LogisticRegression()),
])
model.fit(X_train, y_train)
print(model.predict(X_test))В этом примере preprocessing входит внутрь Pipeline, поэтому импьютеры, scaler и encoder обучаются только на train-части.