Конвейер Sklearn

В проектах машинного обучения такие этапы, как обработка данных, конструирование признаков, обучение модели и оценка, часто взаимозависимы. Порядок и согласованность этих этапов имеют решающее значение для производительности итоговой модели.

Pipeline — важный инструмент в scikit-learn для организации и упрощения этих этапов.

С помощью Pipeline мы можем объединить предварительную обработку данных с обучением модели, тем самым упрощая рабочий процесс и повышая повторное использование кода.

Что такое Pipeline

Pipeline — это инструмент, который может последовательно выполнять несколько этапов обработки данных и этапов обучения модели.

В Pipeline каждый шаг представляет собой кортеж, содержащий имя и объект.

Каждый объект обычно является Transformer или Estimator, где:

  • TransformerОбъект, выполняющий преобразования данных, такие как предварительная обработка данных (например, нормализация, стандартизация, отбор признаков и т. д.).
  • EstimatorОбъект, используемый для обучения моделей, например классификаторы или регрессоры.

PipelineЭто позволяет легко объединять несколько этапов в повторно используемый рабочий процесс и обеспечивает согласованность процесса обработки данных, избегая ошибок, вызванных дублированием кода или ручной обработкой.

Почему стоит использовать Pipeline

  • Упрощение кода: Объединение нескольких шагов в одно целое упрощает структуру кода и управление им.
  • Избегание утечки данных: При предобработке данных убедитесь, что обучающая и тестовая выборки обрабатываются изолированно, чтобы избежать утечки данных. Например, при стандартизации среднее и стандартное отклонение не должны вычисляться на тестовой выборке.
  • Сокращение повторяющейся работы: С помощьюPipelineвы можете связать процессы предобработки данных и обучения модели в единую цепочку, избегая повторного написания кода предобработки для каждого обучения.
  • Повышение переиспользуемости: Инкапсуляция обработки данных и обучения модели вPipelineобъект позволяет повторно использовать его в разных проектах и наборах данных.
  • Упрощение настройки: С помощьюPipelineвы можете напрямую применять оптимизацию гиперпараметров, кросс-валидацию и т. д. при настройке, упрощая весь процесс.

Компоненты Pipeline

Pipeline состоит из нескольких шагов, и каждый шаг — это кортеж, содержащий два элемента:

  1. Имя шага(строковый тип): Используется для идентификации каждого шага.
  2. Transformer или Estimator: Объект, используемый для обработки данных или моделирования.

Типичные шаги включают:

  • Этапы предобработки данных: такие как очистка данных, стандартизация, кодирование и т. д.
  • Этапы обучения модели: такие как классификаторы, регрессоры и т. д.

Создание простого Pipeline

Предположим, у нас есть набор данных, и нам нужно стандартизировать данные перед обучением классификатора машины опорных векторов (SVM). Мы можем объединить этапы стандартизации и обучения модели в Pipeline.

Пример

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# Загрузить данные
data = load_iris()
X, y = data.data, data.target

# Разделите набор данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создать Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # Стандартизировать данные
    ('svc', SVC())  # Классификатор машины опорных векторов
])

# Обучаем модель
pipeline.fit(X_train, y_train)

# Сделать предсказания
y_pred = pipeline.predict(X_test)

# Вывести точность модели
print(f"Точность модели: {pipeline.score(X_test, y_test)}")

Запустите приведённый выше код, вывод будет следующим:

Model accuracy: 1.0

Как работает Pipeline

В приведённом выше примере Pipeline выполнил два шага:

  1. Стандартизация данных(с помощьюStandardScaler()): Стандартизировать данные так, чтобы каждый признак имел среднее значение 0 и дисперсию 1.
  2. Обучение модели(с помощьюSVC()): Обучить классификатор опорных векторов на стандартизированных данных.

PipelineРабочий процесс Pipeline таков: сначала выполнить этапы предварительной обработки данных (например, стандартизацию), затем передать обработанные данные модели для обучения. Этот процесс можно выполнитьpipeline.fit()за один шаг,pipeline.predict()а при выполнении прогнозов данные также пройдут через каждый шаг конвейера в том же порядке.


Преимущества Pipeline

Упрощение кода и рабочего процесса

С помощью Pipeline мы можем объединить несколько шагов в один объект, тем самым сократив код для ручного выполнения нескольких шагов.

Без Pipeline предварительную обработку нужно выполнять несколько раз:

Пример

# Без Pipeline (предварительную обработку нужно выполнять несколько раз)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = SVC()
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

С помощью Pipeline это выполняется за один шаг:

Пример

# С помощью Pipeline (выполняется за один шаг)
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC())
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

Обеспечение согласованности обработки обучающих и тестовых данных

Без Pipeline, если мы вручную выполняем обработку данных и обучение, мы можем случайно использовать разные методы обработки для обучающего и тестового наборов, что приводит к утечке данных.

Например, мы вычисляем среднее и дисперсию для стандартизации на обучающем наборе, но если на тестовом наборе вычисляются другие среднее и дисперсия, оценка модели будет неточной. Использование Pipeline обеспечивает согласованность этих методов обработки.

Автоматизация всего процесса

Pipeline позволяет инкапсулировать несколько шагов в один объект, автоматизируя весь процесс предварительной обработки данных, обучения модели и прогнозирования. Этот автоматизированный рабочий процесс снижает количество человеческих ошибок и повышает возможность повторного использования кода.


Настройка и оптимизация Pipeline

При использовании Pipeline мы можем напрямую выполнять настройку гиперпараметров.

Комбинируя GridSearchCV или RandomizedSearchCV, можно оптимизировать гиперпараметры каждого шага в Pipeline.

Настройка гиперпараметров в Pipeline с помощью GridSearchCV:

Пример

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV


# Загрузить данные
data = load_iris()
X, y = data.data, data.target

# Разделите набор данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создать Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # Стандартизировать данные
    ('svc', SVC())  # Классификатор машины опорных векторов
])

# Обучаем модель
pipeline.fit(X_train, y_train)

# Определите сетку гиперпараметров
param_grid = {
    'svc__C': [0.1, 1, 10],  # Настройте параметр C в SVC
    'svc__kernel': ['linear', 'rbf']  # Настройте параметр ядра
}

# Создайте объект GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=5)

# Выполните настройку гиперпараметров
grid_search.fit(X_train, y_train)

# Выведите лучшие параметры и оценку
print(f"Лучшие параметры: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")
<

strong>Примечание:

  • svc__Cиsvc__kernelДаPipelineСредняяSVCГиперпараметры шагов. Указывая эти параметры вGridSearchCVмы можем напрямую настраивать модель вPipelineдля настройки гиперпараметров.
  • cv=5обозначает 5-кратную кросс-валидацию.

Результат вывода следующий:

Best parameters: {'svc__C': 0.1, 'svc__kernel': 'linear'}
Best score: 0.9583333333333334

Использование Pipeline для кросс-валидации

Вы можете объединить Pipeline с кросс-валидацией, чтобы обеспечить согласованность всего процесса оценки модели. При кросс-валидации на каждой итерации выполняется предобработка обучающих данных, а затем модель обучается для валидации.

Пример

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score


# Загрузить данные
data = load_iris()
X, y = data.data, data.target

# Разделите набор данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создать Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # Стандартизировать данные
    ('svc', SVC())  # Классификатор машины опорных векторов
])

# Обучаем модель
pipeline.fit(X_train, y_train)

# Выполнить 5-кратную кросс-валидацию
cv_scores = cross_val_score(pipeline, X, y, cv=5)

# Вывод оценок кросс-валидации
print(f"Оценки кросс-валидации: {cv_scores}")
print(f"Средняя оценка кросс-валидации: {cv_scores.mean()}")

В этом примере cross_val_score автоматически выполнит кросс-валидацию данных, стандартизируя данные перед каждым обучением.

Результат вывода следующий:

Cross-validation scores: [0.96666667 0.96666667 0.96666667 0.93333333 1.        ]
Mean cross-validation score: 0.9666666666666666
Другие расширения