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

http://scikit-learn.org/0.18/modules/pipeline.html をgoogle翻訳した
[scikit-learn 0.18 ユーザーガイド 4. データセット変換](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より

----

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

## 4.1.1. パイプライン：連鎖推定

[パイプライン](http://scikit-learn.org/0.18/modules/generated/sklearn.pipeline.Pipeline.html#sklearn.pipeline.Pipeline) を使用すると、複数の推定器を1つにまとめることができます。特徴選択、正規化、分類など、データを処理するステップは固定されていることが多いため、便利です。パイプラインはここで2つの目的を果たします。

  - **利便性**：推定器のシーケンス全体に合わせるためには、`fit` を呼び出してデータを一度 `predict` するだけです。
  - **ジョイントパラメータの選択** ：パイプライン内のすべての推定器のパラメータを一度に[グリッドで検索](http://scikit-learn.org/0.18/modules/grid_search.html#grid-search)できます。

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


## 4.1.1.1. 使用法

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

```python
>>> 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](http://scikit-learn.org/0.18/modules/generated/sklearn.pipeline.make_pipeline.html#sklearn.pipeline.make_pipeline) は、パイプラインを構築するための省略形です。複数の推定器を引数に、パイプラインを返ます。名前は自動的に決まります：

```python
>>> 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` 属性にリストとして格納されています。

```python
>>> 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` にも：


```python
>>> 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>` 構文を使用してアクセスできます。

```python
>>> 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))])
```

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

```python
>>> 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`に設定されます。

```python
>>>
>>> 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)
```

  - 例：
    - [パイプラインANOVA SVM](http://scikit-learn.org/0.18/auto_examples/feature_selection/feature_selection_pipeline.html#sphx-glr-auto-examples-feature-selection-feature-selection-pipeline-py)
    - [テキストの特徴抽出と評価のためのサンプルパイプライン](http://scikit-learn.org/0.18/auto_examples/model_selection/grid_search_text_feature_extraction.html#sphx-glr-auto-examples-model-selection-grid-search-text-feature-extraction-py)
    - [パイプライン化：PCAとロジスティック回帰の連鎖](http://scikit-learn.org/0.18/auto_examples/plot_digits_pipe.html#sphx-glr-auto-examples-plot-digits-pipe-py)
    - [RBFカーネルの明示的なフィーチャマップ近似](http://scikit-learn.org/0.18/auto_examples/plot_kernel_approximation.html#sphx-glr-auto-examples-plot-kernel-approximation-py)
    - [SVM-Anova：単変量特徴選択を伴うSVM](http://scikit-learn.org/0.18/auto_examples/svm/plot_svm_anova.html#sphx-glr-auto-examples-svm-plot-svm-anova-py)
  - 参照：
    - [推定器のハイパーパラメータのチューニング](http://qiita.com/nazoking@github/items/09a4c63614797a6bd705)


### 4.1.1.2. ノート

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

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

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

### 4.1.2.1. 使用法

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


```python
>>> 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](http://scikit-learn.org/0.18/modules/generated/sklearn.pipeline.make_union.html#sklearn.pipeline.make_union) という簡潔なコンストラクタがあります。


```python
>>> 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` に設定されると無視されます。

  - 例：
    - [複数の特徴抽出法を連結する](http://scikit-learn.org/0.18/auto_examples/feature_stacker.html#sphx-glr-auto-examples-feature-stacker-py)
    - [異種データソースを持つ機能統合](http://scikit-learn.org/0.18/auto_examples/hetero_feature_union.html#sphx-glr-auto-examples-hetero-feature-union-py)

----
[scikit-learn 0.18 ユーザーガイド 4. データセット変換](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より

©2010 - 2016、scikit-learn developers（BSDライセンス）。