본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 하이퍼파라미터 튜닝 GridSearch vs RandomSearch 2가지 핵심 차이와 최적화 방법

by Papa Martino V 2026. 4. 9.
728x90

GridSearch vs RandomSearch
GridSearch vs RandomSearch

 

 

머신러닝 모델의 성능을 결정짓는 것은 단순히 데이터의 양뿐만이 아닙니다. 알고리즘의 설정값인 하이퍼파라미터(Hyperparameter)를 어떻게 최적화하느냐에 따라 모델은 평범한 도구에서 강력한 무기로 거듭납니다. 특히 파이썬 Scikit-learn 라이브러리에서 제공하는 GridSearchCVRandomizedSearchCV는 개발자들이 가장 많이 고민하는 선택지입니다.

본 포스팅에서는 두 기법의 메커니즘 차이를 심층적으로 비교하고, 실무에서 연산 자원을 아끼면서도 최적의 성능을 도출할 수 있는 7가지 이상의 고급 구현 예제를 제공합니다.


1. 하이퍼파라미터 튜닝의 본질: Grid vs Random

하이퍼파라미터 튜닝은 모델이 학습할 수 없는 외부 설정값(예: 학습률, 트리의 깊이 등)을 인간이나 시스템이 직접 조정하여 손실 함수를 최소화하는 과정입니다.

GridSearch와 RandomSearch의 기술적 차이 비교

항목 Grid Search (격자 탐색) Random Search (무작위 탐색)
탐색 방식 사전 정의된 모든 조합을 전수 조사 정해진 횟수만큼 무작위 조합 탐색
확정성 동일 조건 시 항상 같은 결과 도출 수행 시마다 결과가 다를 수 있음
시간 효율성 조합이 많아질수록 기하급수적 증가 비교적 짧은 시간에 넓은 범위 탐색 가능
최적해 발견 그리드 내 최적값은 확실히 발견 그리드 사이의 숨겨진 최적값 발견 유리
권장 상황 파라미터 범위가 좁고 중요할 때 파라미터 공간이 넓고 자원이 제한적일 때

2. 왜 RandomSearch가 종종 GridSearch보다 뛰어난가?

많은 연구(Bergstra and Bengio, 2012)에 따르면, 실제 모델 성능에 영향을 미치는 파라미터는 소수에 불과한 경우가 많습니다. GridSearch는 중요하지 않은 파라미터의 조합을 테스트하느라 귀중한 시간을 낭비하지만, RandomSearch는 무작위성을 통해 더 다양한 '중요 파라미터'의 후보군을 훑을 수 있기 때문에 동일 시간 대비 더 나은 성능을 낼 확률이 높습니다.


3. [Practical Examples] 실무 최적화를 위한 Python 예제 7선

실제 프로젝트에서 즉시 활용 가능한 하이퍼파라미터 튜닝 파이프라인 코드입니다. 모든 코드는 복사하여 사용할 수 있습니다.

Example 1: 기초적인 GridSearchCV 구현 방법

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

data = load_iris()
rf = RandomForestClassifier()

# 촘촘한 격자 설정
param_grid = {
    'n_estimators': [10, 50, 100],
    'max_depth': [None, 10, 20],
    'min_samples_split': [2, 5]
}

grid_search = GridSearchCV(rf, param_grid, cv=5, n_jobs=-1)
grid_search.fit(data.data, data.target)
print(f"최적 파라미터: {grid_search.best_params_}")
    

Example 2: 연속적인 범위를 탐색하는 RandomizedSearchCV 해결책

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

# 리스트가 아닌 분포(Distribution)를 사용하여 더 넓은 영역 탐색
param_dist = {
    'n_estimators': randint(10, 500),
    'max_depth': randint(1, 50),
    'max_features': ['auto', 'sqrt', 'log2']
}

rand_search = RandomizedSearchCV(rf, param_distributions=param_dist, n_iter=50, cv=5, random_state=42)
rand_search.fit(data.data, data.target)
print(f"랜덤 탐색 최적 점수: {rand_search.best_score_}")
    

Example 3: Pipeline을 결합한 스케일링 및 튜닝 동시 진행

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC())
])

param_grid = {'svc__C': [0.1, 1, 10], 'svc__gamma': [0.01, 0.1]}
grid_pipe = GridSearchCV(pipe, param_grid, cv=3)
grid_pipe.fit(data.data, data.target)
    

Example 4: HalvingGridSearch를 이용한 시간 단축 방법 (Scikit-learn 최신)

from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import HalvingGridSearchCV

# 자원을 적게 투입하며 점진적으로 우수한 후보만 남기는 방식
halving_search = HalvingGridSearchCV(rf, param_grid, resource='n_samples', factor=3)
halving_search.fit(data.data, data.target)
    

Example 5: XGBoost 전용 하이퍼파라미터 튜닝 예제

from xgboost import XGBClassifier

xgb = XGBClassifier(eval_metric='logloss')
param_xgb = {
    'learning_rate': [0.01, 0.1, 0.3],
    'subsample': [0.7, 0.8, 0.9],
    'colsample_bytree': [0.7, 0.8]
}

grid_xgb = GridSearchCV(xgb, param_xgb, cv=3, scoring='accuracy')
grid_xgb.fit(data.data, data.target)
    

Example 6: 다중 평가지표(Scoring) 동시 고려하기

# 정확도뿐만 아니라 F1-score까지 고려한 튜닝
scoring = {'AUC': 'roc_auc', 'Accuracy': 'accuracy'}
grid_multi = GridSearchCV(rf, param_grid, scoring=scoring, refit='AUC', cv=5)
# (Binary classification 데이터셋 필요)
    

Example 7: 하이퍼파라미터 튜닝 결과 시각화(Pandas 활용)

import pandas as pd

# cv_results_를 데이터프레임으로 변환하여 성능 패턴 분석
results_df = pd.DataFrame(grid_search.cv_results_)
# 필요한 컬럼만 추출하여 정렬
print(results_df[['params', 'mean_test_score', 'rank_test_score']].sort_values(by='rank_test_score').head())
    

4. 성능 최적화를 위한 3단계 전략

  1. 초기 탐색: RandomizedSearchCV를 사용하여 넓은 범위에서 유망한 파라미터 영역을 신속하게 식별합니다.
  2. 정밀 튜닝: 식별된 좁은 영역에 대해 GridSearchCV를 적용하여 세밀한 최적값을 찾습니다.
  3. 검증: 찾아낸 최적 파라미터가 테스트 데이터셋(Hold-out set)에서도 일반화 성능을 유지하는지 최종 확인합니다.

5. 결론 및 요약

하이퍼파라미터 튜닝은 단순한 반복 작업이 아니라, 컴퓨팅 자원과 시간 사이의 균형을 맞추는 전략적 선택입니다. 전수 조사가 필요한 핵심 파라미터에는 GridSearch를, 탐색 공간이 광대하고 빠른 시도가 필요할 때는 RandomSearch를 활용하는 것이 실무자의 노하우입니다. 위 7가지 예제를 통해 여러분의 머신러닝 모델 성능을 1% 더 끌어올려 보시기 바랍니다.

 

[내용 출처]
1. Scikit-learn User Guide: Tuning the hyper-parameters (https://scikit-learn.org)
2. Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization.
3. Machine Learning with PySpark (High-performance tuning chapters)

728x90