機械学習モデルの精度を引き出すハイパーパラメータチューニング。 GridSearch / RandomSearch / Bayesian の使い分け。
モデルってデフォルト設定でも動くけどさ、ハイパラ調整すると精度ってどれくらい変わるの?
5〜20%くらい精度が上がることも珍しくないのよ。 ハイパーパラメータチューニングは実務でもとても重要なステップということね。
代表的な手法は3つで、(1)GridSearchは全組合せを試す、(2)RandomSearchはランダムに選んで試す、(3)ベイズ最適化は過去の試行から次を予測する、という方式ですね。
まずは GridSearch から覚えればいいんですかぁ?
そうですね、まずはGridSearchCVが基本です。 候補値をリスト化して、全組合せを交差検証付きで評価します。 ただし候補が多いと組合せ爆発で時間がかかってしまうんです。
RandomSearch のメリットってなに?
全組合せを網羅する必要はない、というのが大事な洞察なのよ。 ランダムサンプリングで限られた回数試すだけでも、十分いい結果が得られるの。 候補が多いときに効率的ということね。
ベイズ最適化はOptunaやHyperoptが代表ライブラリ。 過去の評価結果から『次に試すと最も精度が上がりそうな組合せ』を予測する賢い手法。
AutoMLって何ですかぁ?
AutoMLは『前処理〜モデル選択〜ハイパラチューニング』までを自動化する仕組みなのよ。 Google AutoML、AutoGluon、PyCaret などが代表ね。 専門知識がなくても高精度なモデルを作れる流れが進んでいるということね。
DS検定★では『GridSearchは全組合せ』『RandomSearchはランダム』『ベイズ最適化は過去結果から学習』、AutoML=自動化、を押さえれば十分。
実装例見たい!
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
# (1) GridSearch: 全組合せ試行 (3×3=9通り × CV5回=45学習)
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [5, 10, 20],
}
grid = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid,
cv=5,
scoring='f1',
n_jobs=-1,
)
grid.fit(X_train, y_train)
print(f'Best params: {grid.best_params_}')
print(f'Best F1: {grid.best_score_:.3f}')
# (2) Optuna: ベイズ最適化
import optuna
def objective(trial):
n = trial.suggest_int('n_estimators', 50, 500)
d = trial.suggest_int('max_depth', 3, 30)
model = RandomForestClassifier(n_estimators=n, max_depth=d, random_state=42)
return cross_val_score(model, X_train, y_train, cv=5, scoring='f1').mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
確認クイズ
ハイパーパラメータの候補が多い大規模問題で、計算コストを抑えつつ良い精度を引き出すのに最も適した手法はどれか。
- GridSearch (全組合せ網羅)
- RandomSearch または ベイズ最適化
- デフォルト設定のまま
- 手動で1つずつ調整
こたえを見る
正解: 2. RandomSearch または ベイズ最適化
RandomSearch または ベイズ最適化。 候補が多いと GridSearch は組合せ爆発で実用的でなくなります。 RandomSearch はランダムサンプリング、ベイズ最適化(Optuna等)は過去試行から学習し効率的に良い組合せを発見します。