5

È possibile eliminare o inserire un passaggio in un oggetto sklearn.pipeline.Pipeline?Inserire o eliminare un passaggio nella pipeline di scikit-learn

Sto tentando di eseguire una ricerca della griglia con o senza un passaggio nell'oggetto Pipeline. E mi chiedo se posso inserire o eliminare un passaggio nella pipeline. Ho visto nel codice sorgente Pipeline, c'è un oggetto self.steps che contiene tutti i passaggi. Possiamo ottenere i passaggi entro il named_steps(). Prima di modificarlo, voglio assicurarmi che non causi effetti inaspettati.

Ecco un esempio di codice:

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 

E 'possibile che noi facciamo qualcosa di simile steps = clf.named_steps(), quindi inserire o cancellare in questa lista? Ciò causa un effetto indesiderato sull'oggetto clf?

risposta

1

Sì, è possibile, ma è necessario soddisfare stessi requisiti che Pipeline richiede l'inizializzazione, cioè non è possibile inserire predittore in qualsiasi punto, tranne l'ultima, si dovrebbe chiamare fit dopo l'aggiornamento Pipeline.steps, perché dopo tale aggiornamento tutti i passaggi (forse sono stati appreso nelle precedenti chiamate fit), anche l'ultimo passaggio di Pipeline dovrebbe sempre implementare il metodo fit, tutti i passaggi precedenti dovrebbero implementare .

Quindi sì, funzionerà con il codebase corrente, ma penso che non sia una buona soluzione per il tuo compito, rende il tuo codice più dipendente dall'attuale implementazione di Pipeline, penso che sia più conveniente creare nuove pipeline con passaggi modificati , perché Pipeline valuterà almeno tutti i passaggi durante l'inizializzazione, inoltre la creazione di una nuova pipeline non differirà in modo significativo in termini di velocità dalla modifica dei passaggi della pipeline esistente, ma come ho appena detto: la creazione di una nuova pipeline dopo ogni modifica dei passaggi è più sicuro nel caso in cui qualcuno cambierà in modo significativo l'implementazione della pipeline.

+0

Grazie per i vostri commenti. La preoccupazione di modificare le fasi direttamente è anche la mia preoccupazione, ecco perché ho chiesto se esiste un modo sicuro per farlo. Oh, sul perché voglio modificare le condotte invece di creare nuove condutture. Il motivo è che voglio fare un sacco di esperimenti con diverse pipeline. Quindi modificarli nel codice è un modo preferito. Sono d'accordo che creare una nuova pipeline sia anche un buon modo per andare. Probabilmente riconsidererò questo. Grazie. (Spero ancora che qualcuno abbia un modo per modificare i passaggi in sicurezza :) – Bin

2

In base a test rudimentale è possibile rimuovere un passo da un oleodotto scikit-learn, proprio come si farebbe con qualsiasi elemento della lista, con un semplice

clf_pipeline.steps.pop(n) 

dove n è la posizione del singolo stimatore che si sta cercando rimuovere.

+0

Grazie per la risposta. Potresti espandere "basato su test rudimentali"? – Bin

+1

Ho circa 500 pipeline pre-addestrate con passaggi di vettorizzazione identici. Ho trasformato i dati in arrivo utilizzando la fase di vettorizzazione di una di queste pipeline, quindi ho rimosso questo passaggio da tutte le pipeline prima di eseguire il metodo predict_proba di ogni pipeline sui dati pre-vettorializzati. I punteggi risultanti erano gli stessi di se avessi eseguito ogni pipeline non modificata sui dati grezzi senza pre-vettorializzare, e il runtime complessivo era migliorato dal momento che non stavo facendo lo stesso passaggio di vettorizzazione identico. Si noti che questo funziona solo con trasformatori senza stato come il vettore di hashing. – labelmaker

2

Vedo che tutti hanno menzionato solo la fase di cancellazione. Nel caso in cui si desidera inserire anche un passo in cantiere:

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

pipe.steps opere nello stesso modo come liste fanno, in modo da poter anche inserire un elemento in una posizione specifica:

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

Noi ha sviluppato PipeGraph, un'estensione di Pipeline per costruire un grafico più complesso come i flussi di lavoro. Consente di modificare le connessioni del flusso di lavoro durante la ricerca della griglia (vedere la galleria di esempio allo https://mcasl.github.io/PipeGraph/).