2013-07-29 8 views
9

Jak nazwać partial_fit() na klasyfikatorze naukowym scikit zawiniętym wewnątrz Pipeline()?Korzystanie z partial_fit z Scikit Pipeline

Staram się budować stopniowo nadającego klasyfikator tekstu przy użyciu SGDClassifier odczuwalna:

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())), 
]) 

ale pojawia się AttributeError próby wywołania classifier.partial_fit(x,y).

Obsługuje fit(), więc nie widzę powodu, dla którego partial_fit() jest niedostępny. Czy możliwe byłoby dokonanie introspekcji potoku, wywołanie transformatorów danych, a następnie bezpośrednie wywołanie partial_fit() w moim klasyfikatorze?

+0

Czy w końcu wymyślić Solu do tego? – GreenGodot

Odpowiedz

5

Rurociąg nie używa partial_fit, dlatego nie jest narażony. Prawdopodobnie potrzebowalibyśmy dedykowanego schematu potokowego dla obliczeń out-of-core, ale zależy to również od możliwości poprzednich modeli.

W tym przypadku prawdopodobnie chcieliby Państwo wykonać kilka przebiegów nad danymi, jeden w celu dopasowania do każdego etapu potoku, a następnie przekształcić zestaw danych w celu dopasowania do następnego, z wyjątkiem pierwszego etapu, który jest bezpaństwowy, dlatego nie pasuje do parametrów z danych.

W tym czasie prawdopodobnie łatwiej jest przetasować własny kod opakowania dostosowany do Twoich potrzeb.

+1

Czy możesz polecić, w jaki sposób mogę rzucić własną? Próbowałem użyć metody transform() rurociągu, a następnie wyodrębniłem klasyfikator i wprowadziłem transformowane dane do parametru partial_fit(), ale pojawia się błąd dotyczący niezdefiniowanego wektora tdf. – Cerin

+3

Przeczytaj [kod źródłowy klasy Pipeline] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/pipeline.py#L26) i [ten przykład] (http: // scikit-learn.org/dev/auto_examples/applications/plot_out_of_core_classification.html). Następnie przeczytaj dokumentację [wyodrębnianie elementów tekstowych i sztuczkę mieszającą] (http://scikit-learn.org/dev/modules/feature_extraction.html#vectorizing-a-large-text-corpus- with-hashing-trick), aby upewnić się, że w pełni rozumiesz problem z ekstrakcją funkcji stanu. Implementacja zależeć będzie od tego, jaki problem próbujesz rozwiązać. – ogrisel

+0

W szczególności, jeśli używasz transformatorów stanowych jako 'TfidfTransformer', będziesz musiał wykonać kilka przebiegów na swoich danych. – ogrisel

6

Oto, co robię - gdzie "mapper" i "clf" to dwa kroki w moim Pipeline obj.

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) 

Prawdopodobnie chcesz śledzić wydajność, jak zachować regulacji/aktualizowanie klasyfikator - ale to jest punkt wtórny

tak bardziej konkretnie - oryginalny rurociąg (y) zostały skonstruowane w następujący sposób

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 aby dowiedzieć się więcej na ten temat - ale tutaj to właśnie umożliwia etap transformacji, która odgrywa ładne z pand