2017-02-09 8 views
1

scikit-learnパイプラインでステップをロックしてpipeline.fit()で再構築できないようにする便利なメカニズムはありますか?たとえば:scikit-learnパイプラインでのロックステップ(修復を防ぐ)

import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.svm import LinearSVC 
from sklearn.pipeline import Pipeline 
from sklearn.datasets import fetch_20newsgroups 

data = fetch_20newsgroups(subset='train') 
firsttwoclasses = data.target<=1 
y = data.target[firsttwoclasses] 
X = np.array(data.data)[firsttwoclasses] 

pipeline = Pipeline([ 
    ("vectorizer", CountVectorizer()), 
    ("estimator", LinearSVC()) 
]) 

# fit intial step on subset of data, perhaps an entirely different subset 
# this particular example would not be very useful in practice 
pipeline.named_steps["vectorizer"].fit(X[:400]) 
X2 = pipeline.named_steps["vectorizer"].transform(X) 

# fit estimator on all data without refitting vectorizer 
pipeline.named_steps["estimator"].fit(X2, y) 
print(len(pipeline.named_steps["vectorizer"].vocabulary_)) 

# fitting entire pipeline refits vectorizer 
# is there a convenient way to lock the vectorizer without doing the above? 
pipeline.fit(X, y) 
print(len(pipeline.named_steps["vectorizer"].vocabulary_)) 

私は中間の変換せずにこれをやって考えることができる唯一の方法は、(here見られるように)カスタム推定クラスを定義することですそのフィット法は何もして変換する方法は、事前の変換ではないん - 適合変圧器。これが唯一の方法ですか?

答えて

1

コードを見ると、このような機能を持つパイプラインオブジェクトには何も表示されません。パイプラインで.fit()を呼び出すと、各ステージで.fit()が返されます。

私が思い付くことができる最高の迅速かつ汚いソリューションは、猿パッチ段階のフィッティング機能を離れにある:

pipeline.named_steps["vectorizer"].fit(X[:400]) 
# disable .fit() on the vectorizer step 
pipeline.named_steps["vectorizer"].fit = lambda self, X, y=None: self 
pipeline.named_steps["vectorizer"].fit_transform = model.named_steps["vectorizer"].transform 

pipeline.fit(X, y) 
関連する問題