2013-07-29 4 views
9

Pipeline() 안에 감싸여있는 scikit-learn 분류기에서 partial_fit()을 어떻게 부르십니까? Scikit 파이프 라인에서 partial_fit 사용

내가 좋아하는 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())), 
]) 

을하지만, 나는 AttributeErrorclassifier.partial_fit(x,y)를 호출하려고 얻을.

fit()을 지원하므로 이유가 표시되지 않습니다. partial_fit()을 사용할 수 없습니다. 파이프 라인을 조사하고 데이터 변환기를 호출 한 다음 내 분류 자에 partial_fit()을 직접 호출 할 수 있습니까?

+0

당신이 결국 SOLU을 마련 했을 수 있습니다 이것에 대한 찬성? – 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

특히 Stateful 변압기를'TfidfTransformer'로 사용하면 데이터에 대해 여러 번 통과해야합니다. – ogrisel

6

여기서 'mapper'와 'clf'는 내 파이프 라인 obj의 2 단계입니다.

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

구글 DataFrameMapper은 그것에 대해 더 배울 수 -하지만 여기 그냥 변환 팬더 좋은 재생 단계

관련 문제