2013-07-29 17 views
9

Làm thế nào để bạn gọi partial_fit() trên một trình phân loại scikit-tìm hiểu được bọc bên trong một Pipeline()?Sử dụng partial_fit với Scikit Pipeline

Tôi đang cố gắng để xây dựng một phân loại văn bản từng bước khả năng huấn luyện sử dụng SGDClassifier như:

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

nhưng tôi nhận được một AttributeError cố gắng gọi classifier.partial_fit(x,y).

Nó hỗ trợ fit(), vì vậy tôi không thấy lý do tại sao partial_fit() không khả dụng. Liệu có thể nhìn vào đường ống, gọi các máy biến áp dữ liệu, và sau đó gọi trực tiếp partial_fit() trên máy phân loại của tôi?

+0

Cậu cuối cùng đưa ra một solu tion cho điều này? – GreenGodot

Trả lời

5

Đường ống không sử dụng partial_fit, do đó không để lộ nó. Có lẽ chúng ta sẽ cần một sơ đồ pipelining chuyên dụng cho tính toán ngoài lõi nhưng điều đó cũng phụ thuộc vào khả năng của các mô hình trước đó.

Đặc biệt trong trường hợp này, bạn có thể muốn thực hiện một số dữ liệu, một để phù hợp với từng giai đoạn của đường ống và sau đó chuyển đổi tập dữ liệu để phù hợp với bước tiếp theo, ngoại trừ giai đoạn đầu tiên là không trạng thái, do đó không phù hợp với các tham số từ dữ liệu.

Đồng thời, có thể dễ dàng cuộn mã trình bao bọc của riêng bạn phù hợp với nhu cầu của bạn hơn.

+1

Bạn có thể giới thiệu cách tôi có thể tự cuộn của mình không? Tôi đã thử bằng cách sử dụng phương thức transform() của đường ống, và sau đó giải nén phân loại và cho ăn dữ liệu đã chuyển đổi thành partial_fit(), nhưng tôi nhận được một lỗi về vectơ tdf là không xác định. – Cerin

+3

Đọc [mã nguồn của lớp Pipeline] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/pipeline.py#L26) và [ví dụ này] (http: // scikit-learn.org/dev/auto_examples/applications/plot_out_of_core_classification.html). Sau đó đọc tài liệu cho [tính năng trích xuất văn bản và mẹo băm] (http://scikit-learn.org/dev/modules/feature_extraction.html#vectorizing-a-large-text-corpus-with-the-hashing-trick) để đảm bảo bạn hiểu rõ vấn đề với tính năng trích xuất tính năng trạng thái. Việc triển khai sẽ phụ thuộc vào vấn đề bạn đang cố giải quyết. – ogrisel

+0

Cụ thể nếu bạn sử dụng máy biến áp trạng thái là 'TfidfTransformer', bạn sẽ cần phải thực hiện một số thao tác trên dữ liệu của mình. – ogrisel

6

Đây là những gì tôi đang làm - nơi 'mapper' và 'clf' là 2 bước trong obj đường ống của tôi.

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) 

Bạn có thể muốn theo dõi hiệu suất như bạn tiếp tục điều chỉnh/cập nhật phân loại của bạn - nhưng đó là một điểm thứ

nên đặc biệt hơn - các đường ống dẫn ban đầu (s) được xây dựng như sau

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 để tìm hiểu thêm về nó - nhưng ở đây nó chỉ cho phép một bước chuyển đổi có thể chơi thoải mái với gấu trúc

Các vấn đề liên quan