Ответ 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 в коротком скрипте или ноутбуке.