티스토리 뷰
반응형
from catboost import CatBoostRegressor
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from sklearn.model_selection import cross_val_score
# 하이퍼파라미터 검색 공간 정의
space = {
'depth': hp.quniform('depth', 3, 16, 1),
'learning_rate': hp.loguniform('learning_rate', -5, -0.5),
'l2_leaf_reg': hp.loguniform('l2_leaf_reg', -16, -1),
'max_bin': hp.quniform('max_bin', 16, 512, 1),
'one_hot_max_size': hp.quniform('one_hot_max_size', 0, 500, 1),
'random_strength': hp.uniform('random_strength', 0, 100),
'bagging_temperature': hp.uniform('bagging_temperature', 0, 1),
'min_data_in_leaf': hp.quniform('min_data_in_leaf', 1, 200, 1),
}
# 목적 함수 정의
def objective(params):
model = CatBoostRegressor(
depth=int(params['depth']),
learning_rate=params['learning_rate'],
l2_leaf_reg=params['l2_leaf_reg'],
max_bin=int(params['max_bin']),
one_hot_max_size=int(params['one_hot_max_size']),
random_strength=params['random_strength'],
bagging_temperature=params['bagging_temperature'],
min_data_in_leaf=int(params['min_data_in_leaf']),
verbose=0
)
score = -cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error').mean()
return {'loss': score, 'status': STATUS_OK}
# 베이지안 최적화 실행
trials = Trials()
best = fmin(objective, space, algo=tpe.suggest, max_evals=100, trials=trials)
# 최적 하이퍼파라미터 출력
print('Best Parameters: ', best)
해당 파라미터로 다시 학습하려면 다음과 같이.
from catboost import CatBoostRegressor
# 최적 하이퍼파라미터 조합
best_params = {
'depth': 10,
'learning_rate': 0.01,
'l2_leaf_reg': 3,
'max_bin': 256,
'one_hot_max_size': 100,
'random_strength': 50,
'bagging_temperature': 0.3,
'min_data_in_leaf': 20
}
# 모델 생성 및 학습
model = CatBoostRegressor(
depth=best_params['depth'],
learning_rate=best_params['learning_rate'],
l2_leaf_reg=best_params['l2_leaf_reg'],
max_bin=best_params['max_bin'],
one_hot_max_size=best_params['one_hot_max_size'],
random_strength=best_params['random_strength'],
bagging_temperature=best_params['bagging_temperature'],
min_data_in_leaf=best_params['min_data_in_leaf'],
verbose=0
)
model.fit(X_train, y_train)
optuna도 가능
import optuna
from catboost import CatBoostRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# Objective 함수 정의
def objective(trial):
# 하이퍼파라미터 탐색 공간 정의
params = {
'depth': trial.suggest_int('depth', 5, 16),
'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 0.1),
'l2_leaf_reg': trial.suggest_loguniform('l2_leaf_reg', 1e-16, 1e-1),
'max_bin': trial.suggest_int('max_bin', 16, 512),
'one_hot_max_size': trial.suggest_int('one_hot_max_size', 0, 500),
'random_strength': trial.suggest_uniform('random_strength', 0, 100),
'bagging_temperature': trial.suggest_uniform('bagging_temperature', 0, 1),
'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 1, 200),
}
# 모델 초기화
model = CatBoostRegressor(**params, verbose=0)
# 모델 훈련
model.fit(x_train, y_train)
# 검증 데이터에 대한 예측
preds = model.predict(x_val)
# 손실 계산
rmse = mean_squared_error(y_val, preds, squared=False)
return rmse
# 데이터 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=0.2, random_state=42)
# Optuna 최적화
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)
# 최적의 하이퍼파라미터 출력
best_params = study.best_params
print('Best Parameters:', best_params)
# 최적의 하이퍼파라미터를 사용하여 모델 초기화
best_model = CatBoostRegressor(**best_params, verbose=0)
# 모델 훈련
best_model.fit(x_train, y_train)
# 테스트 데이터에 대한 예측
test_preds = best_model.predict(x_test)
반응형