ランダムフォレストのパラメータをチューニング
rf_model
RandomForestClassifier (random_state=0)
ランダムフォレストで今回チューニングするパラメータ
max_depth
: 決定木の深さの最大値n_estimators
: 多数決を行う決定木の数
params= {
'max_depth' :[2,5,10],
'n_estimators':np.linspace(10,100,5, dtype='int')
}
np.linspaceについてnumpy.linspace()
も等差数列を生成するが、間隔(公差)ではなく要素数を指定する。第一引数start
に最初の値、第二引数stop
に最後の値、第三引数num
に要素数を指定する。
print(np.linspace(0, 10, 3))
# [ 0. 5. 10.]
チューニングにはGridSearchCV()を使用¶
引数はそれぞれ、
- 第1引数に機械学習モデルを指定
param_grid
でチューニングするパラメータ名と範囲が入った辞書型orリスト型を指定cv
でチューニングで最適なパラメータを見つけるための交差検証の回数を指定scoring
でチューニング時に評価する指標を指定(今回はf値
を指定)
grid_rf_model = GridSearchCV(
RandomForestClassifier(random_state=0), 機械学習モデル
param_grid=params, チューニングする辞書
cv=5, CVの回数
scoring = 'f1' 指標
n_jobs=-1 n_jobsはタスクを何分割するかという指定をする部分。-1でコア数をマ
ックスで使うように計らってくれます。
)
grid_fr_model.fit(x_train, y_train)
GridSearchCV(cv=5, estimator=RandomForestClassifier(random_state=0), n_jobs=-1, param_grid={'max_depth': [2, 5, 10], 'n_estimators': array([ 10, 32, 55, 77, 100])}, scoring='f1')
f値
に基づいた最適なモデル
grid_rf_model.best_estimator_
RandomForestClassifier(max_depth=10, n_estimators=10, random_state=0)
モデルの保存
with open('grid_rf_model.pkl', mode='wb') as f:
pickle.dump(grid_rf_model.best_estimator_, f)
XGBのパラメータをチューニング
xgb_model
XGBClassifier(base_score=0.5, booster='gbtree', callbacks=None, colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1, early_stopping_rounds=None, enable_categorical=False, eval_metric=None, gamma=0, gpu_id=-1, grow_policy='depthwise', importance_type=None, interaction_constraints='', learning_rate=0.300000012, max_bin=256, max_cat_to_onehot=4, max_delta_step=0, max_depth=6, max_leaves=0, min_child_weight=1, missing=nan, monotone_constraints='()', n_estimators=100, n_jobs=0, num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0, reg_lambda=1, ...)
XGBで今回チューニングするパラメータ
max_depth
: 決定木の深さの最大値min_child_weight
: 決定木の葉の重みの下限gamma
: 決定木の葉の追加による損失減少の下限subsample
: 各決定木においてランダムに抽出される標本(データ)の割合colsample_bytree
: 各決定木においてランダムに抽出される列の割合
gridParams= {
'max_depth':[3,6,8,10],
'min_child_weight': [1,5,10]
'gamma':[0.5,1,1.5,2,5]
'subsample':[0.6,0.8,1.0],
'colsample_bytree':[0.6,0.8,1.0],
}
early_stoppingパラメータ
early_stopping_rounds
: 損失減少しない場合の学習打ち切りのラウンド数eval_set
: 評価するデータセット
fitParams = {'early_stopping_rounds':10,
'eval_set':[[x_test, y_test]]}
grid_xgb_model = GridSearchCV(
xgb.XGBClassifier(random_state=0),
param_grid=gridParams,
cv=5,
scoring='f1',
n_jobs=-1
)
grid_xgb_model.fit(
x_train,
y_train,
**fitParams,
verbose=2)
[0] validation_0-logloss:0.59234 [2] validation_0-logloss:0.49255 [4] validation_0-logloss:0.45351 [6] validation_0-logloss:0.44101 [8] validation_0-logloss:0.43809 [10] validation_0-logloss:0.43891 [12] validation_0-logloss:0.43864 [14] validation_0-logloss:0.43950 [16] validation_0-logloss:0.44204 [18] validation_0-logloss:0.44149 [20] validation_0-logloss:0.43812 [22] validation_0-logloss:0.44352 [23] validation_0-logloss:0.44228
GridSearchCV(cv=5, estimator=XGBClassifier(base_score=None, booster=None, callbacks=None, colsample_bylevel=None, colsample_bynode=None, colsample_bytree=None, early_stopping_rounds=None, enable_categorical=False, eval_metric=None, gamma=None, gpu_id=None, grow_policy=None, importance_type=None, interaction_constraints=None, learning_rate=None, max_bin=None, max_ca... max_leaves=None, min_child_weight=None, missing=nan, monotone_constraints=None, n_estimators=100, n_jobs=None, num_parallel_tree=None, predictor=None, random_state=0, reg_alpha=None, reg_lambda=None, ...), n_jobs=-1, param_grid={'colsample_bytree': [0.6, 0.8, 1.0], 'gamma': [0.5, 1, 1.5, 2, 5], 'max_depth': [3, 6, 8, 10], 'min_child_weight': [1, 5, 10], 'subsample': [0.6, 0.8, 1.0]}, scoring='f1')
f値
に基づいた最適なモデル
grid_xgb_model.best_estimator_
XGBClassifier(base_score=0.5, booster='gbtree', callbacks=None, colsample_bylevel=1, colsample_bynode=1, colsample_bytree=0.6, early_stopping_rounds=None, enable_categorical=False, eval_metric=None, gamma=1.5, gpu_id=-1, grow_policy='depthwise', importance_type=None, interaction_constraints='', learning_rate=0.300000012, max_bin=256, max_cat_to_onehot=4, max_delta_step=0, max_depth=6, max_leaves=0, min_child_weight=10, missing=nan, monotone_constraints='()', n_estimators=100, n_jobs=0, num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0, reg_lambda=1, ...)
モデルの保存
with open ('grid_xgb_model.pkl', mode='wb') as f:
pickle.dump(grid_xgb_model.best_estimator_,f)
pickle.dumpでファイルに書き込み
予想
ランダムフォレストで予測
with open('grid_rf_model.pkl', mode='rb') as f:
rf_best_model=pickle.load(f)
pickle.load(f)でロード
rf_pred=rf_best_model.predict(x_test)
rf_best_model.score(x_test, y_test)
0.788
accuracy_score(y_test, rf_pred)
0.788
f1_score(y_test, rf_pred)
0.273972602739726
fpr, tpr, thresholds = roc_curve(y_test, rf_pred)
fpr, tpr, thresholds
(array([0. , 0.04591837, 1. ]), array([0. , 0.18518519, 1. ]), array([2, 1, 0], dtype=int64))
auc = roc_auc_score(y_test, rf_pred)
auc
0.5696334089191232
plt.plot(fpr, tpr, label='ROC curve (area = %2f)' % auc) 2f 小数点2桁まで
plt.legend()
plt.title('ROC curve')
plt.xlabel('False positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
XGBで予測
with open('grid_xgb_model.pkl', mode ='rb') as f:
xgb_best_model = pickel.load(f)
xgb_pred= xgb_best_model.predict(x_test)
xgb_best_model.score(x_test, y_test)
0.812
accuracy_score(y_test, xgb_pred)
0.812
f1_score(y_test, xgb_pred)
0.37333333333333335
fpr , tpr, thresholds = roc_curve(y_test, xgb_pred)
fpr, tpr, thresholds
(array([0. , 0.03571429, 1. ]), array([0. , 0.25925926, 1. ]), array([2, 1, 0]))
auc = roc_aus_score(y_test, xgb_pred)
auc
0.6117724867724869
plt.plot(fpr , tpr, label ='ROC curve (area = % 2f)' %auc)
plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
コメント