Можно ли удалить или вставить шаг в объект sklearn.pipeline.Pipeline?

Я пытаюсь выполнить поиск по сетке с одним шагом в объекте конвейера или без него. И интересно, могу ли я вставить или удалить шаг в конвейере. В исходном коде Pipeline я видел, что есть объект self.steps, содержащий все шаги. Мы можем получить шаги по named_steps(). Прежде чем изменять его, я хочу убедиться, что я не вызываю неожиданных эффектов.

Вот пример кода:

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
estimators = [('reduce_dim', PCA()), ('svm', SVC())]
clf = Pipeline(estimators)
clf 

Возможно ли, чтобы мы сделали что-то вроде steps = clf.named_steps(), а затем вставили или удалили этот список? Вызывает ли это нежелательный эффект на объекте clf?

25
Bin 17 Дек 2015 в 02:35

4 ответа

Лучший ответ

Я вижу, что все упомянули только шаг удаления. Если вы хотите также вставить шаг в конвейер:

pipe.steps.append(['step name',transformer()])

pipe.steps работает так же, как списки, поэтому вы также можете вставить элемент в определенное место:

pipe.steps.insert(1,['estimator',transformer()]) #insert as second step
17
HonzaB 23 Окт 2017 в 09:10

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

clf_pipeline.steps.pop(n)

Где n - позиция отдельного оценщика, которого вы пытаетесь удалить.

8
labelmaker 18 Окт 2016 в 23:51

Да, это возможно, но вы должны выполнить те же требования, которые требует Pipeline при инициализации, то есть вы не можете вставить предиктор ни на одном шаге, кроме последнего, вы должны вызывать fit после обновления Pipeline.steps, потому что после такого обновления все шаги ( возможно, они были изучены в предыдущих fit вызовах), будут признаны недействительными, также последний шаг Pipeline должен всегда реализовывать метод fit, все предыдущие шаги должны реализовывать fit_transform.

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

1
Ibraim Ganiev 17 Дек 2015 в 07:19

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

Остерегайтесь с моим подходом, хотя. Нарезка списков в этом случае немного странная.

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.preprocessing import PolynomialFeatures

estimators = [('reduce_dim', PCA()), ('poly', PolynomialFeatures()), ('svm', SVC())]
clf = Pipeline(estimators)

Если вы хотите создать конвейер всего за несколько шагов PCA / Polynomial, вы можете просто нарезать шаг списка по индексам и передать его в Pipeline.

clf1 = Pipeline(clf.steps[0:2])

Хотите просто использовать шаги 2/3? Остерегайтесь, эти кусочки не всегда имеют смысл

clf2 = Pipeline(clf.steps[1:3])

Хотите просто использовать шаги 1/3? Я не могу использовать этот подход

clf3 = Pipeline(clf.steps[0] + clf.steps[2]) # errors
1
plumbus_bouquet 31 Июл 2019 в 14:11