2015-10-12 7 views
37

sklearn.pipeline.Pipelineがどのように正確に動作するかわかりません。Python - sklearn.pipeline.Pipelineとは何ですか?

docにはいくつかの説明があります。例えば、それらが何を意味するか:

最後の見積もりによる変換のパイプライン。

stepsは何ですか?どのように機能するのですか?

編集私は私の質問を明確にすることができます答えに

ありがとう:私はパイプラインを呼び出すと

と、ステップとして、2つの変圧器と1つの推定器を通過し、例えば:

pipln = Pipeline([("trsfm1",transformer_1), 
        ("trsfm2",transformer_2), 
        ("estmtr",estimator)]) 

私はこれを呼び出すとどうなりますか?

pipln.fit() 
OR 
pipln.fit_transform() 

私は推定器は、変圧器とどのように変圧器を装着することができることができる方法を見つけ出すことはできません。

+2

私が理解していることから、パイプラインは学習プロセスのいくつかのステップを自動化するのに役立ちます。モデルやフィーチャ選択のトレーニングやテストなど...回帰を混ぜて、それを使って分類器にフィードする場合は、その回帰とそれに続く分類子の訓練が必要です。編集:詳細を追加する – M0rkHaV

答えて

56

トランスフォーマー in scikit-learn - fitとtransformメソッド、またはfit_transformメソッドを持ついくつかのクラス。

予測子 - 適切な予測方法を持つクラス、またはfit_predictメソッド。

パイプラインは抽象概念であり、既存のmlアルゴリズムではありません。多くの場合、MLのタスクでは、最終的な見積もりを適用する前に、生データセットの異なる変換のシーケンスを実行する必要があります(一連のフィーチャを見つけ、新しいフィーチャを生成し、いくつかの優れたフィーチャを選択する必要があります)。

Hereは、パイプラインの使用例です。 パイプラインは、3段階の変換とその結果のエスティメータすべてに対して1つのインターフェイスを提供します。それは内部の変圧器と予測因子をカプセル化し、そして今、あなたのような何かを行うことができます:あなたは簡単の各ステップのためのパラメータのセットの上にグリッド検索を行うことができ、パイプラインで

pipeline = Pipeline([ 
    ('vect', CountVectorizer()), 
    ('tfidf', TfidfTransformer()), 
    ('clf', SGDClassifier()), 
]) 
predicted = pipeline.fit(Xtrain).predict(Xtrain) 
# Now evaluate all steps on test set 
predicted = pipeline.predict(Xtest) 

:だけで

vect = CountVectorizer() 
    tfidf = TfidfTransformer() 
    clf = SGDClassifier() 

    vX = vect.fit_transform(Xtrain) 
    tfidfX = tfidf.fit_transform(vX) 
    predicted = clf.fit_predict(tfidfX) 

    # Now evaluate all steps on test set 
    vX = vect.fit_transform(Xtest) 
    tfidfX = tfidf.fit_transform(vX) 
    predicted = clf.fit_predict(tfidfX) 

をこのメタ見積もり上記のリンクで説明したとおりです。最後のステップを除くすべてのステップは変換でなければならず、最後のステップは変圧器または予測子とすることができます。 回答の編集pipln.fit()に電話すると、パイプライン内の各トランスが以前のトランスの出力にフィッティングされます(最初のトランスは未加工のデータセットで学習されます)。最後のエスティメータがトランスまたは予測子の場合、パイプラインでfit_transform()を呼び出すことができます。これは、最後のエスティメータがトランスフォーマである場合(fit_transformを実装するか、別々に変換およびフィットする場合)、パイプラインでfit_predict()またはpredict最後の推定量は予測値です。したがって、パイプラインでfit_transformまたはtransformを呼び出すことはできません。最後のステップはプレディクタです。

+0

'predicted = pipeline.fit(Xtrain).predict(Xtrain)'とはどういう意味ですか? – farhawa

+0

@farhawa、トレーニングセットのクラスを予測します。 –

+0

fitはあなたが呼び出したオブジェクトを返しますので、fit()。predict()はfit_predict()と同等です –

7

私はM0rkHaVが正しいアイデアを持っていると思います。 Scikit-learnのパイプラインクラスは、重要なメソッドを一度呼び出すだけでよいので、推定器の横に複数の異なるトランスフォーマーを1つのオブジェクトにカプセル化するのに便利なツールです(fit()predict()など)。 fit()transform()の両方を実装するクラスです

  1. トランスフォーマー2つの主要コンポーネントを分解してみましょう。 TfidfVectorizerBinarizerのようなSklearnの前処理ツールのいくつかに精通しているかもしれません。これらの前処理ツールのドキュメントを見ると、これらの両方の方法を実装していることがわかります。私がかなり涼しいと感じるのは、いくつかのエスティメータが変換ステップとしても使用できるということです。 LinearSVC

  2. 推定子は、fit()predict()の両方を実装するクラスです。多くの分類器と回帰モデルはこれらの両方の方法を実装しているので、多くの異なるモデルを簡単にテストできます。最終的な推定器として別の変圧器を使用することも可能である(すなわち、必ずしもpredict()を実装するのではなく、確かにfit()を実装する)。これは、predict()に電話をかけることができないことを意味します。

あなたの編集については、テキストベースの例を見てみましょう。 LabelBinarizerを使用して、ラベルのリストをバイナリ値のリストに変換する必要があります。二値化は、いくつかのデータに装着されたときに

bin = LabelBinarizer() #first we initialize 

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized 

さて、それは変圧器が 'について知っているのユニークなクラスが含まれていclasses_と呼ばれる構造を持つことになります。 fit()を呼び出さないと、バイナリライザーはデータがどのように見えるかわからないため、transform()を呼び出すことは意味をなさないでしょう。これは、データを収める前にクラスのリストを印刷する場合に当てはまります。

print bin.classes_ 

これをしようとしたとき、私は次のエラーを取得する:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_' 

しかし、あなたがvecリスト上値化し合うとき:

bin.fit(vec) 

もう一度
print bin.classes_ 
を試してみてください

私は次

['cat' 'dog'] 


print bin.transform(vec) 

そして今、vecオブジェクトに変換呼び出した後、我々は次を得る:

変圧器として使用されている推定量については
[[0] 
[1] 
[1] 
[1]] 

、私たちはの例としてDecisionTree分類器を使用してみましょう特徴抽出器。意思決定ツリーはさまざまな理由から素晴らしいですが、私たちの目的のために重要なのは、彼らが予測するのに役立つ機能をランク付けする能力があることです。デシジョンツリーでtransform()と電話すると、入力データがあり、と表示されます。は最も重要な機能だと考えています。したがって、データ行列(n行×m列)をより小さな行列(n行×k列)に変換すると考えることができます。ここで、k列は、決定木が見つけたk個の最も重要な機能です。

+0

'fit()'と 'transform()'の違いは、トランスフォーマーですか?どのように見積もりを変圧器として使用することができますか? – farhawa

+1

'fit()'は、クラシファイアや回帰モデルのように、トランスにフィットするように呼び出すメソッドです。 'transform()'に関しては、実際に入力データを出力データに変換するために呼び出すメソッドです。例えば、 'Binarizer.transform([8,2,2])'(フィッティング後)を呼び出すと、 '[[1,0]、[0,1]、[0,1]]'となることがあります。見積もりを変圧器として使用する場合は、私の答えに簡単な例を編集します。 – NBartley

関連する問題