let us not love with words or tongue but actions and truth.

IT/파이썬

Bayesian optimization

sarah0518 2021. 6. 29. 18:29

오늘은 parameter의 최적값을 찾아보기위한

Bayesian optimization에 대해서 알아보려고 합니다.

 

우선 간단히 Basian optimization에 대한 기본 개념을 설명드릴게요.

 

초기값을 임의로 몇개 찍어서 성능을 비교하고 (아래코드 init_points 참고)

상대적으로 좋은 성능이 발견되는 point에서

반복적으로 더 좋은 성능을 갖는 parameter값을 선택한다고 보시면 될 거같아요.

(너무 심플하게 설명한 것 같은 느낌이지만...)

 

그러면 여기서 말하는 성능은 어떤 것인냐라는 질문을 해보도록 하죠.

 

분석가마다 focusing 하는 성능값이 다를 수 있는데요.

bayesian optimization에서는 최적화 하기위한 function을 미리 설정해주고,

그 값을 최대화 또는 최소화 시키는 parameter를 찾는 것입니다. 

(아래 코드에서 target_opt_fnc를 참고)

 

그럼 이제 코드를 짜볼게요.

 

우선 관련된 library를 불러옵니다.

 

1
2
3
4
5
from bayes_opt import BayesianOptimization
from bayes_opt import UtilityFunction
from sklearn.metrics import f1_score
from sklearn.metrics import recall_score
from sklearn.svm import OneClassSVM
 
utility = UtilityFunction(kind="ucb", kappa=2.5, xi=0.0)
 
cs

 

그 다음 최적화 function을 선언해 줍니다.

 

저는 f1_score와 recall_score의 합을 최대화 시키는 function을 만들었습니다.

1
2
3
4
5
6
# 최적화의 target값을 정의한 function
def target_opt_fnc(nu, gamma):
    target=f1_score(val1['target2'], OneClassSVM(kernel='rbf',nu=nu, gamma=gamma, verbose=True).fit(train1x).predict(val1x))
    +recall_score(val1['target2'], OneClassSVM(kernel='rbf',nu=nu, gamma=gamma, verbose=True).fit(train1x).predict(val1x))
    
    return target
cs

 

 

아래와 같이 f값에 위에 선언한 target function을 넣어주면 됩니다.

1
2
3
4
5
6
7
8
9
10
warnings.filterwarnings(action='ignore', category=UserWarning)
param_bound = {'nu': (0.00000001,0.06),   'gamma': (10,19.9999999)}
 
# f: 최적화 함수 값 
product_optimizer = BayesianOptimization(f=target_opt_fnc, pbounds=param_bound, verbose=2, random_state=1)
 
# init_points: 초기 임의값을 몇 번 선택하게 할지 정하는 값
# n_iter: 임의값 내에서 몇 번 반복할지
product_optimizer.maximize(init_points=80, n_iter=70)
print(product_optimizer.max['target'], product_optimizer.max['params'])
cs

 

그 결과는 아래와 같이 print가 됩니다.

 

보시면 가장 최적의 성능에는 보라색으로 표시됩니다.

빠르게 보라색으로 표시된 것들만 보면서 최적화를 만들어주는 parameter를 찾을 수 있습니다.

 

|   iter    |  target   |   gamma   |    nu     |
-------------------------------------------------
|  1        |  6.588    |  14.17    |  0.04322  |
|  2        |  5.293    |  10.0     |  0.01814  |
|  3        |  5.961    |  11.47    |  0.00554  |
 4        |  6.621    |  11.86    |  0.02073  |
|  5        |  6.602    |  13.97    |  0.03233  |
|  6        |  6.589    |  14.19    |  0.04111  |
|  7        |  6.584    |  12.04    |  0.05269  |
|  8        |  5.935    |  10.27    |  0.04023  |
|  9        |  6.599    |  14.17    |  0.03352  |
|  10       |  5.961    |  11.4     |  0.01189  |
|  11       |  6.563    |  18.01    |  0.0581   |
|  12       |  6.594    |  13.13    |  0.04154  |
|  13       |  6.565    |  18.76    |  0.05368  |
|  14       |  5.295    |  10.85    |  0.002343 |
|  15       |  6.584    |  11.7     |  0.05269  |
|  16       |  5.949    |  10.98    |  0.02527  |
|  17       |  6.578    |  19.58    |  0.03199  |
|  18       |  6.599    |  16.92    |  0.01893  |
|  19       |  6.571    |  16.87    |  0.05008  |