【翻訳】scikit-learn 0.18 チュートリアル 科学的データ処理のための統計学習のチュートリアル モデル選択：推定器とそのパラメータの選択

http://scikit-learn.org/stable/tutorial/statistical_inference/model_selection.html を google翻訳した
[scikit-learn 0.18 チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)
[科学的データ処理のための統計学習のチュートリアル 目次](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3)
[前のチュートリアルページ](http://qiita.com/nazoking@github/items/062e7f9149ed23c0e096)

# モデル選択：推定器とそのパラメータの選択

## スコア、クロスバリデーションされたスコア

これまで見てきたように、すべての推定器は、新しいデータのフィット（または予測）の品質を判断できる `score` メソッドを公開しています。大きい方が良い。

```python
>>> from sklearn import datasets, svm
>>> digits = datasets.load_digits()
>>> X_digits = digits.data
>>> y_digits = digits.target
>>> svc = svm.SVC(C=1, kernel='linear')
>>> svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])
0.97999999999999998
```

予測精度（モデルの適合度のプロキシとして使用できる）のより良い尺度を得るために、我々は訓練とテストに使用するフォールドでデータを連続的に分割することができます。

```python
>>> import numpy as np
>>> X_folds = np.array_split(X_digits, 3)
>>> y_folds = np.array_split(y_digits, 3)
>>> scores = list()
>>> for k in range(3):
...     # We use 'list' to copy, in order to 'pop' later on
...     X_train = list(X_folds)
...     X_test  = X_train.pop(k)
...     X_train = np.concatenate(X_train)
...     y_train = list(y_folds)
...     y_test  = y_train.pop(k)
...     y_train = np.concatenate(y_train)
...     scores.append(svc.fit(X_train, y_train).score(X_test, y_test))
>>> print(scores)
[0.93489148580968284, 0.95659432387312182, 0.93989983305509184]
```

これは[KFold](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold)のクロスバリデーションと呼ばれます。

## クロスバリデーションジェネレータ

scikit-learnには、一般的なクロスバリデーション戦略の訓練/テストのインデックスのリストを生成するために使用できるクラスのコレクションがあります。
彼らは分割される入力データセットを受け入れ、選択された相互検証戦略の反復ごとにトレイン/テストセットインデックスを生成する `split` メソッドを公開する。
この例は、`split`メソッドの使用例を示しています。

```python
>>> from sklearn.model_selection import KFold, cross_val_score
>>> X = ["a", "a", "b", "c", "c", "c"]
>>> k_fold = KFold(n_splits=3)
>>> for train_indices, test_indices in k_fold.split(X):
...      print('Train: %s | test: %s' % (train_indices, test_indices))
Train: [2 3 4 5] | test: [0 1]
Train: [0 1 4 5] | test: [2 3]
Train: [0 1 2 3] | test: [4 5]
```

クロスバリデーションは簡単に実行できます。

```python
>>> kfold = KFold(n_splits=3)
>>> [svc.fit(X_digits[train], y_digits[train]).score(X_digits[test], y_digits[test])
...          for train, test in k_fold.split(X_digits)]
[0.93489148580968284, 0.95659432387312182, 0.93989983305509184]
```

クロスバリデーションスコアは、 [cross_val_score](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score) ヘルパーを使用して直接計算できます。クロスバリデーションオブジェクトと入力データセットの見積もりが与えられると、 cross_val_score はデータをトレーニングセットとテストセットに繰り返し分割し、トレーニングセットを使用して見積もりを訓練し、クロスバリデーション集計の繰り返しごとにテストセットに基づいてスコアを計算します。
デフォルトでは、推定器の `score` メソッドが個々のスコアを計算するために使用されます。
使用可能なスコアリング方法の詳細については、[メトリックモジュール](http://scikit-learn.org/stable/modules/metrics.html#metrics) を参照してください。

```
>>> cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1)
array([ 0.93489149,  0.95659432,  0.93989983])
```

`n_jobs = -1` は、コンピュータのすべてのCPU上で計算がディスパッチされることを意味します。
あるいは、`scoring` 引数を提供して、別のスコアリング方法を指定することもできます。

```
>>> cross_val_score(svc, X_digits, y_digits, cv=k_fold,
...                 scoring='precision_macro')
array([ 0.93969761,  0.95911415,  0.94041254])
```

### 相互検証ジェネレータ

  - KFold (n_splits, shuffle, random_state)
    - K分割し、K-1で訓練し、残りでテストします。
  - StratifiedKFold (n_iter, test_size, train_size, random_state)
    - K-Foldと同じですが、分割(fold)内のクラス分布を保持します。
  - GroupKFold (n_splits, shuffle, random_state)
    - 同じグループがテストセットとトレーニングセットの両方にないことを保証します。
  - ShuffleSplit (n_iter, test_size, train_size, random_state)
    - ランダム置換に基づいて訓練/テスト指数を生成する。
  - StratifiedShuffleSplit
    - シャッフル分割と同じですが、各反復内でクラスの分布を保持します。
  - GroupShuffleSplit
    - 同じグループがテストセットとトレーニングセットの両方にないことを保証します。
  - LeaveOneGroupOut ()
    - 観測値をグループ化するグループ配列をとります。
  - LeavePGroupsOut (p)
    - Pグループはそのままにしておきます。
  - LeaveOneOut ()
    - 一つの観察を残しておきなさい。
  - LeavePOut(p)
    - Pの観測値をそのまま残す。
  - PredefinedSplit
    - 事前に定義された分割に基づいて訓練/テストを生成します。

### エクセサイズ

![](http://scikit-learn.org/stable/_images/sphx_glr_plot_cv_digits_001.png)

digit のデータセットで、パラメータ `C` の関数として線形カーネルを使用したSVC推定値のクロスバリデーションスコアをプロットします（ポイントの対数グリッドを1から10まで使用します）。

```python
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn import datasets, svm

digits = datasets.load_digits()
X = digits.data
y = digits.target

svc = svm.SVC(kernel='linear')
C_s = np.logspace(-10, 0, 10)
```

[答えはこちら：Digits Dataset Exerciseでのクロスバリデーション](http://scikit-learn.org/stable/auto_examples/exercises/plot_cv_digits.html#sphx-glr-auto-examples-exercises-plot-cv-digits-py)

## グリッド検索とクロスバリデーションされた推定器

### グリッド検索

scikit-learnは、与えられたデータが、パラメータグリッド上の推定器の fit 中にスコアを計算し、クロスバリデーションスコアを最大にするパラメータを選択するオブジェクトを提供します。このオブジェクトは、構築中に推定を行い、推定器のAPIを公開します。

```python
>>> from sklearn.model_selection import GridSearchCV, cross_val_score
>>> Cs = np.logspace(-6, -1, 10)
>>> clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs),
...                    n_jobs=-1)
>>> clf.fit(X_digits[:1000], y_digits[:1000])        
GridSearchCV(cv=None,...
>>> clf.best_score_                                  
0.925...
>>> clf.best_estimator_.C                            
0.0077...

>>> # テストセットの予測性能は訓練セットほど良くない
>>> clf.score(X_digits[1000:], y_digits[1000:])      
0.943...
```

デフォルトでは、 [GridSearchCV](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV) は3倍の相互検証を使用します。しかし、回帰分析ではなく、分類が渡されたことが検出された場合は、層別3倍を使用します。

#### ネストされた相互検証

```python
>>> cross_val_score(clf, X_digits, y_digits)
...                                               
array([ 0.938...,  0.963...,  0.944...])
```

2つの相互検証ループが並行して実行されます.1つはGridSearchCVエスティメータでガンマを設定し、もう1つはcross_val_scoreで評価器の予測パフォーマンスを測定します。得られたスコアは、新しいデータに対する予測スコアの不偏推定値である。

#### 警告

並列計算（`n_jobs` が1以外）でオブジェクトをネストすることはできません。

### クロスバリデーションされた推定器

パラメータを設定するための相互検証は、アルゴリズムごとに効率的に行うことができます。
これは、特定の推定器では、scikit-learnは、クロスバリデーションによってパラメータを自動的に設定する「[クロス検証：推定器のパフォーマンスの評価](http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation)」推定器を公開します。

```python
>>> from sklearn import linear_model, datasets
>>> lasso = linear_model.LassoCV()
>>> diabetes = datasets.load_diabetes()
>>> X_diabetes = diabetes.data
>>> y_diabetes = diabetes.target
>>> lasso.fit(X_diabetes, y_diabetes)
LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,
    max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,
    precompute='auto', random_state=None, selection='cyclic', tol=0.0001,
    verbose=False)
>>> # The estimator chose automatically its lambda:
>>> lasso.alpha_ 
0.01229...
```

これらの見積もり者は、その名前に「CV」が付加されたものと同様に呼び出されます。


#### エクセサイズ

糖尿病データセットでは、最適な正則化パラメータ `alpha` を見つける。

**ボーナス：** あなたは alpha の選択をどれくらい信用できますか？

```python
from sklearn import datasets
from sklearn.linear_model import LassoCV
from sklearn.linear_model import Lasso
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

diabetes = datasets.load_diabetes()
```

[回答はこちら：糖尿病のデータセット運動の相互認証](http://scikit-learn.org/stable/auto_examples/exercises/plot_cv_diabetes.html#sphx-glr-auto-examples-exercises-plot-cv-diabetes-py)

----
[次のページ](http://qiita.com/nazoking@github/items/34c53758f79eae233b67)

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