2013-07-29 4 views
9

Как вы называете partial_fit() классификатором scikit-learn, обернутым внутри Pipeline()?Использование partial_fit с трубопроводом Scikit

Я пытаюсь построить пошагово обучаемый текст классификатор с использованием SGDClassifier как:

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

, но я получаю AttributeError пытаюсь вызвать classifier.partial_fit(x,y).

Он поддерживает fit(), поэтому я не понимаю, почему partial_fit() не доступен. Можно ли заглянуть в конвейер, вызвать трансформаторы данных, а затем напрямую вызвать partial_fit() на моем классификаторе?

+0

ли вы в конечном итоге прийти к Солу для этого? – GreenGodot

ответ

5

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

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

В то же время, вероятно, проще свернуть собственный код оболочки, соответствующий вашим потребностям.

+1

Можете ли вы порекомендовать, как я могу бросить свою? Я попытался использовать метод transform() для конвейера, а затем извлечение классификатора и подачу преобразованных данных в его partial_fit(), но я получаю сообщение об ошибке, когда неопределенный tdf-вектор не определен. – Cerin

+3

Прочитайте [исходный код класса Pipeline] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/pipeline.py#L26) и [этот пример] (http: // scikit-learn.org/dev/auto_examples/applications/plot_out_of_core_classification.html). Затем прочитайте документацию по [извлечению текста и хеширующему трюку] (http://scikit-learn.org/dev/modules/feature_extraction.html#vectorizing-a-large-text-corpus-with-the-hashing-trick), чтобы убедиться, что вы полностью понимаете проблему с извлечением функции с сохранением состояния. Реализация будет зависеть от того, какую проблему вы пытаетесь решить. – ogrisel

+0

В частности, если вы используете трансформаторы с переменным состоянием как 'TfidfTransformer', вам нужно будет сделать несколько проходов в ваших данных. – ogrisel

6

Вот что я делаю - где «mapper» и «clf» - это 2 шага в моем проекте 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) 

Вы, вероятно, хотите, чтобы отслеживать производительность, как вы держите корректировки/обновления классификатора - но это второстепенная точка

так более конкретно - оригинальный трубопровод (ы) были построены следующим образом

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, чтобы узнать больше об этом - но вот это как раз позволяет сделать шаг преобразования, который играет хорошо с пандами

Смежные вопросы