はじめに
機械学習において、モデル選択とは、与えられたデータセットに最適なモデルを選ぶプロセスです。これには、適切な推定器を選択し、そのパラメータを調整して最適な性能を達成することが含まれます。このチュートリアルでは、scikit-learn におけるモデル選択のプロセスを案内します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
スコアと交差検証スコア
scikit-learn の推定器は、新しいデータに対するモデルの適合度または予測の品質を評価するために使用できる score メソッドを公開しています。このメソッドはスコアを返し、値が高いほど性能が良いことを示します。
from sklearn import datasets, svm
## 手書き数字のデータセットを読み込む
X_digits, y_digits = datasets.load_digits(return_X_y=True)
## 線形カーネルを持つ SVM 分類器を作成する
svc = svm.SVC(C=1, kernel='linear')
## 分類器を学習データに適合させ、テストデータでのスコアを計算する
score = svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])
予測精度のより良い尺度を得るために、交差検証を使用できます。交差検証では、データを複数のフォールドに分割し、各フォールドをテストセットとして、残りのフォールドを学習セットとして使用します。このプロセスを複数回繰り返し、スコアを平均化して全体的な性能を得ます。
import numpy as np
## データを 3 つのフォールドに分割する
X_folds = np.array_split(X_digits, 3)
y_folds = np.array_split(y_digits, 3)
## 交差検証を実行する
scores = []
for k in range(3):
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)
交差検証ジェネレータ
Scikit-learn は、一般的な交差検証戦略のための学習用/テスト用インデックスを生成するために使用できるクラスのコレクションを提供しています。これらのクラスには、入力データセットを受け取り、交差検証プロセスの各反復に対する学習用/テスト用セットのインデックスを生成する split メソッドがあります。
from sklearn.model_selection import KFold
## KFold 交差検証を使用してデータを K 分割する
k_fold = KFold(n_splits=5)
for train_indices, test_indices in k_fold.split(X_digits):
print(f'Train: {train_indices} | test: {test_indices}')
cross_val_score ヘルパー関数を使用すると、交差検証スコアを直接計算できます。これは、交差検証の各反復でデータを学習用とテスト用に分割し、学習用セットで推定器を学習させ、テスト用セットに基づいてスコアを計算します。
from sklearn.model_selection import cross_val_score
## SVM 分類器の交差検証スコアを計算する
scores = cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1)
print(scores)
グリッドサーチ
グリッドサーチは、推定器のパラメータ値の最適な組み合わせを見つけるために使用できる手法です。これには、パラメータ値のグリッドを指定し、各パラメータの組み合わせに対して学習データに推定器を適合させ、最も高い交差検証スコアをもたらすパラメータを選択することが含まれます。
from sklearn.model_selection import GridSearchCV
## パラメータ値のグリッドを定義する
Cs = np.logspace(-6, -1, 10)
## SVM 分類器とパラメータグリッドを持つ GridSearchCV オブジェクトを作成する
clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs), n_jobs=-1)
## GridSearchCV オブジェクトを学習データに適合させる
clf.fit(X_digits[:1000], y_digits[:1000])
print(clf.best_score_)
print(clf.best_estimator_.C)
交差検証付き推定器
scikit-learn の一部の推定器には、組み込みの交差検証機能があります。これらの交差検証付き推定器は、交差検証によって自動的にパラメータを選択し、モデル選択プロセスをより効率的にします。
from sklearn import linear_model, datasets
## LassoCV オブジェクトを作成する
lasso = linear_model.LassoCV()
## 糖尿病データセットを読み込む
X_diabetes, y_diabetes = datasets.load_diabetes(return_X_y=True)
## LassoCV オブジェクトをデータセットに適合させる
lasso.fit(X_diabetes, y_diabetes)
print(lasso.alpha_)
まとめ
このチュートリアルでは、scikit-learn におけるモデル選択のプロセスについて学びました。スコア付け方法、交差検証、グリッドサーチ、および交差検証付き推定器を検討しました。これらの手順に従うことで、与えられたデータセットに対して最適な推定器を選択し、そのパラメータを調整して最適な性能を達成することができます。