[Python] Catboost Bayesian Optimization
2019. 6. 1. 18:22ㆍML(머신러닝)/Optimization
최근에 Tree based 모델을 좀 보고 있는데, Python에서 categorical 변수를 One-hot을 하지 않고 하는 알고리즘은
현재, lightgbm과 catboost인 것 같다.
개인적으로 원핫을 안 좋아해서 인지, xgboost는 별로 하기가 싫다.
물론 tree-based model이라서 다차원으로 갔을 때의 고민이 좀 없겠지만,
현재 데이터중에 날짜 데이터도 있는데.. 이것을 onehot 하면 너무 Sparse하지 않겠는가...............
그래서 나는 여기선 catboost를 parameter tuning을 해보려고 한다.
https://data-newbie.tistory.com/131 이전에 간략하게 논문리뷰를 해봤다.
Catboost는 Parameter를 대충한다해도, 잘 나온다고 하지만,
그래도 역시 조금이라도 올리기 위해서는 Parameter tuning은 필요하고,
나는 그 중에서도 너무 랜덤 하게랑 grid별로 하고 싶지 않아서
Bayesian Optimization으로 해결하고자하고 코드를 구현했다.
지금은 인터넷에서 찾아봐도 없어서 해보긴 했는데, 음 없는 이유는 굳이 그럴 필요가 없어서 안 하는 건가....ㅠ
def catboost_eval(bagging_temperature ,
depth ,
learning_rate ,
min_data_in_leaf ,
max_leaves ,
l2_leaf_reg ,
border_count):
n_splits=5
skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=RANDOM_STATE)
f1 = []
predict = None
params = {}
params['iterations'] = 1000
params['custom_loss'] = 'TotalF1'
params['eval_metric'] = 'TotalF1'
params['random_seed'] = 1234
params['learning_rate'] = learning_rate
params['min_data_in_leaf'] = int(round(min_data_in_leaf))
params['depth'] = int(round(depth))
#params['max_leaves'] = int(round(max_leaves))
#params['l2_leaf_reg'] = int(round(l2_leaf_reg))
params['border_count'] = int(round(border_count))
params['bagging_temperature'] = int(round(bagging_temperature))
X , y = catX_train.values , caty_train
for tr_ind, val_ind in skf.split(X , y):
X_train = X[tr_ind]
y_train = y[tr_ind]
X_valid = X[val_ind]
y_valid = y[val_ind]
## https://catboost.ai/docs/concepts/python-reference_catboost_eval-metrics.html
clf = CatBoostClassifier(**params ,
task_type = "GPU" ,
leaf_estimation_iterations = 10,
use_best_model=True,
od_type="Iter",
logging_level='Silent',
)
clf.fit(X_train,
y_train,
cat_features=cat_features,
eval_set=(X_valid, y_valid),
verbose = False ,
)
y_pred = clf.predict(X_valid)
f1_value = f1_score(y_valid.astype(int) ,
y_pred.astype(int) ,
average='weighted')
f1.append(f1_value)
return sum(f1)/n_splits
## min_data_in_leaf , max_leaves , 추가 하니 먼가 잘 안됨.
catBO = BayesianOptimization(catboost_eval,
{'bagging_temperature': (0, 1000),
'depth': (5, 8.99) ,
"learning_rate" : (0.001,0.1) ,
"min_data_in_leaf" : (1,6) ,
'max_leaves' : (200,200) ,
'l2_leaf_reg': (100, 100) ,
'border_count': (5, 255) ,
},
random_state=0)
init_round=5
opt_round = 10
catBO.maximize(init_points=init_round, n_iter=opt_round)
### 변수 중요도 시각화
import seaborn as sns
sns.set(rc={'figure.figsize':(11.7,8.27)})
cat_feature_imp = pd.DataFrame([CatBoost.feature_names_ , CatBoost.feature_importances_]).T
cat_feature_imp.columns = ["feature","varimp"]
cat_feature_imp = cat_feature_imp.sort_values(by="varimp", ascending = False)
sns.barplot(y="feature", x="varimp",data = cat_feature_imp, )
plt.show()
## 2019.08.02
누군가 미디엄에 부스팅 기반으로 올려줬다.
728x90
'ML(머신러닝) > Optimization' 카테고리의 다른 글
Differentiable Convex Optimization Layers (0) | 2019.11.17 |
---|---|
Optuna: A Next-generation Hyperparameter Optimization Framework (0) | 2019.11.17 |
[ Python ] Neural Network의 적당한 구조와 hyperparameter 찾는 방법 (0) | 2019.09.08 |
[Python] Lightgbm Bayesian Optimization (0) | 2019.06.01 |
sklearn - skopt Bayesian Optimization (0) | 2019.05.31 |