【翻訳】scikit-learn 0.18 User Guide 3.2. 推定器のハイパーパラメータのチューニング

http://scikit-learn.org/0.18/modules/grid_search.html を google翻訳した
[scikit-learn 0.18 ユーザーガイド 3. モデルの選択と評価](http://qiita.com/nazoking@github/items/267f2371757516f8c168#3-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%A8%E8%A9%95%E4%BE%A1) より

-----

# 3.2. 推定器のハイパーパラメータのチューニング

ハイパーパラメータとは、推定器内の、直接学習されないパラメータのことです。 scikit-learnでは、それらは引数として推定子クラスのコンストラクタに渡されます。典型的な例には、サポートベクター分類器の `C`、 `kernel` 、 `gamma` 、LASSO の `alpha` などがあります。
[最適なクロスバリデーション：推定器の​​成果](http://qiita.com/nazoking@github/items/13b167283590f512d99a) のスコアで、ハイパーパラメータ空間を検索することは可能であり、推奨されます。
推定器を構成する任意のパラメータは、このようにして最適化することができる。具体的には、与えられた推定器のすべてのパラメータの名前と現在の値を見つけるには、次のようにします。

```python
estimator.get_params()
```

検索は次のようになります。

  - 推定器（独立変数または `sklearn.svm.SVC()` などの分類器）
  - パラメータ空間
  - 候補を探索またはサンプリングする方法
  - クロスバリデーション
  - スコア関数

いくつかのモデルでは、以下に概説される特殊で効率的なパラメータ検索戦略が可能です。指定された値に対して、 [GridSearchCV](http://scikit-learn.org/0.18/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV) はすべてのパラメータの組み合わせを徹底的に検討し、 [RandomizedSearchCV](http://scikit-learn.org/0.18/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV) は指定された分布を持つパラメータ空間から与えられた数の候補をサンプリングすることができます。これらのツールを説明した後、我々は両方のアプローチに適用できるベストプラクティスを詳述します。
これらのパラメータの小さなサブセットは、モデルの予測または計算のパフォーマンスに大きな影響を与える可能性があり、その他のパラメータはデフォルト値のままにすることができるのが一般的です。おそらく文献に添付されている参考文献を読んで、予想される動作をより詳細に理解するために、推定器クラスのドキュメントを読むことをお勧めします。

## 3.2.1. 完全なグリッド検索

GridSearchCVによって提供されるグリッド検索は、 `param_grid` パラメータで指定されたパラメータ値のグリッドから候補を徹底的に生成します。例えば、次の `param_grid` ：

```python
param_grid = [
  {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
  {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ]
```

線形カーネルと[1、10、100、1000]のC値、RBFカーネルを持つ2つのグリッド、およびC値の外積を[1,10 、100,1000]、 `gamma` 値[0.001、0.0001]である。
GridSearchCVインスタンスは通常の推定器APIを実装しています。データセットに「フィッティング」すると、可能なすべてのパラメータ値の組み合わせが評価され、最適な組み合わせが保持されます。

  - 例：
    - digits データセットのグリッド検索の計算例については、[相互検証付きグリッド検索を使用したパラメータ推定](http://scikit-learn.org/0.18/auto_examples/model_selection/grid_search_digits.html#sphx-glr-auto-examples-model-selection-grid-search-digits-py) を参照してください。
    - pipeline.Pipelineを使ってテキスト・ドキュメント特徴量抽出器（n-gram カウントベクトル化器およびTF-IDF変換器）と分類器（SGDで訓練されたリニアSVMまたはL2ペナルティ）の両方のパラメータをグリッド・サーチする例は、「[テキスト特徴量抽出および評価のパイプライン・サンプル](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)」を参照してください。
    - iris データセットの相互検証ループ内でのグリッド検索の例については、 [ネスト対ネストされていない相互検証](http://scikit-learn.org/0.18/auto_examples/model_selection/plot_nested_cross_validation_iris.html#sphx-glr-auto-examples-model-selection-plot-nested-cross-validation-iris-py) を参照してください。これは、グリッド検索を使用してモデルのパフォーマンスを評価するためのベストプラクティスです。

## 3.2.2. ランダム化されたパラメータの最適化

パラメータ設定のグリッドを使用することは、現在、パラメータ最適化のために最も広く使用されている方法ですが、他の検索方法はより好ましい特性を持っています。 RandomizedSearchCVは、パラメータごとにランダムな検索を実装します。各設定は、可能なパラメータ値に対する分布からサンプリングされます。これには、包括的な検索に比べて2つの主な利点があります。

  - 予算は、パラメータの数および可能な値とは無関係に選択することができる。
  - パフォーマンスに影響を与えないパラメータを追加しても、効率は低下しません。

パラメータのサンプリング方法を指定するには、辞書を使用します。これは、GridSearchCVのパラメータを指定するのと非常によく似ています。さらに、サンプリングされた候補数またはサンプリング反復回数である計算予算は、 `n_iter` パラメーターを使用して指定されます。各パラメータについて、可能な値に対する分布または離散的な選択肢のリスト（一様にサンプリングされる）を指定することができます。

```python
{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
  'kernel': ['rbf'], 'class_weight':['balanced', None]}
```

この例では、 `expon` 、 `gamma` 、 `uniform` または `randint` などのサンプリングパラメータに役立つ多くのディストリビューションを含む `scipy.stats` モジュールを使用しています。原則として、値をサンプリングする `rvs`（random variate sample）メソッドを提供する関数を渡すことができます。  `rvs` 関数への呼び出しは、連続呼び出しで可能なパラメータ値から独立したランダムサンプルを提供する必要があります。

> **警告** scipy 0.16より前の `scipy.stats` では、ランダムな状態を指定することはできません。代わりに、 `np.random.seed` を介してシードするか、または `np.random.set_state` を使用して設定することができるグローバルnumpyランダム状態を使用します。しかし、scikit-learn 0.18を開始すると、 [scley.model_selection](http://scikit-learn.org/0.18/modules/classes.html#module-sklearn.model_selection) モジュールは、scipy> = 0.16 も利用可能である場合、ユーザーが提供するランダムな状態を設定します。

上記の `C` のような連続パラメータの場合、ランダム化を最大限に活用するために連続分布を指定することが重要です。このようにして、 `n_iter` を増やすと常により細かい検索が行われます。

  - 例：
    - [ランダム検索とグリッド検索を比較してハイパーパラメータ推定を行う](http://scikit-learn.org/0.18/auto_examples/model_selection/randomized_search.html#sphx-glr-auto-examples-model-selection-randomized-search-py) は、ランダム検索とグリッド検索の使用法と効率を比較します。
  - 参考文献：
    - Bergio、J. and Bengio、Y.、ハイパーパラメータ最適化のためのランダム検索、機械学習研究ジャーナル（2012）

# 3.2.3. パラメータ検索のヒント

## 3.2.3.1. 客観的なメトリックの指定

デフォルトでは、パラメータ検索では推定器の `score` 関数を使用してパラメータ設定を評価します。これらは、分類のための [sklearn.metrics.accuracy_score](http://scikit-learn.org/0.18/modules/generated/sklearn.metrics.accuracy_score.html#sklearn.metrics.accuracy_score) と回帰のための [sklearn.metrics.r2_score](http://scikit-learn.org/0.18/modules/generated/sklearn.metrics.r2_score.html#sklearn.metrics.r2_score) があります。用途によっては、他のスコアリング機能がより適しています（たとえば、不均衡な分類では、精度スコアはしばしば参考になりません）。 GridSearchCV、RandomizedSearchCV、および以下で説明する特殊なクロスバリデーションツールの `scoring` パラメータを使用して、別のスコアリング関数を指定することができます。詳細については、 [スコアリング・パラメータ：モデル評価ルールの定義](http://qiita.com/nazoking@github/items/958426da6448d74279c7#331-%E5%BE%97%E7%82%B9%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E8%A9%95%E4%BE%A1%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E5%AE%9A%E7%BE%A9) を参照してください。

### 3.2.3.2. 合成推定器とパラメータ空間

[パイプライン：連鎖推定](http://qiita.com/nazoking@github/items/fdfd207b3127d6d026e0#411-%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E9%80%A3%E9%8E%96%E6%8E%A8%E5%AE%9A) は、これらのツールでパラメータ空間を検索できる合成推定器の​​構築について説明しています。

### 3.2.3.3. モデル選択：開発と評価

さまざまなパラメータ設定を評価することによるモデルの選択は、グリッドのパラメータを「訓練」するためにラベル付きデータを使用する方法として見ることができます。
得られたモデルを評価する際には、グリッド検索プロセス中には使用されなかったサンプルについて評価を行うことが重要です。データを **開発セット** （GridSearchCVインスタンスに供給される）と **評価セット** に分割してパフォーマンスメトリックを計算することをお勧めします。
これは、 [train_test_split](http://scikit-learn.org/0.18/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split) ユーティリティー関数を使用して行うことができます。

### 3.2.3.4. 平行

GridSearchCV と RandomizedSearchCVは、それぞれのパラメータ設定を個別に評価します。あなたのOSがサポートしていれば、キーワード `n_jobs = -1`を使って計算を並列に実行することができます。詳細は、関数のシグネチャを参照してください。

### 3.2.3.5. 障害に対するロバスト性

いくつかのパラメータ設定は、`fit` でエラーが発生するかもしれません。デフォルトでは、他のパラメータ設定が完全に評価できる場合でも、検索全体が失敗することになります。 `error_score = 0`（または= np.NaN）を設定すると、警告が発行され、その時のスコアが 0 (またはNaN) に設定されますが、検索は完了します。

## 3.2.4. ブルートフォースパラメータ検索の代替

### 3.2.4.1. モデル固有の相互検証

モデルの中には、あるパラメーターの値の範囲のデータを、そのパラメーターの単一の値に対して推定器を適合させるのとほぼ同じくらい効率的に適合させることができます。この機能を利用して、このパラメータのモデル選択に使用されるより効率的なクロスバリデーションを実行できます。
この戦略に従う最も一般的なパラメータは、正則化装置の強度を符号化するパラメータである。この場合、推定器の **正規化パス** を計算すると言います。
そのようなモデルのリストはここにあります：

  - [linear_model.ElasticNetCV([l1_ratio, eps, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.ElasticNetCV.html#sklearn.linear_model.ElasticNetCV)
     - 正規化パスに沿った反復適合を伴うElastic Netモデル
  - [linear_model.LarsCV([fit_intercept, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.LarsCV.html#sklearn.linear_model.LarsCV)
     - クロスバリデーションされたLars回帰モデル
  - [linear_model.LassoCV([eps, n_alphas, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.LassoCV.html#sklearn.linear_model.LassoCV)
     - 正規化パスに沿った反復適合を伴うLasso線形モデル
  - [linear_model.LassoLarsCV([fit_intercept, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.LassoLarsCV.html#sklearn.linear_model.LassoLarsCV)
     - LARSアルゴリズムを使用してクロスバリデーションされたLasso
  - [linear_model.LogisticRegressionCV([Cs, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.LogisticRegressionCV.html#sklearn.linear_model.LogisticRegressionCV)
     - ロジスティック回帰クロスバリデーション(別名logit, MaxEnt) 分類器
  - [linear_model.MultiTaskElasticNetCV([...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.MultiTaskElasticNetCV.html#sklearn.linear_model.MultiTaskElasticNetCV)
     - クロスバリデーション機能を内蔵したマルチタスクL1 / L2 ElasticNet
  - [linear_model.MultiTaskLassoCV([eps, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.MultiTaskLassoCV.html#sklearn.linear_model.MultiTaskLassoCV)
     - クロスバリデーションが組み込まれたマルチタスクL1 / L2 Lasso
  - [linear_model.OrthogonalMatchingPursuitCV([...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.OrthogonalMatchingPursuitCV.html#sklearn.linear_model.OrthogonalMatchingPursuitCV)
     - クロスバリデーションされた直交マッチング追求モデル(OMP) 
  - [linear_model.RidgeCV([alphas, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.RidgeCV.html#sklearn.linear_model.RidgeCV)
     - クロスバリデーションを組み込んだリッジ回帰
  - [linear_model.RidgeClassifierCV([alphas, ...]) ](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.RidgeClassifierCV.html#sklearn.linear_model.RidgeClassifierCV)
     - クロスバリデーションを組み込んだリッジ識別器

### 3.2.4.2. 情報基準

いくつかのモデルは、正則化パラメータの最適推定値の情報理論的閉形式を提供することができます（交差検定を使用する場合は数個ではなく）。
自動モデル選択のためにAikike Information Criterion（AIC）またはBayesian Information Criterion（BIC）から利益を得たモデルのリストを以下に示します。

  - [linear_model.LassoLarsIC([criterion, ...])](http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.LassoLarsIC.html#sklearn.linear_model.LassoLarsIC)
     - モデル選択のためのBICまたはAICを使用したLassoモデルのLars適合

### 3.2.4.3. バッグの見積もり

バギングに基づいたアンサンブル法を使用する場合、すなわち置換を伴うサンプリングを使用して新しいトレーニングセットを生成する場合、トレーニングセットの一部は未使用のままである。アンサンブル内の各分類器について、トレーニングセットの異なる部分は除外される。
この残された部分は、別個の検証セットに依存することなく、汎化誤差を推定するために使用することができる。この推定値は、追加データが不要でモデル選択に使用できるため、「無料」となります。
これは現在、次のクラスで実装されています。

  - [ensemble.RandomForestClassifier([...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier)
    - ランダムフォレスト分類器
  - [ensemble.RandomForestRegressor([...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor)
    - ランダムなフォレスト回帰器
  - [ensemble.ExtraTreesClassifier([...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier)
    - 余分な木の分類器です。
  - [ensemble.ExtraTreesRegressor([n_estimators, ...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor)
    - 余分な木の退行者。
  - [ensemble.GradientBoostingClassifier([loss, ...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier)
    - 分類のための勾配ブースト。
  - [ensemble.GradientBoostingRegressor([loss, ...])](http://scikit-learn.org/0.18/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor)
    - 回帰のための勾配ブースト。

------

[scikit-learn 0.18 ユーザーガイド 3. モデルの選択と評価](http://qiita.com/nazoking@github/items/267f2371757516f8c168#3-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%A8%E8%A9%95%E4%BE%A1) より

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