오늘은 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 |
'IT > 파이썬' 카테고리의 다른 글
if문과 apply함수로 파생변수 만들기 (0) | 2021.08.04 |
---|---|
[그래프] for문으로 산점도 그리기 plt.scatter 활용 (0) | 2021.08.02 |
[for loop 활용] 최적화된 feature set 찾기 (0) | 2021.06.25 |
차원축소 tsne, pca와 비교 (0) | 2021.04.25 |
autogluon으로 최적화 모델링 만들기 (0) | 2021.04.23 |