sklearn.pipeline.Pipeline
が正確にどのように機能するのかわかりません。
doc にはいくつかの説明があります。たとえば、次の意味は何ですか?
最終推定器を使用した変換のパイプライン。
私の質問を明確にするために、steps
とは何ですか?彼らはどのように機能しますか?
編集
回答のおかげで、質問をより明確にすることができます。
パイプラインを呼び出して、ステップとして、2つのトランスフォーマーと1つのエスティメータを渡します(例:
pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])
これを呼び出すとどうなりますか?
pipln.fit()
OR
pipln.fit_transform()
推定器がどのようにトランスになり、どのようにトランスを取り付けることができるのかわかりません。
transformerscikit-learn-fitおよびtransformメソッド、またはfit_transformメソッドを持つクラス。
Predictor-fitおよびpredictメソッド、またはfit_predictメソッドを持つクラス。
Pipelineは単なる抽象概念であり、既存の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、またはtransformおよびfitメソッドを個別に実装する)である場合にのみ、パイプラインでfit_transform()を呼び出すことができます。最後の推定量は予測値です。そのため、パイプラインでfit_transformまたはtransformを呼び出すことはできません。その最後のステップは予測子です。
M0rkHaVには正しい考えがあると思います。 Scikit-learnのパイプラインクラスは、複数の異なるトランスフォーマーを推定器と一緒に1つのオブジェクトにカプセル化するための便利なツールです。したがって、重要なメソッドを1回呼び出すだけで済みます(fit()
、predict()
など)。 2つの主要なコンポーネントを分類しましょう。
トランスフォーマーは、fit()
とtransform()
の両方を実装するクラスです。 TfidfVectorizer
やBinarizer
など、sklearnの前処理ツールのいくつかに精通しているかもしれません。これらの前処理ツールのドキュメントを見ると、これらのメソッドの両方を実装していることがわかります。私がかなりクールだと思うのは、いくつかの推定量も変換ステップとして使用できることです。 LinearSVC
!
推定器は、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
リストに2値化器を合わせると:
bin.fit(vec)
そしてさらに試みる
print bin.classes_
私は次を取得します:
['cat' 'dog']
print bin.transform(vec)
そして今、vec
オブジェクトでtransformを呼び出した後、次のものが得られます:
[[0]
[1]
[1]
[1]]
トランスフォーマーとして使用されている推定器に関しては、機能抽出器の例としてDecisionTree
分類器を使用してみましょう。デシジョンツリーは多くの理由で優れていますが、私たちの目的にとって重要なのは、treeが予測に役立つと思われる機能をランク付けできることです。デシジョンツリーでtransform()
を呼び出すと、入力データを取得し、itが最も重要な機能であると考えるものを見つけます。したがって、データ行列(n行x m列)をより小さな行列(n行x k列)に変換すると考えることができます。ここで、k列は、決定木が見つけたk個の最も重要な特徴です。