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を使って最適なハイパーパラメーターを探索するコード
からの記事と詳細 ( Kaggleで学ぶ、Optunaによるハイパラ自動チューニング - ITmedia )
https://ift.tt/3phrYJ5
No comments:
Post a Comment