본문 바로가기
Python (Linux)

17. Python - 그리드 탐색을 랜덤 탐색으로 바꾸기

by #Glacier 2018. 11. 28.
반응형

안녕하세요!

오늘은 그리드 탐색을 랜덤 탐색으로 바꾸는 작업을 해보겠습니다.

오늘 하는 것도 약 50분 정도는 잡고 하셔야 될 것 같네요. 제 가상머신 기준( 메모리 4G, CPU 4개 할당 ) 40.7min 소요되었습니다.



sklearn.model_selection의 RandomizedSearchCV를 임포트하고,

param_distribs에 kernel을 linear와 rbf로 설정합니다.

하이퍼파라미터 C는 reciprocal, gamma는 expon을 설정합니다.

ssvm_reg는 서포트 벡터회귀 그대로이나, 탐색방법을 RandomizedSearchCV로 합니다.

https://docs.scipy.org/doc/scipy/reference/stats.html 을 참고하시면

여러 분포들을 볼 수 있습니다.


일단, reciprocal은 상호 연속적인 랜덤변수라고 하네요.

위의 정의된 확률밀도함수는 표준화된 폼이며, 분포를 Shift하거나 Scale하려면 loc와 scale 파라미터를 사용하라고 합니다.



expon은 지수 분포를 나타냅니다.



긴 시간을 거쳐서 랜덤 탐색을 통해 탐색된 최상 모델의 5-겹교차 검증 점수는 54767.99정도로 나오네요.

(일반적으로도 랜덤 탐색이 그리드 탐색보다는 좋은 모델을 탐색한다고 합니다.)

rnd_search.best_params_로 최상의 하이퍼파라미터가 무엇인지 보면,

이번엔 rbf커널의 C : 157055, gamma : 0.265 정도로 탐색되었습니다.



여기서 사용된 scale=1.0의 지수분포를 살펴봅시다.

앞에 몰려있는 값들을 log하면 대부분의 값들이 exp(-2), exp(+2)사이에 있음을 알 수 있습니다.



C에 사용된 분포는 매우 다른데요. 주어진 범위안에서 균등한 분포로 샘플링됩니다.

그래서 로그분포가 거의 일정하게 나타납니다.

따라서, 이런 분포는 원하는 스케일이 정확히 무엇인지 모를 때 사용하면 좋습니다.


즉 reciprocal()함수는 하이퍼파라미터 스케일에 대해 전혀 감이 없을 때 사용하고,

지수 분포는 하이퍼파라미터 스케일을 어느 정도 알고 있을 때 사용하는 것이 좋습니다.


 블로그 

출처


이 글의 상당 부분은  [핸즈온 머신러닝, 한빛미디어/오렐리앙 제롱/박해선] 서적을 참고하였습니다.


나머지는 부수적인 함수나 메서드에 대해 부족한 설명을 적어두었습니다.

학습용으로 포스팅 하는 것이기 때문에 복제보다는 머신러닝에 관심이 있다면 구매해보시길 추천합니다.


도움이 되셨다면 로그인 없이 가능한

아래 하트♥공감 버튼을 꾹 눌러주세요! 




반응형