見出し画像

Kaggle パラメータ最適化をChatGPTにお願いしてみた

LightGBMのパラメータ最適化について、ChatGPTに聞きながら確認中です。
ChatGPTに予測モデルの概要を説明すると、ほぼそのままコピペで使える最適化のコードを提供してくれました。さらなるチューニングの余地もあるとは思いますが、多少なりともスコアが改善するのは悪くないです。

とても便利な反面、人間が考える余地が減っていくのは少しさみしい気もしますけど。


使用データ:Kaggle Spaceship Titanic

KaggleのSpaceship Titanicコンペティションは、初心者を対象とした常時公開されているコンテストです。メダルや賞金の獲得はありませんが、テーブル形式で提供される扱いやすい学習データを用いて、実践的なデータ分析の問題に気軽に挑戦することができます。

Optunaでハイパーパラメータ最適化

ハイパーパラメータは機械学習モデルの挙動を決定する設定値で、それらを調整することでモデルの精度が変化します。手動で最適化することもできますが、アルゴリズムによる様々な手法もあります。Optunaはそのひとつで、Pythonで書かれたオープンソースのフレームワークです。

LightGBMのパラメータ最適化

OptunaでLightGBM(勾配ブースティング決定木)のハイパーパラメータを最適化するコードをChatGPTが生成してくれました。

import optuna
import lightgbm as lgb
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import StratifiedKFold
import numpy as np


def objective(trial):
    params = {
        'objective': 'binary',
        'metric': 'auc',
        'verbosity': -1,
        'boosting_type': 'gbdt',
        'lambda_l1': trial.suggest_float('lambda_l1', 1e-8, 10.0, log=True),
        'lambda_l2': trial.suggest_float('lambda_l2', 1e-8, 10.0, log=True),
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'feature_fraction': trial.suggest_float('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_float('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
        'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1e-1) 
    }

    splits = 5
    kf = StratifiedKFold(n_splits=splits, shuffle=True, random_state=71)
    auc_scores = []

    for tr_idx, va_idx in kf.split(train_x, train_y):
        tr_x, va_x = train_x.iloc[tr_idx], train_x.iloc[va_idx]
        tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]

        lgb_train = lgb.Dataset(tr_x, tr_y, free_raw_data=False)
        lgb_eval = lgb.Dataset(va_x, va_y, reference=lgb_train, free_raw_data=False)

        model = lgb.train(params, lgb_train, valid_sets=[lgb_train, lgb_eval], verbose_eval=False, num_boost_round=200, early_stopping_rounds=20)
        va_pred = model.predict(va_x, num_iteration=model.best_iteration)
        auc_scores.append(roc_auc_score(va_y, va_pred))

    mean_auc = np.mean(auc_scores)
    return 1.0 - mean_auc  # Optunaは最小化を目指すため、1からAUCスコアを引いています

study = optuna.create_study()
study.optimize(objective, n_trials=10)  # ここでは10試行を実行していますが、適宜変更できます

# 最適化されたパラメータを取得
best_params = study.best_params
print(f'Best parameters: {best_params}')
print(f'Best AUC: {1.0 - study.best_value}')

# 最適化されたパラメータを使ってモデルを訓練するためのパラメータを設定
params = best_params
params['objective'] = 'binary'
params['metric'] = 'auc'
params['verbosity'] = -1
params['boosting_type'] = 'gbdt'

n_trials=10は、最適化プロセスを10回繰り返すことを意味します。この数値を大きくすると、より多くのパラメータの組み合わせを試すことができますが、計算時間も増えます。逆に、この数値を小さくすると、計算は速くなりますが、最適なパラメータを見逃す可能性があります。





この記事が気に入ったらサポートをしてみませんか?