目次
モデリング プロセス全体の中で最も時間のかかる部分は特徴量エンジニアリング (変数分析を含む) で、次にパラメーター調整が続きます。そのため、今日は、コードの練習を通じてパラメーター調整の関連する方法であるグリッド サーチとベイジアン パラメーター調整を紹介します。
1. 相互検証
仕事で最も一般的に使用されるトレーニング セットとテスト セットの分割方法は、主にランダム比率分割と (層別) 交差検証です。ランダム比率分割では、7-3、8-2、8-2 の比率に従ってトレーニング セットとテスト セットを分割できます。ただし、このようなデータ分割にはある程度のランダム性があるため、相互検証を使用するほど厳密ではありません。
1. パッケージをガイドし、初期パラメータを設定します
# 导包
import re
import os
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve,roc_auc_score
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
import matplotlib.pyplot as plt
import gc
from sklearn import metrics
from sklearn.model_selection import cross_val_predict,cross_validate
# 设定xgb参数
params={
'objective':'binary:logistic'
,'eval_metric':'auc'
,'n_estimators':500
,'eta':0.03
,'max_depth':3
,'min_child_weight':100
,'scale_pos_weight':1
,'gamma':5
,'reg_alpha':10
,'reg_lambda':10
,'subsample':0.7
,'colsample_bytree':0.7
,'seed':123
}
2. モデル オブジェクト、5 分割相互検証を初期化します。相互検証関数cross_validate は複数のターゲットを設定できます (ここでは AUC を使用します)。ただし、cross_val_score は 1 つのターゲットのみを設定できます。
xgb = XGBClassifier(**params)
scoring=['roc_auc']
scores=cross_validate(xgb,df[col_list],df.y,cv=5,scoring=scoring,return_train_score=True )
scores
3. Xgb および lgb のネイティブ インターフェイスは、組み込みの cv 関数で使用できます。
xgb.cv(params,df,num_boost_round=10,nfold=5,stratified=True,metrics='auc' ,as_pandas=True)
2. グリッド検索
すべてのパラメータの組み合わせを調べて、テスト セットに最も効果のあるパラメータ グループを見つけます。
1. 調整パラメータと範囲を設定し、グリッド検索を使用する
from sklearn.model_selection import GridSearchCV
train=df_train.head(60000)
test=df_train.tail(10000)
param_value_dics={
'n_estimators':range(100,900,500),
'eta':np.arange(0.02,0.2,0.1),
'max_depth':range(3,5,1),
# 'num_leaves':range(10,30,10),
# 'min_child_weight':range(300,1500,500),
}
xgb_model=XGBClassifier(**params)
clf=GridSearchCV(xgb_model,param_value_dics,scoring='roc_auc',n_jobs=-1,cv=5,return_train_score=True)
clf.fit(df[col_list], df.y)
2. 最適なパラメータを返す
clf.best_params_
3. 最適なパラメータを備えたモデルを返す
clf.best_estimator_
4. 最適パラメータ(ここで設定したAUC)の下でテストセット評価指数を返します。
clf.best_score_
グリッドサーチは、設定されたパラメータ範囲を大域的に横断して最適なパラメータ、つまり大域最適解を見つけますが、このような計算量ではプログラムの実行速度が非常に遅くなり、テストセットの最適化がグリッドサーチの目的となります。この種の目標の下でのパラメータ調整トレーニングではオーバーフィッティングのリスクが依然として存在しますが、これらの問題に対処するために、ベイズ最適化パラメータ調整が利用可能です。
3. ベイズ最適化
ベイジアンパラメータ調整は目的関数をカスタマイズする必要があり、実際の状況に応じて柔軟に選択でき、実行速度が速く、実行中に現在の各パラメータのモデル結果を表示できるため、非常に便利な手法です。
1. ガイドパッケージ
from bayes_opt import BayesianOptimization
import warnings
warnings.filterwarnings("ignore")
from sklearn import metrics
from sklearn.model_selection import cross_val_predict,cross_validate
from xgboost import XGBClassifier
2. パラメータ調整目標のカスタマイズ ここでは、cv で設定されたテストの AUC 平均値がパラメータ調整目標として使用されます。
def xgb_cv(n_estimators,max_depth,eta,subsample,colsample_bytree):
params={
'objective':'binary:logistic',
'eval_metric':'auc',
'n_estimators':10,
'eta':0.03,
'max_depth':3,
'min_child_weight':100,
'scale_pos_weight':1,
'gamma':5,
'reg_alpha':10,
'reg_lambda':10,
'subsample':0.7,
'colsample_bytree':0.7,
'seed':123,
}
params.update({'n_estimators':int(n_estimators),'max_depth':int(max_depth),'eta':eta,'sub sample':subsample,'colsample_bytree':colsample_bytree})
model=XGBClassifier(**params)
cv_result=cross_validate(model,df_train.head(10000)[col_list],df_train.head(10000).y, cv=5,scoring='roc_auc',return_train_score=True)
return cv_result.get('test_score').mean()
3. パラメータ調整範囲を設定します。数値範囲の固定形式に注意してください: (左、右)。ベイジアン パラメータ調整では、この範囲内の実数点がランダムに選択されます。n_estimators や max_ Depth などのパラメータの場合、結果は次のようになります。浮動小数点であるため、これらのパラメータはモデル部分で整数に変換する必要があります: int(n_estimators)
param_value_dics={
'n_estimators':(100, 500),
'max_depth':(3, 6),
'eta':(0.02,0.2),
'subsample':(0.6, 1.0),
'colsample_bytree':(0.6, 1.0)
}
4. ベイジアンパラメータ調整オブジェクトを作成し、20 回繰り返します
lgb_bo = BayesianOptimization(
xgb_cv,
param_value_dics
)
lgb_bo.maximize(init_points=1,n_iter=20) #init_points-调参基准点,n_iter-迭代次数
5. 最適なパラメータの結果を確認する
lgb_bo.max
6. すべてのパラメータ調整結果を表示する
lgb_bo.res
7. すべてのパラメータ調整結果を DataFrame に変換し、簡単に観察および表示できるようにします。
result=pd.DataFrame([res.get('params') for res in lgb_bo.res])
result['target']=[res.get('target') for res in lgb_bo.res]
result[['max_depth','n_estimators']]=result[['max_depth','n_estimators']].astype('int')
result
8. 現在のパラメータ調整の結果に基づいて、設定を再度調整したり、パラメータ範囲を変更してパラメータをさらに調整したりできます。
lgb_bo.set_bounds({'n_estimators':(400, 450)})
lgb_bo.maximize(init_points=1,n_iter=20)
さらに詳しい知識とコード共有については、パブリック アカウントの Python リスク管理モデルとデータ分析に従ってください。