ハイパーパラメータの最適化手法　Optunaとグリッドサーチの比較

# はじめに
超パラメータの最適化は、機械学習モデルの学習において非常に重要です。適切なハイパーパラメータを選択することにより、モデルの性能を最大限に引き出すことができます。本稿では、ハイパーパラメータの最適化手法であるOptunaとグリッドサーチを比較してみます。
# Optunaは
Optunaは、ベイズ最適化を基にしたハイパーパラメータ最適化手法です。Optunaは、各イテレーションで過去の結果に基づいて、より有望なパラメータを選択し、効率的に最適なパラメータを見つけることができます。また、多様なハイパーパラメータの探索空間に対応しており、自動的にパラメータの探索を行うことができます。しかし、探索するパラメータの数が多い場合には、計算コストが高くなる傾向があります。
# グリッドサーチは
一方、グリッドサーチは、指定されたハイパーパラメータの値の組み合わせを全て試す手法です。この手法は単純で理解しやすく、パラメータ探索空間が小さい場合には効果的です。しかし、探索空間が大きい場合には計算コストが膨大になります。また、効率的な探索を行うためには、事前に探索空間を十分に絞り込む必要があります。
#サンプルコード
次に、Optunaとグリッドサーチのそれぞれの手法を示す例を紹介します。

```python:Optuna.py
import optuna
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import lightgbm as lgb

# データセットの読み込み
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 目的関数の定義
def objective(trial):
    param = {
        'objective': 'multiclass',
        'metric': 'multi_logloss',
        'num_class': 3,
        'verbosity': -1,
        'boosting_type': 'gbdt',
        'learning_rate': trial.suggest_float('learning_rate', 1e-3, 0.1, log=True),
        'num_leaves': trial.suggest_int('num_leaves', 2, 50),
        'max_depth': trial.suggest_int('max_depth', 2, 15),
        'min_child_samples': trial.suggest_int('min_child_samples', 1, 20),
        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.6, 1.0),
        'subsample': trial.suggest_float('subsample', 0.6, 1.0),
        'reg_alpha': trial.suggest_float('reg_alpha', 1e-3, 10.0, log=True),
        'reg_lambda': trial.suggest_float('reg_lambda', 1e-3, 10.0, log=True),
    }

    # モデルの学習
    model = lgb.train(param, lgb.Dataset(X_train, label=y_train), 100)
    
    # 予測と評価
    y_pred = model.predict(X_test)
    y_pred = y_pred.argmax(axis=1)
    accuracy = accuracy_score(y_test, y_pred)
    
    return accuracy

# 优化实例を作成
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# 最良のパラメータと精度を取得
best_params = study.best_params
best_accuracy = study.best_value
print("Best Params:", best_params)
print("Best Accuracy:", best_accuracy)

```

```python:グリッドサーチ.py
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from itertools import product

# データセットの読み込み
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# パラメータ探索空間の定義
param_grid = {
    'learning_rate': [0.01, 0.1, 0.5],
    'num_leaves': [10, 20, 30],
    'max_depth': [3, 5, 7],
    'min_child_samples': [10, 20, 30],
    'colsample_bytree': [0.6, 0.8, 1.0],
    'subsample': [0.6, 0.8, 1.0],
    'reg_alpha': [0.1, 1.0, 10.0],
    'reg_lambda': [0.1, 1.0, 10.0]
}

best_accuracy = 0
best_params = None

# グリッドサーチの実行
for params in product(*param_grid.values()):
    param_dict = dict(zip(param_grid.keys(), params))
    
    # モデルの学習
    model = lgb.LGBMClassifier(**param_dict)
    model.fit(X_train, y_train)
    
    # 予測と評価
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    # 最良のパラメータと精度を更新
    if accuracy > best_accuracy:
        best_accuracy = accuracy
        best_params = param_dict

print("Best Params:", best_params)
print("Best Accuracy:", best_accuracy)

```


# 最後に
以上が、Optunaとグリッドサーチを比較した内容となります。それぞれの特徴と適用シーン、実装例を示しました。どちらの手法も一長一短がありますので、具体的なケースに応じて適切な手法を選択することが重要です。