5

Czy można usunąć lub wstawić krok w obiekcie sklearn.pipeline.Pipeline?Wstawianie lub usuwanie kroku w scikit-learn Pipeline

Próbuję wykonać wyszukiwanie siatki z jednym krokiem lub bez niego w obiekcie Pipeline. Zastanawiam się, czy mogę wstawić lub usunąć krok w potoku. W kodzie źródłowym Pipeline widziałem obiekt self.steps zawierający wszystkie kroki. Możemy uzyskać kroki od named_steps(). Przed zmianą, chcę się upewnić, że nie powoduję nieoczekiwanych efektów.

Oto przykładowy kod:

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 

Czy to możliwe, że robimy coś podobnego steps = clf.named_steps(), a następnie wstawić lub usunąć na tej liście? Czy powoduje to niepożądany efekt na obiekcie clf?

Odpowiedz

1

Tak, to jest możliwe, ale musisz spełnić te same wymagania, których Pipeline wymaga przy inicjalizacji, tzn. Nie możesz wstawiać predykatora w żadnym kroku poza ostatnim, powinieneś zadzwonić pod numer fit po aktualizacji Pipeline.steps, ponieważ po takiej aktualizacji wszystkie kroki (może zostały nauczone w poprzednich rozmowach fit) zostaną unieważnione, także ostatni etap Pipeline powinien zawsze implementować metodę fit, wszystkie poprzednie kroki powinny implementować fit_transform.

Tak, będzie działać w aktualnej bazie kodu, ale myślę, że nie jest to dobre rozwiązanie dla twojego zadania, to sprawia, że ​​twój kod jest bardziej zależny od aktualnej implementacji Pipeline, myślę, że wygodniej jest stworzyć nowy Pipeline ze zmodyfikowanymi krokami , ponieważ Pipeline przynajmniej sprawdzi wszystkie twoje kroki podczas inicjalizacji, także tworzenie nowego potoku nie będzie się znacząco różnić pod względem szybkości od modyfikowania kroków istniejącego potoku, ale jak już powiedziałem - tworzenie nowego potoku po każdej modyfikacji kroków jest bezpieczniejsze w przypadku, gdy ktoś znacząco zmieni implementację Pipeline.

+0

Dzięki za komentarze. Niepokoi mnie również kwestia modyfikacji kroków, dlatego zapytałem, czy istnieje bezpieczny sposób na to. Och, o tym, dlaczego chcę zmodyfikować potoki zamiast tworzyć nowe potoki. Powodem jest to, że chcę zrobić kilka eksperymentów z różnymi potokami. Więc modyfikowanie ich w kodzie jest preferowanym sposobem. Zgadzam się, że stworzenie nowego rurociągu to także dobry sposób na odejście. Prawdopodobnie rozważę to ponownie. Dzięki. (Wciąż mam nadzieję, że ktoś ma sposób na bezpieczną modyfikację kroków :) – Bin

2

podstawie testów szczątkowej można bezpiecznie usunąć krok od A scikit-learn rurociągu po prostu jak każdy element listy, z prostym

clf_pipeline.steps.pop(n) 

gdzie n jest pozycja poszczególnych estymatora próbujesz usuwać.

+0

Dzięki za odpowiedź. Czy mógłbyś rozwinąć "oparty na elementarnych testach"? – Bin

+1

Mam około 500 wstępnie przeszkolonych rurociągów z identycznymi krokami wektoryzacji. Przetworzyłem dane przychodzące za pomocą kroku wektoryzacji jednego z tych potoków, a następnie usunięto ten krok ze wszystkich potoków przed uruchomieniem metody predict_proba każdego z rurociągów na wstępnie wektoryzowanych danych. Wynikowe wyniki były takie same, jak gdybym uruchamiał każdy niezmodyfikowany potok na surowych danych bez wstępnego wektoryzacji, a ogólny czas wykonania został poprawiony, ponieważ nie robiłem identycznego kroku wektoryzacji w kółko. Zauważ, że działa to tylko z transformatorami bezstanowymi, takimi jak wektor haszujący. – labelmaker

2

Widzę, że wszyscy wspomnieli tylko o kroku usuwania. W przypadku, gdy chcesz również wstawić krok w rurociągu:

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

pipe.steps działa w taki sam sposób, jak list zrobić, więc można też wstawić element do określonej lokalizacji:

pipe.steps.insert(1,['estimator',transformer()]) #insert as second step 
0

Mamy opracował PipeGraph, rozszerzenie do Pipeline do tworzenia bardziej złożonych wykresów, takich jak przepływy pracy. Umożliwia zmianę połączeń w przepływie pracy podczas przeszukiwania siatki (zobacz przykładową galerię pod adresem https://mcasl.github.io/PipeGraph/).

Powiązane problemy