| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- java
- Database
- oracle
- 반응형웹
- html 기초
- FlowLayout
- 미디어쿼리
- Codility
- iframe 태그
- 사전학습
- BorderLayout
- inline
- rnn
- html 프로젝트
- g검정
- css 기초
- 반응형 웹 프로젝트
- Position
- 퍼셉트론
- 예제
- FileWriter
- 메서드
- 상속
- 파이썬
- ObjectOutputStream
- CSS
- GridLayout
- HTML
- 푸리에 변환
- FFT
- Today
- Total
도라에몽주머니
[ML] 하이퍼파라미터 최적화(Random Search, Grid Search) 본문
이번에는 하이퍼파라미터(Hyperparameter) 를 최적화하는 방법에 대해 정리하려고 한다.
하이퍼파라미터(Hyperparameter) 란?
하이퍼파라미터(Hyperparameter) 란 머신러닝 모델을 모델링할 때, 사용자가 직접 세팅해야하는 값을 말한다. 하이퍼파라미터는 정해진 최적의 값이 없기에 경험에 기반하여 설정하는 경우가 많다. 그렇기 때문에 하이퍼파라미터를 조정하여 최적의 값을 경험적으로 찾아야 한다.
머신러닝에서 파라미터(Parameter) 란 모델의 데이터로부터 학습하는 값이다. 즉, 모델 내부에서 결정되는 매개변수로서 이는 결국 데이터에 의해 결정된다.
예를 들어, 정규분포를 그리는 것을 생각해보자. 이때, 정규분포를 그리면 평균(μ) 과 표준편차(σ) 값이 구해지는데, 이 두 값이 파라미터이다.
반면, 하이퍼파라미터의 경우에는 사용자가 직접 값을 세팅하는 변수이다.
예를 들어, KNN으로 모델을 작성한다면 K 값, 랜덤포레스트로 모델을 작성한다면 n_estimators 등이 하이퍼파라미터에 해당한다.
| 파라미터(Parameter) | 하이퍼파라미터(Hyperparameter) | |
| 차이점 | 사용자 설정 필요 X | 사용자가 직접 설정 |
하이퍼파라미터 최적화
하이퍼파라미터 최적화란 머신러닝에서 모델에 가장 적합한 하이퍼파라미터 세트를 찾는 것이다. 하이퍼파라미터를 자동으로 최적화하는 방법으로는 Random Search, Grid Serach, Bayesian Optimization 등 여러 종류가 있지만, 이번 글에서는 그중에서도 Random Search와 Grid Serach를 중심으로 이야기하려고 한다.

그리드 서치(Grid Search)
그리드 서치(Grid Search) 는 하이퍼파라미터를 최적화하는 방법 중 하나로, 사용자가 지정한 하이퍼파라미터의 조합을 모두 시도하여 가장 좋은 성능을 보이는 조합을 찾는 방법이다.
GridSearchCV
Gallery examples: Release Highlights for scikit-learn 1.4 Release Highlights for scikit-learn 0.24 Feature agglomeration vs. univariate selection Shrinkage covariance estimation: LedoitWolf vs OAS ...
scikit-learn.org
💡하이퍼파라미터의 조합을 지정할 때 뭐부터 해야할지 모르겠다면 sklearn에서 사용되는 디폴트 값을 기준으로 정해보자.
장・단점
- 장점
- 최적화: 모델의 성능을 높이기 위한 최적의 하이퍼파라미터를 찾을 수 있다.
- 자동화: 비효율적이고 시간이 많이 걸리는 수동 방식과 달리 자동으로 하이퍼파라미터를 조정할 수 있다.
- 객관성: 모든 가능한 조합을 시도하므로, 선택의 주관성 없이 객관적인 결과를 얻을 수 있다.
- 단점
- 실행 시간: 모든 조합을 탐색하므로, 실행에 시간이 많이 든다.
- 계산 비용: 모든 조합을 탐색하므로, 계산 비용이 많이 든다.
예제
sklearn의 iris 데이터를 사용해서 그리드 서치를 사용해보자. 이번에는 정확한 모델을 만드는게 목적이 아니고 그리드 서치를 동작시켜 보는 것이 목적이기 때문에 따로 train과 test 데이터셋을 분할하진 않았다.
우선 필요한 라이브러리를 import 한다.
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
데이터를 불러온 후, estimator를 100, 200, ... , 900 으로 그리드 서치를 적용한다.
# 데이터 불러오기
iris = load_iris()
X, Y = iris.data, iris.target
# 하이퍼파라미터 설정하기
n_estimators=range(100, 1000, 100)
h_param={'n_estimators':n_estimators}
# 그리드 서치를 이용해 하이퍼파라미터들을 순차적으로 학습 및 평가하기
gd=GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=h_param, verbose=1)
gd.fit(X,Y)
# 그리드 서치 결과를 추출하여 데이터프레임으로 출력하기
scores_df = pd.DataFrame(gd.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', 'split0_test_score', 'split1_test_score', 'split2_test_score']]
GridSearchCV의 verbose를 1로 설정했기 때문에 iteration 시 간단한 메세지가 출력된다. 그리고 출력된 데이터프레임은 아래와 같다.

아래의 코드를 통해 최적의 파라미터와 최고 정확도를 출력해 볼 수도 있다.
print('Best Parameter:', gd.best_params_) # Best Parameter: {'n_estimators': 100}
print('Max Accuracy: {0:.4f}'.format(gd.best_score_)) # Max Accuracy: 0.9667
랜덤 서치(Random Search)
랜덤 서치(Random Search) 는 하이퍼파라미터를 최적화하는 방법 중 하나로, 가능한 하이퍼파라미터 값들 중에서 무작위로 값을 선택하여 모델을 평가하는 방법이다.
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html
RandomizedSearchCV
Gallery examples: Release Highlights for scikit-learn 0.24 Faces recognition example using eigenfaces and SVMs Comparison of kernel ridge and Gaussian process regression Comparing randomized search...
scikit-learn.org
장・단점
- 장점
- 속도: 무작위로 값을 선택하므로 모든 조합을 비교하는 그리드 서치에 비해 실행 속도가 훨씬 빠르다.
- 효율성: 랜덤으로 값을 선택하기 때문에 불필요한 탐색 횟수를 줄일 수 있어 효율적이다.
- 단점
- 효율성: 중요한 부분은 지나치거나 불필요하게 많이 반복하는 경우가 생길 수 있다.
랜덤 서치는 어떻게 보면 효율적이기도 하고 어떻게 보면 비효율적이기도 하다. 개인적으로는 무작위로 선택하는 방식의 한계점이지 않을까 라는 생각이 든다...
아래 논문에서는 랜덤 서치가 그리드 서치보다 더 성능이 좋은 것을 입증하고 있다. (나중에 읽어볼 예정...)
https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf
예제
그리드 서치와 마찬가지로 iris 데이터를 사용해 연습할 것이다.
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV # GridSearchCV 대신 RandomizedSearchCV 사용
iris = load_iris()
X, Y = iris.data, iris.target
n_estimators=range(100, 1000, 100)
h_param={'n_estimators':n_estimators}
rd=RandomizedSearchCV(estimator=RandomForestClassifier(random_state=42), param_distributions=h_param, verbose=1)
rd.fit(X,Y)
scores_df = pd.DataFrame(rd.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', 'split0_test_score', 'split1_test_score', 'split2_test_score']]
데이터프레임 출력 결과는 아래와 같다. 이번에는 실행시간이 13초였는데, 그리드서치의 약 절반 정도 걸렸다. 아마 데이터 양이 더 많고 복잡해지면 더욱 눈에띄는 차이가 있지 않을까?

최적 파라미터와 최고 정확도를 확인해보자.
print('Best Parameter:', rd.best_params_) # Best Parameter: {'n_estimators': 100}
print('Max Accuracy: {0:.4f}'.format(rd.best_score_)) # Max Accuracy: 0.9667
마무리
오늘은 그리드 서치와 랜덤 서치의 차이점을 정리해보고 직접 코드도 작성해보았다. 이번 코드에서는 하이퍼파라미터를 하나만 지정하기도 했고 data split도 제대로 되지 않아 각각의 결괏값의 차이가 미미했지만, 다양한 하이퍼파라미터를 지정해 보면 결과가 달라질 것 같다!
다음에 머신러닝 모델을 작성할 때 꼭 활용해 볼 수 있었으면 좋겠다.
'Study > ML' 카테고리의 다른 글
| [ML/AI] ONNX 모델이란? (0) | 2025.12.15 |
|---|---|
| [ML] numpy 모듈으로 푸리에 변환 구현 (4) | 2024.09.27 |
| [ML] 푸리에 변환(Fourier Transform) 이란? (3) | 2024.09.17 |
| [ML] 다층 퍼셉트론(Multi-Layer Perceptron)과 활성화 함수 (1) | 2023.11.13 |
| [ML] 퍼셉트론(Perceptron) 이란? (0) | 2023.11.02 |