完全なPipelineの交差検証とグリッドサーチ
Pipelineをcross_val_scoreとGridSearchCVに渡し、二重アンダースコア記法で個々のステップのハイパーパラメータを指定します。
「完全なPipelineの交差検証とグリッドサーチ」はCoddyKit上の無料Machine Learning Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMachine Learning Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Machine Learning Academyコースには全4レッスンが含まれています。
パイプライン全体をグリッドサーチする理由
ハイパーパラメーターの調整は、検証セットへの過学習を防ぐため、必ず交差検証と組み合わせて行う必要があります。前処理ステップにも独自のパラメーター(例: PCA の n_components や OneHotEncoder の drop)がある場合、それらはモデルのパラメーターと同時に調整しなければなりません。すべてを Pipeline にまとめて GridSearchCV に渡すことで、データリークなしにこれらを正しく実行できます。
Pipeline を cross_val_score に渡す
Pipeline を公平に評価する最も簡単な方法は、cross_val_score(pipeline, X, y, cv=5) を使用することです。各分割では、スケーラーや分類器を含むパイプライン全体を学習用部分で再度 fit してから、保持しておいた検証用部分で評価します。返された配列の平均と標準偏差から、信頼性の高い汎化性能の推定値を得られます。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_wine
import numpy as np
X, y = load_wine(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('lr', LogisticRegression(C=1.0, max_iter=300))
])
scores = cross_val_score(pipe, X, y, cv=5, scoring='accuracy')
print(f'CV accuracy: {np.mean(scores):.4f} +/- {np.std(scores):.4f}')パイプラインパラメーターの二重アンダースコア記法
パイプライン内の名前付きステップのパラメーターを参照するには、stepname__paramname を使用します。Pipeline 内の ColumnTransformer のようなネストされた構造では、名前をつなげます。例: preprocessor__num__scaler__with_std。この規則は、set_params の呼び出しと、GridSearchCV に渡す param_grid 辞書の両方で使用されます。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
# Print all tunable parameters
params = pipe.get_params()
for k, v in params.items():
print(f' {k}: {v}')GridSearchCV 用の param_grid の定義
キーをパイプラインのパラメーター名(二重アンダースコア記法を使用)とし、値を試行する候補値のリストとする辞書を作成します。GridSearchCV は、すべてのリストの直積に含まれる各組み合わせについて、パイプラインの学習と評価を行います。fit の総回数は len(combinations) * cv_folds です。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_wine
X, y = load_wine(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {
'svm__C': [0.1, 1.0, 10.0, 100.0],
'svm__kernel': ['rbf', 'linear'],
'svm__gamma': ['scale', 'auto']
}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='accuracy')
grid.fit(X, y)
print('Best params:', grid.best_params_)
print('Best CV score:', grid.best_score_.round(4))前処理パラメーターも調整する
同じグリッドに前処理のパラメーターを含めることもできます。たとえば、分類器の正則化と同時に PCA ステップの n_components を調整できます。これにより、圧縮の度合いとモデルの複雑さを同時に最適化できるため、別々の手順で調整するよりも厳密です。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
X, y = load_digits(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('pca', PCA()),
('lr', LogisticRegression(max_iter=500))
])
param_grid = {
'pca__n_components': [10, 20, 30, 40],
'lr__C': [0.1, 1.0, 10.0]
}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X, y)
print('Best:', grid.best_params_)
print('Score:', grid.best_score_.round(4))GridSearchCV の結果を確認する
cv_results_ 属性は辞書であり、DataFrame に変換できます。すべてのハイパーパラメーターの組み合わせについて、テストスコアの平均、標準偏差、fit にかかった時間が含まれています。この DataFrame を調べると、性能の分布を理解し、最良の結果が2番目に良い結果を大きく上回っているのか、それとも多くのパラメーターの組み合わせが同程度の性能を示しているのかを確認できます。
import pandas as pd
results = pd.DataFrame(grid.cv_results_)
results_sorted = results.sort_values('rank_test_score')
print(results_sorted[['param_pca__n_components', 'param_lr__C',
'mean_test_score', 'std_test_score']].head(6).to_string())大規模なパラメーター空間向けの RandomizedSearchCV
パラメーター空間が大きい場合、GridSearchCV は計算量が大きくなり、現実的でなくなることがあります。RandomizedSearchCV は、n_iter で指定した一定数の組み合わせをランダムにサンプリングします。そのため、通常はわずかな時間でほぼ最適な結果を見つけられます。連続値のパラメーターには、離散的な値ではなく範囲からサンプリングできるよう、scipy.stats の分布を使用します。
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_wine
from scipy.stats import loguniform, uniform
X, y = load_wine(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_dist = {
'svm__C': loguniform(0.01, 100),
'svm__gamma': loguniform(1e-4, 1),
'svm__kernel': ['rbf', 'linear']
}
rs = RandomizedSearchCV(pipe, param_dist, n_iter=30, cv=5, random_state=42, n_jobs=-1)
rs.fit(X, y)
print('Best params:', rs.best_params_)
print('Best score:', rs.best_score_.round(4))ネストされた CV: 評価と選択を同時に行う
交差検証を使った標準的なグリッドサーチでは、検証セットに対してわずかに過学習します。最適なハイパーパラメーターを選んだ時点で、検証データを暗黙的に使用しているためです。ネストされた交差検証ではこの問題を解決できます。外側のループで調整済みモデルの汎化性能を評価し、内側のループでハイパーパラメーターを選択します。外側のループのスコアは、最終モデルの真のテスト性能を偏りなく推定します。
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_iris
import numpy as np
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {'svm__C': [0.1, 1.0, 10.0], 'svm__gamma': ['scale', 'auto']}
inner_cv = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
# Outer CV evaluates the tuning procedure itself
outer_scores = cross_val_score(inner_cv, X, y, cv=5)
print(f'Nested CV score: {np.mean(outer_scores):.4f} +/- {np.std(outer_scores):.4f}')最良の推定器を使用する
GridSearchCV.fit の実行後、best_estimator_ 属性には、最良のハイパーパラメーターを使ってトレーニングデータ全体で再度 fit されたパイプラインが格納されます。最終的な予測にはこのモデルを使用します。これに対して predict、predict_proba、または score を直接呼び出せます。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.datasets import load_wine
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {'svm__C': [0.1, 1.0, 10.0], 'svm__kernel': ['rbf', 'linear']}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train, y_train)
best = grid.best_estimator_
print('Test accuracy:', best.score(X_test, y_test).round(4))GridSearchCV のスコアリングオプション
デフォルトでは、GridSearchCV は推定器のデフォルトスコア(分類器では正解率)を使用します。scoring パラメーターを使えば、'roc_auc'、'f1'、'neg_mean_squared_error'、または make_scorer で作成したカスタムスコアラーなど、任意の指標を指定できます。不均衡データセットでは、単純な正解率よりも 'f1_macro' や 'roc_auc' のほうが適しています。
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
param_grid = {'lr__C': [0.01, 0.1, 1.0, 10.0]}
grid = GridSearchCV(pipe, param_grid, cv=5, scoring='roc_auc', n_jobs=-1)
grid.fit(X, y)
print('Best C:', grid.best_params_)
print('Best ROC-AUC:', grid.best_score_.round(4))最良のパイプラインを保存する
グリッドサーチの後、最良のパイプラインをディスクに保存します。この1つのファイルには、スケーラー(fit 済みの平均と分散)、PCA(成分)、分類器(重み)が含まれており、新しいデータに対する予測を再現するために必要なすべてが揃っています。本番環境で読み込み、predict を直接呼び出せます。
import joblib
# Save the best estimator
joblib.dump(grid.best_estimator_, '/tmp/best_pipeline.pkl')
# Load and verify
loaded = joblib.load('/tmp/best_pipeline.pkl')
print('Loaded pipeline test score:', loaded.score(X_test, y_test).round(4))クイックチェック
このレッスンで学んだ、パイプライン全体に対する交差検証とグリッドサーチの理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、Pipeline に対する cross_val_score は分割ごとにすべてのステップを再度 fit し、正確な汎化性能の推定値を提供すること、二重アンダースコア記法で param_grid 内のネストされたハイパーパラメーターを参照できること、そしてRandomizedSearchCV は一定数のランダムな組み合わせをサンプリングすることで、大規模なパラメーター空間を効率的に探索できることを学びました。次は、joblib を使って本番運用向けのパイプライン全体を保存・読み込みします。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「完全なPipelineの交差検証とグリッドサーチ」レッスンは無料ですか?
はい。「完全なPipelineの交差検証とグリッドサーチ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Machine Learning Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Machine Learning Academyコースには全4レッスンが含まれています。
「完全なPipelineの交差検証とグリッドサーチ」で何を学びますか?
Pipelineをcross_val_scoreとGridSearchCVに渡し、二重アンダースコア記法で個々のステップのハイパーパラメータを指定します。 ブラウザで直接実行するハンズオンコードでMachine Learning Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Machine Learning Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのMachine Learning Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「完全なPipelineの交差検証とグリッドサーチ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このMachine Learning Academyレッスンでコードを書いて実行できますか?
はい。すべてのMachine Learning Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 最初のPipelineを構築する:スケーラーと分類器
- Pipeline内のColumnTransformer
- 完全なPipelineの交差検証とグリッドサーチ
- joblibによるPipelineの保存と読み込み