2013-07-29 5 views
9

Come si chiama partial_fit() in un classificatore di scikit-learn avvolto in un Pipeline()?Uso partial_fit con Scikit Pipeline

che sto cercando di costruire un classificatore di testo in modo incrementale addestrabile utilizzando SGDClassifier come:

from sklearn.linear_model import SGDClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.feature_extraction.text import HashingVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.multiclass import OneVsRestClassifier 

classifier = Pipeline([ 
    ('vectorizer', HashingVectorizer(ngram_range=(1,4), non_negative=True)), 
    ('tfidf', TfidfTransformer()), 
    ('clf', OneVsRestClassifier(SGDClassifier())), 
]) 

ma ottengo un AttributeError cercando di chiamare classifier.partial_fit(x,y).

Supporta fit(), quindi non vedo perché partial_fit() non è disponibile. Sarebbe possibile introspettare la pipeline, chiamare i trasformatori di dati e quindi chiamare direttamente partial_fit() sul mio classificatore?

+0

ti è finalmente trovare una solu per questo? – GreenGodot

risposta

5

La pipeline non utilizza partial_fit, quindi non la espone. Probabilmente avremmo bisogno di uno schema di pipeline dedicato per il calcolo fuori dal core, ma ciò dipende anche dalle capacità dei modelli precedenti.

In particolare in questo caso è probabile che si desideri eseguire diversi passaggi sui dati, uno per adattarsi a ogni fase della pipeline e quindi per trasformare il set di dati in modo che si adatti a quello successivo, tranne che per il primo stadio che è senza stato, quindi non si adatta ai parametri dai dati.

Nel frattempo è probabilmente più semplice eseguire il rollover del codice wrapper personalizzato in base alle proprie esigenze.

+1

Potete consigliarmi come potrei fare da solo? Ho provato a utilizzare il metodo transform() della pipeline e quindi a estrarre il classificatore e ad alimentare i dati trasformati nel suo partial_fit(), ma ottengo un errore sul fatto che il vettore tdf non è definito. – Cerin

+3

Leggere il [codice sorgente della classe Pipeline] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/pipeline.py#L26) e [questo esempio] (http: // scikit-learn.org/dev/auto_examples/applications/plot_out_of_core_classification.html). Quindi leggi la documentazione per [estrazione di feature di testo e trucco di hashing] (http://scikit-learn.org/dev/modules/feature_extraction.html#vectorizing-a-large-text-corpus-with-the-hashing-trick) per assicurarti di comprendere appieno il problema con l'estrazione di funzionalità stateful. L'implementazione dipenderà dal problema che stai cercando di risolvere. – ogrisel

+0

In particolare se si utilizzano trasformatori di stato come 'TfidfTransformer', è necessario eseguire diversi passaggi sui dati. – ogrisel

6

Ecco cosa sto facendo - dove "mapper" e "clf" sono i 2 passaggi nel mio obj Pipeline.

def partial_pipe_fit(pipeline_obj, df): 
    X = pipeline_obj.named_steps['mapper'].fit_transform(df) 
    Y = df['class'] 
    pipeline_obj.named_steps['clf'].partial_fit(X,Y) 

Probabilmente si desidera tenere traccia delle prestazioni quando si mantiene regolare/aggiornare la classificazione - ma questo è un punto secondario

in modo più specifico - la conduttura originale (s) sono stati costruiti come segue

to_vect = Pipeline([('vect', CountVectorizer(min_df=2, max_df=.9, ngram_range=(1, 1), max_features = 100)), 
          ('tfidf', TfidfTransformer())]) 
full_mapper = DataFrameMapper([ 
      ('norm_text', to_vect), 
      ('norm_fname', to_vect), ]) 

full_pipe = Pipeline([('mapper', full_mapper), ('clf', SGDClassifier(n_iter=15, warm_start=True, 
                   n_jobs=-1, random_state=self.random_state))]) 

google DataFrameMapper per saperne di più su di esso - ma qui si consente solo una fase di trasformazione che gioca con i panda bello