В чем разница между конвейером и make_pipeline в scikit?

Я получил это на веб-странице sklearn:

a) Трубопровод: трубопровод трансформаций с окончательной оценкой

б) Make_pipeline: постройте трубопровод из заданных оценок. Это сокращение для конструктора Pipeline.

Но я все еще не понимаю, когда я должен использовать каждый. Может ли кто-нибудь дать мне пример?

Ответ 1

Единственное различие заключается в том, что make_pipeline генерирует имена шагов.

Нужны имена шагов, например, если вы хотите использовать конвейер с утилитами выбора модели (например, GridSearchCV). При поиске по сетке вам нужно указать параметры для различных этапов конвейера:

pipe = Pipeline([('vec', CountVectorizer()), ('clf', LogisticRegression()])
param_grid = [{'clf__C': [1, 10, 100, 1000]}
gs = GridSearchCV(pipe, param_grid)
gs.fit(X, y)

сравните его с make_pipeline:

pipe = make_pipeline(CountVectorizer(), LogisticRegression())     
param_grid = [{'logisticregression__C': [1, 10, 100, 1000]}
gs = GridSearchCV(pipe, param_grid)
gs.fit(X, y)

Итак, с Pipeline:

  • имена являются явными, вам не нужно их вычислять, если они вам нужны;
  • имя не изменяется, если вы изменяете оценщик/трансформатор, используемый в шаге, например, если вы замените LogisticRegression() на LinearSVC(), вы все равно можете использовать clf__C.

make_pipeline:

  • более короткая и, возможно, более читаемая нотация;
  • имена автоматически генерируются с использованием простого правила (нижнее имя оценки).

Когда использовать их зависит от вас :) Я предпочитаю make_pipeline для быстрых экспериментов и Pipeline для более стабильного кода; эмпирическое правило: IPython Notebook → make_pipeline; Модуль Python в более крупном проекте → Трубопровод. Но, конечно же, не очень важно использовать make_pipeline в модуле или Pipeline в коротком скрипте или ноутбуке.