Ваш первый конвейер: масштабирование и классификатор
Вы объедините StandardScaler и LogisticRegression в Pipeline, вызовете fit и predict и убедитесь, что масштабатор обучается только на обучающих данных.
«Ваш первый конвейер: масштабирование и классификатор» — бесплатный урок Machine Learning Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Machine Learning Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Machine Learning Academy содержит 4 уроков всего.
Что такое конвейер scikit-learn
Pipeline объединяет несколько этапов обработки в один объект оценщика. Каждый этап, кроме последнего, должен реализовывать fit и transform; последнему этапу нужны только fit и predict. Вызов pipeline.fit(X, y) последовательно запускает все этапы, а pipeline.predict(X) пропускает данные через все преобразования перед классификацией. Это устраняет ошибки при ручном управлении этапами и предотвращает утечку данных.
Почему конвейеры предотвращают утечку данных
Если обучить StandardScaler на полном наборе данных, а затем разделить его на обучающую и тестовую части, масштабировщик уже увидит статистики тестовой выборки — это утечка данных. Конвейер решает проблему автоматически: если передать Pipeline в cross_val_score или GridSearchCV, весь конвейер, включая масштабировщик, заново обучается с нуля на каждой обучающей части, поэтому тестовая часть никогда не влияет на параметры масштабировщика.
Создание первого конвейера
Создайте Pipeline, передав список кортежей (name, estimator). Имена — это произвольные строки, которые Вы выбираете сами; позднее они используются для обращения к этапам, например при задании гиперпараметров для поиска по сетке. Наиболее распространённый первый конвейер состоит из масштабировщика, за которым следует классификатор.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(C=1.0, max_iter=200))
])
print('Steps:', [name for name, _ in pipe.steps])
print('Named steps:', list(pipe.named_steps.keys()))Обучение и прогнозирование
После создания используйте Pipeline так же, как любой оценщик sklearn: вызовите fit на обучающих данных, predict на тестовых данных и score для вычисления точности. Внутри fit вызывает fit_transform для всех промежуточных этапов и fit для последнего оценщика.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=300))
])
pipe.fit(X_train, y_train)
print('Test accuracy:', pipe.score(X_test, y_test).round(4))
y_pred = pipe.predict(X_test)
print('Predictions[:5]:', y_pred[:5])Проверка обучения масштабировщика только на обучающих данных
После обучения Pipeline на обучающих данных Вы можете проверить параметры, полученные каждым этапом. Масштабировщик внутри конвейера будет иметь атрибуты mean_ и scale_, вычисленные только по обучающей выборке, а не по всему набору данных. Это подтверждает, что конвейер работает правильно.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
pipe.fit(X_train, y_train)
# Scaler mean from pipeline vs computed from X_train
print('Pipeline scaler mean[0]:', pipe.named_steps['sc'].mean_[0].round(4))
print('Direct train mean[0]: ', X_train[:, 0].mean().round(4))Доступ к промежуточным результатам
Чтобы получить преобразованный результат определённого этапа, используйте pipeline[:-1].transform(X) или обратитесь к отдельным этапам через pipeline.named_steps['step_name']. Также можно вызвать pipeline[:'step_name'], используя синтаксис срезов Python, чтобы получить подконвейер до указанного этапа включительно. Это полезно для отладки и проверки того, как выглядят данные после масштабирования.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
pipe.fit(X, y)
# Get scaled output (all steps except the last)
X_scaled = pipe[:-1].transform(X)
print('After scaling — mean per feature:', X_scaled.mean(axis=0).round(4))
print('After scaling — std per feature:', X_scaled.std(axis=0).round(4))make_pipeline: сокращённый вариант
make_pipeline создаёт Pipeline без необходимости вручную задавать имена этапов: он формирует имена из названий классов, записанных в нижнем регистре. Это удобно для быстрых экспериментов, но менее читабельно в рабочем коде, где явные имена помогают определять этапы в строках параметров для поиска по сетке.
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_iris(return_X_y=True)
# Auto-names: 'minmaxscaler' and 'kneighborsclassifier'
pipe = make_pipeline(MinMaxScaler(), KNeighborsClassifier(n_neighbors=5))
print('Step names:', list(pipe.named_steps.keys()))
print('CV accuracy:', cross_val_score(pipe, X, y, cv=5).mean().round(4))Конвейер с вероятностными прогнозами
Если последний оценщик поддерживает predict_proba, Pipeline также предоставляет этот метод. Благодаря этому Вы можете использовать конвейер с любой функцией, ожидающей вероятностные результаты, например с вычислением ROC-AUC, калибровочными кривыми или настройкой порога, не применяя предварительную обработку вручную перед вызовом модели.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
pipe.fit(X_train, y_train)
proba = pipe.predict_proba(X_test)[:, 1]
print('ROC-AUC:', roc_auc_score(y_test, proba).round(4))Изменение параметров после создания
После создания Pipeline Вы можете обновить параметр любого этапа с помощью set_params(step__param=value), используя разделитель в виде двойного подчёркивания. Это тот же синтаксис, который применяется в GridSearchCV. Такой подход удобен, когда Вы хотите проверять разные настройки, не создавая весь конвейер заново.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
# Change C and max_iter after construction
pipe.set_params(lr__C=10.0, lr__max_iter=500)
print('C after set_params:', pipe.named_steps['lr'].C)Сериализация и совместное использование конвейеров
Обученный Pipeline — это единый объект Python, который можно сериализовать с помощью pickle или joblib. Передача конвейера в виде одного файла гарантирует, что при прогнозировании будут применяться в точности те же этапы предварительной обработки с теми же параметрами масштабировщика, устраняя ошибки согласованности между средами обучения и выполнения.
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
pipe.fit(X, y)
# Save and reload
joblib.dump(pipe, '/tmp/iris_pipeline.pkl')
loaded_pipe = joblib.load('/tmp/iris_pipeline.pkl')
print('Predictions match:', (pipe.predict(X) == loaded_pipe.predict(X)).all())Лучший подход к перекрёстной проверке конвейера
Всегда оборачивайте Pipeline в cross_val_score, а не перебирайте части вручную. Это гарантирует, что масштабировщик заново обучается на каждой обучающей части и никогда не работает с проверочной частью, что даёт честную оценку обобщающей способности.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_digits(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('svm', SVC(kernel='rbf', C=5.0, gamma='scale'))
])
scores = cross_val_score(pipe, X, y, cv=5, n_jobs=-1)
print(f'CV accuracy: {np.mean(scores):.4f} +/- {np.std(scores):.4f}')Быстрая проверка
Проверьте, насколько хорошо Вы поняли конвейеры scikit-learn из этого урока.
Итоги урока
В этом уроке Вы узнали, что Pipeline объединяет этапы в один оценщик, предотвращая утечку данных благодаря обучению каждого этапа только на доступных ему обучающих данных; make_pipeline создаёт сокращённые варианты с автоматическими именами, а явные имена повышают понятность поиска по сетке; кроме того, обученный Pipeline можно сериализовать и передавать как единый объект для согласованной предварительной обработки при выполнении. Далее мы добавим ColumnTransformer внутрь Pipeline, чтобы обрабатывать смешанные числовые и категориальные данные.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Ваш первый конвейер: масштабирование и классификатор» бесплатный?
Да — полный текст урока «Ваш первый конвейер: масштабирование и классификатор» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Machine Learning Academy, подпишись на CoddyKit PRO. Курс Machine Learning Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ваш первый конвейер: масштабирование и классификатор»?
Вы объедините StandardScaler и LogisticRegression в Pipeline, вызовете fit и predict и убедитесь, что масштабатор обучается только на обучающих данных. Ты практикуешь Machine Learning Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Machine Learning Academy?
Предыдущий опыт не требуется. Machine Learning Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Ваш первый конвейер: масштабирование и классификатор»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Machine Learning Academy?
Да. Каждый урок Machine Learning Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Ваш первый конвейер: масштабирование и классификатор
- ColumnTransformer внутри конвейера
- Перекрёстная проверка и поиск по сетке для полного конвейера
- Сохранение и загрузка конвейера с помощью joblib