← Маршрут ML-инженерии

Урок · 2 мин чтения · упражнения и самопроверка

Подготовка признаков и Pipeline

После урока: объяснить масштабирование и выполнить упражнение «Сохранить обработку и классификатор одним конвейером», обосновав выбранный подход..

Перед началом

Примеры выполняются локально: скачайте лабораторию и установите зависимости по README. Онлайн-редактор алгоритмических задач не содержит ML-библиотеки.

Одна обработка при обучении и предсказании

Если обучить модель на масштабированных данных, а в сервис передать исходные, математически корректный запрос даст неправильный результат. Преобразования являются частью модели. Pipeline связывает их в один объект: fit обучает шаги по train, predict повторяет нужные преобразования без переобучения.

В лаборатории первый шаг — StandardScaler, второй — LogisticRegression. fit вычисляет средние и масштабы train, преобразует train и обучает классификатор. На test вызывается только predict: он использует уже найденные параметры. Никогда не вызывайте fit_transform отдельно на test: это создаст другое пространство признаков.

Пропуски и категории

Для таблицы с разными типами полезен ColumnTransformer. Числа можно заполнять медианой train и масштабировать; категории — заполнять и кодировать OneHotEncoder. Заранее определите поведение на новой категории. Опция handle_unknown="ignore" позволяет обработать её без ошибки, но выбранное представление нужно учитывать при интерпретации. Отсутствующие обязательные колонки должны давать понятную ошибку.

В Wine признаки числовые и без пропусков, поэтому дополнительные преобразования не нужны. Не добавляйте сложность только ради длинного списка инструментов. Сначала зафиксируйте контракт на имена, порядок, конечность и тип значений.

Pipeline и cross-validation

Передавайте весь Pipeline в CV. Тогда каждый fold обучит масштабирование только на своей обучающей части. Если заранее масштабировать весь train, а потом делить на folds, validation-части уже повлияют на средние — утечка будет и внутри CV.

Проверяйте это численно: scaler.mean_ после финального fit должен совпасть со средними train, а не всей таблицы. Такая проверка содержательнее, чем проверка наличия слова Pipeline в исходнике. В сохранённый артефакт включайте весь конвейер, а не только коэффициенты классификатора.

Пошаговый пример

python
import numpy as np
from sklearn.preprocessing import StandardScaler
train = np.array([[1.], [3.]])
test = np.array([[100.]])
scaler = StandardScaler().fit(train)
print(scaler.mean_.tolist())
print(scaler.transform(test).tolist())

Ожидаемый вывод

text
[2.0]
[[98.0]]

Среднее равно 2 и scale равно 1. Значение test не меняет параметры; оно только преобразуется.

Сделайте самостоятельно

На входе train=[1,3], test=[100]. Как изменилось бы среднее, если ошибочно обучить scaler на всех трёх значениях?

Ответ и критерии проверки

Среднее стало бы 104/3, примерно 34.67, и включило информацию test. В правильной процедуре среднее остаётся 2. Сохранённый Pipeline повторяет именно эту обработку на inference.

Проверьте понимание

1. Что передавать в GridSearchCV?
2. Как обрабатывать test после fit на train?