LoginSignup
10
9

More than 5 years have passed since last update.

【翻訳】scikit-learn 0.18 User Guide 4.1. パイプラインとFeatureUnion:推定器の組み合わせ

Last updated at Posted at 2016-12-23

http://scikit-learn.org/0.18/modules/pipeline.html をgoogle翻訳した
scikit-learn 0.18 ユーザーガイド 4. データセット変換 より


4.1. パイプラインとFeatureUnion:推定器の組み合わせ

4.1.1. パイプライン:連鎖推定

パイプライン を使用すると、複数の推定器を1つにまとめることができます。特徴選択、正規化、分類など、データを処理するステップは固定されていることが多いため、便利です。パイプラインはここで2つの目的を果たします。

  • 利便性:推定器のシーケンス全体に合わせるためには、fit を呼び出してデータを一度 predict するだけです。
  • ジョイントパラメータの選択 :パイプライン内のすべての推定器のパラメータを一度にグリッドで検索できます。

最後のパイプラインを除くパイプラインのすべての推定器は、変換器でなければなりません(transformメソッドが必要です)。 最後の推定器は、任意のタイプ(変換器、分類器など)であってよい。

4.1.1.1. 使用法

パイプラインは (key, value) のペアのリストを使用して作成されます。key はこのステップに付ける名前の文字列で、value は推定器インスタンスです。

>>> from sklearn.pipeline import Pipeline
>>> from sklearn.svm import SVC
>>> from sklearn.decomposition import PCA
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> pipe = Pipeline(estimators)
>>> pipe 
Pipeline(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',
n_components=None, random_state=None, svd_solver='auto', tol=0.0,
whiten=False)), ('clf', SVC(C=1.0, cache_size=200, class_weight=None,
coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False))])

ユーティリティ関数 make_pipeline は、パイプラインを構築するための省略形です。複数の推定器を引数に、パイプラインを返ます。名前は自動的に決まります:

>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn.preprocessing import Binarizer
>>> make_pipeline(Binarizer(), MultinomialNB()) 
Pipeline(steps=[('binarizer', Binarizer(copy=True, threshold=0.0)),
                ('multinomialnb', MultinomialNB(alpha=1.0,
                                                class_prior=None,
                                                fit_prior=True))])

パイプライン中の推定器は、 steps 属性にリストとして格納されています。

>>> pipe.steps[0]
('reduce_dim', PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False))

あと dict として named_steps にも:

>>> pipe.named_steps['reduce_dim']
PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)

パイプラインの推定パラメータは、<estimator>__<parameter> 構文を使用してアクセスできます。

>>> pipe.set_params(clf__C=10) 
Pipeline(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',
    n_components=None, random_state=None, svd_solver='auto', tol=0.0,
    whiten=False)), ('clf', SVC(C=10, cache_size=200, class_weight=None,
    coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',
    kernel='rbf', max_iter=-1, probability=False, random_state=None,
    shrinking=True, tol=0.001, verbose=False))])

これは、グリッド検索を行う場合に特に重要です。

>>> from sklearn.model_selection import GridSearchCV
>>> params = dict(reduce_dim__n_components=[2, 5, 10],
...               clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=params)

個々のステップもパラメータとして置き換えられ、非最終ステップは無視され、Noneに設定されます。

>>>
>>> from sklearn.linear_model import LogisticRegression
>>> params = dict(reduce_dim=[None, PCA(5), PCA(10)],
...               clf=[SVC(), LogisticRegression()],
...               clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=params)

4.1.1.2. ノート

パイプライン上で fit を呼び出すことは、各推定器に順番に fit を呼び出し、入力を変換して次のステップに渡すのと同じです。 パイプラインは、パイプライン中の最後の推定器が有するすべてのメソッドを有する。すなわち、最後の推定器が分類器である場合、パイプラインは分類器として使用され得る。 最後の推定器が変換器であれば、パイプラインも同様です。

4.1.2. FeatureUnion:複合フィーチャスペース

FeatureUnion は、いくつかの変換器オブジェクトを、それらの出力を組み合わせた新しい変換器に結合します。 FeatureUnionは変換器オブジェクトのリストを取ります。 フィッティング中は、これらのそれぞれがデータに個別にフィットします。 データを変換するために、変換は並列に適用され、それらが出力するサンプルベクトルは、エンドツーエンドで連結されて大きなベクトルになります。
FeatureUnionは、Pipelineと同じ目的を果たします - 利便性と共同パラメータの推定と検証。
FeatureUnionとパイプラインを組み合わせて複雑なモデルを作成することができます。
(FeatureUnionは2つの変換が同じフィーチャを生成するかどうかをチェックする方法がなく、フィーチャセットがばらばらになっている場合にのみユニオンを生成し、コール元の責任であることを確認します)。

4.1.2.1. 使用法

FeatureUnionは (key, value) のペアのリストを使用して構築されます。ここで、key は変換に与える名前です(任意の文字列、識別子としてのみ機能します)。value は推定器オブジェクトです。

>>> from sklearn.pipeline import FeatureUnion
>>> from sklearn.decomposition import PCA
>>> from sklearn.decomposition import KernelPCA
>>> estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
>>> combined = FeatureUnion(estimators)
>>> combined 
FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True,
    iterated_power='auto', n_components=None, random_state=None,
    svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca',
    KernelPCA(alpha=1.0, coef0=1, copy_X=True, degree=3,
    eigen_solver='auto', fit_inverse_transform=False, gamma=None,
    kernel='linear', kernel_params=None, max_iter=None, n_components=None,
    n_jobs=1, random_state=None, remove_zero_eig=False, tol=0))],
    transformer_weights=None)

パイプラインと同様、フィーチャユニオンには、コンポーネントの明示的な命名を必要としない、make_union という簡潔なコンストラクタがあります。

>>> combined.set_params(kernel_pca=None) 
FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True,
      iterated_power='auto', n_components=None, random_state=None,
      svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca', None)],
    transformer_weights=None)

パイプラインと同様に、個々のステップは set_params を使用して置き換えられ、 None に設定されると無視されます。


scikit-learn 0.18 ユーザーガイド 4. データセット変換 より

©2010 - 2016、scikit-learn developers(BSDライセンス)。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9