Python-正確にはsklearn.pipeline.Pipelineとは何ですか?


117

どのようにsklearn.pipeline.Pipeline動作するのか正確に理解できません。

ドキュメントにいくつかの説明があります。たとえば、次の意味は何ですか。

最終的な推定量を使用した変換のパイプライン。

私の質問をより明確にするために、何stepsですか?それらはどのように機能しますか?

編集する

回答のおかげで、質問をより明確にすることができます:

パイプラインを呼び出して、ステップとして、2つのトランスフォーマーと1つの推定器を渡します。例:

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

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

pipln.fit()
OR
pipln.fit_transform()

推定器を変圧器にする方法や、変圧器を取り付ける方法を理解できません。


3
私が理解したことから、パイプラインは学習プロセスのいくつかのステップを自動化するのに役立ちます。モデルや機能選択のトレーニングやテストなど...回帰を混合して、たとえばそれを使用して分類子をフィードする場合、ステップはその回帰のトレーニングであり、次に分類子のトレーニングになります。編集:詳細を追加
M0rkHaV 2015年

回答:


178

scikit-learnのトランスフォーマー -fitおよびtransformメソッド、またはfit_transformメソッドを持つクラス。

予測子 -フィットおよび予測メソッド、またはfit_predictメソッドを持つクラス。

パイプラインは単なる抽象的な概念であり、既存のmlアルゴリズムではありません。多くの場合、MLタスクでは、最終的な推定量を適用する前に、生データセットの一連のさまざまな変換(機能のセットの検索、新しい機能の生成、一部の優れた機能のみの選択)を実行する必要があります。

以下はパイプラインの使用例です。Pipelineは、変換の3つのステップすべてとその結果の推定量に対して単一のインターフェースを提供します。トランスフォーマーと予測子を内部にカプセル化し、次のようなことができるようになります。

    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)

ただ:

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)

パイプラインを使用すると、このメタ推定器の各ステップのパラメーターセットに対してグリッド検索を簡単に実行できます。上記のリンクに記載されています。最後のステップを除くすべてのステップは変換でなければならず、最後のステップはトランスフォーマーまたは予測子にすることができます。 編集の回答:呼び出すとpipln.fit()-パイプライン内の各トランスフォーマーが前のトランスフォーマーの出力に適合します(最初のトランスフォーマーは生のデータセットで学習されます)。最後の推定器はトランスフォーマーまたは予測子であり、最後の推定器がトランスフォーマー(fit_transform、または変換とフィットのメソッドを個別に実装する)である場合にのみ、パイプラインでfit_transform()を呼び出すことができます。あなたの最後の推定者は予測者です。つまり、パイプラインでfit_transformを呼び出したり、transformしたりすることはできません。その最後のステップは予測変数です。


1
どういう意味predicted = pipeline.fit(Xtrain).predict(Xtrain)ですか?
farhawa

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

4
なぜこれはもっと投票しないのですか?ブログ投稿である必要があります。
Rクラベン2017年

1
@iamgin、ほとんどのscikit-learnトランスフォーマーのインターフェイスでは、変換したい必要な列を選択できません。ただし、独自の「アイテムセレクター」を作成して、必要な列のみをトランスフォーマーに供給することができます。ここでItemSelectorとFeatureUnionとの良好な例であるscikit-learn.org/stable/auto_examples/...は
Ibraim Ganiev

1
最初の例では、テストセットに再度適合させたくないですか?それはfit_transformの代わりにtransformを呼び出すだけではないのですか?そして同様に、パイプライン予測は内部でfit_transformを呼び出すか、単に変換するだけですか?制御できますか?
スティーブン

18

M0rkHaVは正しい考えを持っていると思います。Scikit学習パイプラインのクラスは、あなただけ(一度、あなたの重要なメソッドを呼び出す必要がありそうという、1つのオブジェクトに推定と一緒に、複数の異なる変圧器をカプセル化するための便利なツールであるfit()predict()など)。2つの主要なコンポーネントを分解してみましょう。

  1. トランスフォーマーは、fit()との両方を実装するクラスですtransform()TfidfVectorizerやなど、一部のsklearn前処理ツールに精通している可能性がありBinarizerます。これらの前処理ツールのドキュメントを見ると、これらのメソッドの両方が実装されていることがわかります。私がかなりクールだと思うのは、一部の推定量が変換ステップとしても使用できることLinearSVCです。

  2. Estimatorは、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_'

しかし、2値化をvecリストに合わせると、次のようになります。

bin.fit(vec)

そしてさらに試みる

print bin.classes_

私は以下を得ます:

['cat' 'dog']


print bin.transform(vec)

そして、vecオブジェクトの変換を呼び出した後、次のようになります。

[[0]
 [1]
 [1]
 [1]]

変換器として使用される推定量についてDecisionTreeは、特徴抽出器の例として分類子を使用してみましょう。ディシジョンツリーはさまざまな理由で優れていますが、私たちの目的にとって重要なのは、ツリーが予測に役立つとわかった特徴をランク付けできることです。transform()ディシジョンツリーを呼び出すと、ディシジョンツリーは入力データを受け取り、最も重要な機能であると考えるものを見つけます。したがって、データマトリックス(n行x m列)をより小さなマトリックス(n行x k列)に変換することを考えることができます。ここで、k列はディシジョンツリーで検出されたk個の最も重要な機能です。


違いは何だfit()transform()変圧器では?、推定器はどのようにトランスフォーマーとして使用できますか?
farhawa 2015年

2
fit()分類子や回帰モデルと同様に、トランスフォーマーを適合または「トレーニング」するために呼び出すメソッドです。についてはtransform()、これは実際に入力データを出力データに変換するために呼び出すメソッドです。たとえば、Binarizer.transform([8,2,2])(フィッティング後に)を呼び出すと、が発生する可能性があり[[1,0],[0,1],[0,1]]ます。トランスフォーマーとして推定器を使用することに関しては、短い例を編集して私の答えにします。
NBartley、2015年

9

MLアルゴリズムは通常、表形式のデータを処理します。MLアルゴリズムの前後に、このデータの前処理と後処理を実行することができます。パイプラインは、これらのデータ処理ステップをチェーン化する方法です。

MLパイプラインとは何ですか、またどのように機能しますか?

パイプラインは、データが変換される一連のステップです。これは、古い「パイプとフィルター」の設計パターンに由来します(たとえば、パイプ「|」またはリダイレクト演算子「>」を使用するunix bashコマンドを考えることができます)。ただし、パイプラインはコード内のオブジェクトです。したがって、各フィルターのクラス(別名、各パイプラインステップ)と、それらのステップを最終的なパイプラインに結合する別のクラスがある場合があります。一部のパイプラインは、他のパイプラインを直列または並列に組み合わせたり、複数の入力または出力を持っている場合があります。機械学習パイプラインは次のように表示します。

  • パイプとフィルター。パイプラインのステップはデータを処理し、データから学習できる内部状態を管理します。
  • 複合材料。パイプラインはネストできます。たとえば、パイプライン全体を別のパイプラインの単一のパイプラインステップとして扱うことができます。パイプラインステップは必ずしもパイプラインである必要はありませんが、パイプライン自体は定義上、少なくともパイプラインステップです。
  • 有向非巡回グラフ(DAG)。パイプラインステップの出力は他の多くのステップに送信され、結果の出力は再結合されます。補足:パイプラインは非循環ですが、複数のアイテムを1つずつ処理でき、状態が変化した場合(例:毎回fit_transformメソッドを使用)、状態を維持しながら、時間をかけて繰り返し展開していると見なすことができます(たとえば、 RNN)。これは、本番環境に配置してより多くのデータでトレーニングするときにオンライン学習を行うためのパイプラインを確認する興味深い方法です。

Scikit-Learnパイプラインのメソッド

パイプライン(またはパイプラインのステップ)には、次の2つのメソッドが必要です。

  • データに基づいて学習し、状態を取得する「フィット」(例:ニューラルネットワークのニューラルウェイトはそのような状態です)
  • 変換」(または「予測」)して、実際にデータを処理し、予測を生成します。

このメソッドを呼び出して両方をチェーンすることもできます。

  • fit_transform ”は、データを適合させてから変換しますが、1つのパスで行うため、2つのメソッドを次々に直接実行する必要がある場合に、コードを最適化できます。

sklearn.pipeline.Pipelineクラスの問題

Scikit-Learnの「パイプとフィルター」のデザインパターンは単純に美しいものです。しかし、それをディープラーニング、AutoML、および複雑な本番レベルのパイプラインに使用する方法は?

Scikit-Learnの最初のリリースは2007年で、ディープラーニング以前の時代でした。ただし、これは最もよく知られ採用されている機械学習ライブラリの1つであり、現在も成長しています。何よりも、Pipe and Filter設計パターンをソフトウェアアーキテクチャスタイルとして使用します。これがScikit-Learnを非常に優れたものにし、すぐに使用できるアルゴリズムを提供するという事実に加えてです。ただし、次のことを行う際には大きな問題があり、2020年にはすでに対応できるはずです。

  • 自動機械学習(AutoML)、
  • ディープラーニングパイプライン
  • より複雑な機械学習パイプライン。

これらのScikit-Learnの問題に対して私たちが見つけたソリューション

確かに、Scikit-Learnは非常に便利でよく構築されています。ただし、更新が必要です。これは、Scikit-Learnを最新のコンピューティングプロジェクト内で新鮮で使用できるようにするNeuraxleのソリューションです。

Neuraxleを通じて提供される追加のパイプラインメソッドと機能

注:パイプラインのステップにfitメソッドまたはtransformメソッドのいずれかが必要ない場合は、NonFittableMixinまたはNonTransformableMixinから継承して、これらのメソッドのいずれかのデフォルト実装を提供して何もしないようにすることができます。

手始めに、パイプラインまたはそのステップがオプションでこれらのメソッドを定義することも可能です

  • セットアップのステップのそれぞれの「設定」メソッドを呼び出します」。たとえば、ステップにTensorFlow、PyTorch、またはKerasニューラルネットワークが含まれている場合、ステップはそれらのニューラルグラフを作成し、フィットする前に「セットアップ」メソッドでそれらをGPUに登録できます。最適なハイパーパラメーターを検索する自動機械学習アルゴリズム内で異なるハイパーパラメーターを使用してステップを何度も実行する前にコピーする場合など、いくつかの理由により、ステップのコンストラクターで直接グラフを作成することはお勧めしません。
  • ティアダウン」は、「セットアップ」メソッドの反対です。リソースをクリアします。

以下の方法がデフォルトで提供されているハイパーを管理可能にするために:

  • get_hyperparams」は、ハイパーパラメータの辞書を返します。パイプラインにさらにパイプライン(ネストされたパイプライン)が含まれている場合、ハイパーパラメーターのキーは二重下線「__」区切り文字でチェーンされます。
  • set_hyperparams」を使用すると、取得したときと同じ形式で新しいハイパーパラメータを設定できます。
  • get_hyperparams_spaceは、」あなたは1を定義した場合は、空ではないことになるハイパーのスペースを、取得することができます。したがって、ここでの「get_hyperparams」との唯一の違いは、正確な値ではなく値として統計分布を取得することです。たとえば、レイヤー数の1つのハイパーパラメーターは、RandInt(1, 3)1〜3レイヤーを意味するa になります。.rvs()このdictを呼び出してランダムに値を選択し、「set_hyperparams」に送信してトレーニングを試すことができます。
  • set_hyperparams_spaceは」「get_hyperparams_space」と同じハイパー分布クラスを使用して新しい領域を設定するために使用することができます。

推奨されるソリューションの詳細については、上記のリンクを含む大きなリストのエントリをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.