Pages

Tuesday, November 30, 2021

Kaggleで学ぶ、Optunaによるハイパラ自動チューニング - ITmedia

utaksate.blogspot.com

import numpy as np
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
from sklearn.metrics import mean_squared_error
from xgboost import XGBRegressor
import optuna # ハイパーパラメーターのチューニングのため

# 5分割済みの訓練&検証データとテストデータのロード
df_train = pd.read_csv('../input/30days-folds/train_folds.csv')
df_test = pd.read_csv('../input/30-days-of-ml/test.csv')

# 利用する特徴量の選択
useful_features = [c for c in df_train.columns if c not in ('id', 'target', 'kfold')]

# カテゴリ変数の選択
categorical_cols = [c for c in useful_features if df_train[c].dtype == 'object']

# 今回は使わないのでカット
# valid_scores = []
# test_predictions = []

def run(trial):
  # print('Trial Number:', trial.number)
  fold = 0

  # 各ハイパーパラメーターの提案値を取得
  learning_rate = trial.suggest_float('learning_rate', 1e-2, 0.25, log=True)
  reg_lambda = trial.suggest_float('reg_lambda', 1e-8, 100.0)
  reg_alpha = trial.suggest_loguniform('reg_alpha', 1e-8, 100.0)
  subsample = trial.suggest_float('subsample', 0.1, 1.0)
  colsample_bytree = trial.suggest_float('colsample_bytree', 0.1, 1.0)
  max_depth = trial.suggest_int('max_depth', 1, 7)

  # フォールドインデックスに一致するものを検証データとして使う
  X_valid = df_train[df_train.kfold == fold].reset_index(drop=True)

  # フォールドインデックスに一致しないものを訓練データとして使う
  X_train =  df_train[df_train.kfold != fold].reset_index(drop=True)

  # テストデータは使わないのでカット

  # 正解値の教師データ
  y_train = X_train.target
  y_valid = X_valid.target

  # 特徴量の選択
  X_train = X_train[useful_features]
  X_valid = X_valid[useful_features]

  # カテゴリー変数の序数エンコーディング
  ordinal_encoder = OrdinalEncoder()
  X_train[categorical_cols] = ordinal_encoder.fit_transform(X_train[categorical_cols])
  X_valid[categorical_cols] = ordinal_encoder.transform(X_valid[categorical_cols])

  # XGBoostのモデルを訓練(fit)する
  model = XGBRegressor(
    #n_jobs=-1, # CPUを使う場合
    tree_method='gpu_hist', gpu_id=-1, predictor='gpu_predictor', # GPUを使う場合
    random_state=42,
    n_estimators=10000, # 早期停止(Early Stopping)するのでチューニングは不要

    # 定義したチューニング対象を各ハイパーパラメーターの引数に指定
    learning_rate=learning_rate,
    reg_lambda=reg_lambda,
    reg_alpha=reg_alpha,
    subsample=subsample,
    colsample_bytree=colsample_bytree,
    max_depth=max_depth)
  model.fit(
    X_train, y_train,
    early_stopping_rounds=300, # 300回精度が向上しなければ早期停止
    eval_set=[(X_valid, y_valid)], # 早期停止するため検証データも指定
    verbose=1000) # 1000個目のestimatorsごとに出力

  # 検証データをモデルに入力して予測する
  preds_valid = model.predict(X_valid)
  # 検証データの評価スコアを取得し、関数の戻り値として返す
  score_valid = mean_squared_error(y_valid, preds_valid, squared=False)
  return score_valid

study = optuna.create_study(direction='minimize')
study.optimize(run, n_trials=5)

リスト2 Optunaを使って最適なハイパーパラメーターを探索するコード

Adblock test (Why?)


からの記事と詳細 ( Kaggleで学ぶ、Optunaによるハイパラ自動チューニング - ITmedia )
https://ift.tt/3phrYJ5

No comments:

Post a Comment