들어가며
이번 글에서는 모델들의 하이퍼파라미터를 미세 튜닝하는 방법들 중
그리드 서치와 랜덤 서치에 대해 알아볼 것이다
미세 튜닝을 하는 이유는 하이퍼파라미터를 감으로 정하지 않고
일반화 성능이 제일 좋은 조합을 찾기 위함이다
그리드 서치(Grid Search)
성능이 좋은 하이퍼파라미터 조합을 찾기 위한 원초적이고 가장 단순한 방법은
만족할 만한 조합이 나올 때까지 수동으로 조정하는 것이다
이 방법은 당연히 매우 지루하고 시간도 오래 걸린다
해결책으로 사이킷런에서 제공하는 GridSearchCV를 이용하는 방법이 있다
그리드 서치는 아래 과정으로 이루어진다
1. 하이퍼파라미터 값 후보 설정
2. 값들의 조합(grid) 생성
3. 조합마다 모델 학습
4. 가장 성능 좋은 조합 선택
from sklearn.model_selection import GridSearchCV
full_pipeline = Pipeline([
("preprocessing", preprocessing),
("random_forest", RandomForestRegressor(random_state=42)),
])
param_grid = [
{'preprocessing__geo__n_clusters': [5, 8, 10],
'random_forest__max_features': [4, 6, 8]},
{'preprocessing__geo__n_clusters': [10, 15],
'random_forest__max_features': [6, 8, 10]},
]
grid_search = GridSearchCV(full_pipeline, param_grid, cv=3,
scoring='neg_root_mean_squared_error')
grid_search.fit(housing, housing_labels)
이런식으로 param_grid에 후보군을 설정하고
GridSerachCV 객체를 생성하여 학습시키면 교차 검증을 사용해 모든 파라미터 조합을 평가한다
이 때 객체의 cv 파라미터는 교차 검증에서의 폴드 개수를 의미한다
param_grid에 두개의 딕셔너리가 있는데
첫 번째 딕셔너리에서 3X3=9개의 조합을 평가하고
두 번째 딕셔너리에서 2X3=6개의 조합을 평가하여 총 15개의 조합을 확인한다
또 3-fold 교차검증을 사용하므로 각 조합마다 3번씩 훈련하므로 총 15X3=45번 확인한다
참고로 preprocessing__geo__n_clusters와 random_forest__max_features에서 이중 밑줄 문자의 의미는
내부적으로 하위 개념의 객체로 들어가는 의미다
preprocessing이라는 이름의 추정기를 찾고 그 안에서 geo라는 이름의 추정기를 찾고
그 안에서 n_clusters라는 하이퍼파라미터를 찾는다는 개념이다
grid_search.best_params_
{'preprocessing__geo__n_clusters': 15, 'random_forest__max_features': 6}
grid_search.best_params_를 통해 최상의 하이퍼파라미터 조합을 확인할 수 있다
랜덤 서치(Random Search)
그리드 서치는 적은 수의 조합일 경우에 효율적이고 하이퍼파라미터 탐색공간이 커진다면
RandomizedSearchCV가 선호된다
랜덤 서치는 아래의 과정으로 이루어진다
1. 하이퍼파라미터 후보 범위 설정
2. 지정된 수만큼 랜덤 조합 선택
3. 조합마다 모델 학습
4. 가장 성능 좋은 조합 선택
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distribs = {'preprocessing__geo__n_clusters': randint(low=3, high=50),
'random_forest__max_features': randint(low=2, high=20)}
rnd_search = RandomizedSearchCV(
full_pipeline, param_distributions=param_distribs, n_iter=10, cv=3,
scoring='neg_root_mean_squared_error', random_state=42)
rnd_search.fit(housing, housing_labels)
randint()로 하이퍼파라미터의 후보 범위를 설정하고 n_iter 파라미터를 통해 몇 개의 조합을 만들지 정한다
위 코드는 3X10=30개의 랜덤 조합을 평가한다
탐색 공간이 넓을 때 그리드 서치는 모든 조합을 다 둘러보므로 연산량이 늘어나고 효율성이 떨어진다
반면 랜덤 서치는 샘플의 수를 정해 범위 내에서 랜덤으로 학습하고 불필요한 탐색을 피할 수 있어 시간을 절약할 수 있다
마치며
이번 글에서는 모델의 미세튜닝 방법들 중 그리드 서치와 랜덤 서치에 대해 알아보았다
그리드 서치는 하이퍼파라미터 값이 적고 범위가 좁을 때 사용해야 효율적이고
랜덤 서치는 하이퍼파라미터 후보가 많고 범위가 넓을 때 사용해야 좋은 성능을 낸다
랜덤 서치도 범위를 잘못 지정하면 최적값을 놓칠 수 있고 오히려 그리드 서치보다 성능이 떨어질 수 있다
범위든, 값이든 뭐든지 설정할 때 사소한 것이라도 생각해보고 신중하게 정해야할 것 같다고 느꼈다
'AI > Machine Learning' 카테고리의 다른 글
| [AI] 정밀도/재현율 트레이드오프 (1) | 2026.02.28 |
|---|---|
| [AI] 오차 행렬(Confusion Matrix)과 정밀도(Precision), 재현율(Recall) (1) | 2026.02.28 |
| [AI] 변환 파이프라인 (1) | 2026.02.08 |
| [AI] 방사 기저 함수(RBF)를 통한 유사도 측정으로 멀티모달 분포(multimodal distribution) 변환 (1) | 2026.02.08 |
| [AI] 특성 스케일링(정규화, 표준화) (0) | 2026.02.07 |
