본문 바로가기
정보/IT 지식 정보

GridSearchCV vs RandomizedSearchCV — 최적의 하이퍼파라미터 찾기 [3편]

by 안다니. 2026. 4. 1.
반응형
하이퍼파라미터 튜닝

 

SVM 모델의 72가지 조합을 자동으로 탐색하는 그리드 서치와 랜덤 서치를 비교합니다

하이퍼파라미터 튜닝이란?

하이퍼파라미터(Hyperparameter)는 머신러닝 알고리즘 학습 전에 우리가 직접 지정해야 하는 파라미터입니다. 예를 들어 SVM의 C(규제 강도), kernel(커널 타입), gamma(커널 계수) 등이 있습니다.

하이퍼파라미터를 잘못 설정하면 아무리 좋은 알고리즘도 성능이 떨어집니다. 따라서 다양한 파라미터 조합을 자동으로 시도해서 최적값을 찾는 것이 필수입니다.

💡 핵심 개념

파라미터: 모델이 학습 중에 자동으로 결정하는 값 (가중치, 편향)

하이퍼파라미터: 모델 학습 전에 사람이 지정하는 값 (학습률, 정규화)

GridSearchCV로 전수조사하기

GridSearchCV는 지정한 파라미터의 모든 조합을 시도해서 최고의 조합을 찾습니다. 'Grid(격자)'라는 이름처럼 격자 형태로 모든 경우의 수를 탐색합니다.

from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline

# 파이프라인 생성
pipe_svc = make_pipeline(StandardScaler(), SVC(random_state=1))

# 탐색할 파라미터 범위 정의
param_range = [0.0001, 0.001, 0.01, 0.1,
               1.0, 10.0, 100.0, 1000.0]

# Linear와 RBF 커널에 대한 파라미터 그리드
param_grid = [
    {'svc__C': param_range,
     'svc__kernel': ['linear']},

    {'svc__C': param_range,
     'svc__gamma': param_range,
     'svc__kernel': ['rbf']}
]

# GridSearchCV 실행
gs = GridSearchCV(estimator=pipe_svc,
                  param_grid=param_grid,
                  scoring='accuracy',
                  cv=10,
                  n_jobs=-1)

gs = gs.fit(X_train, y_train)

print('최고 정확도: %.3f' % gs.best_score_)
print('최적 파라미터:', gs.best_params_)

파라미터 그리드의 구조:

  • 첫 번째 딕셔너리: Linear 커널 (C만 변수) = 8개 조합
  • 두 번째 딕셔너리: RBF 커널 (C, gamma 변수) = 8×8=64개 조합
  • 총 72개 조합을 10-겹 교차 검증으로 평가

📊 계산 규모

72개 파라미터 조합 × 10-겹 = 720번의 모델 학습

n_jobs=-1로 병렬 처리하면 시간을 대폭 단축할 수 있습니다.

결과 분석과 최적 파라미터 추출

반응형

GridSearchCV 객체의 cv_results_는 모든 파라미터 조합의 결과를 담고 있는 딕셔너리입니다:

import pandas as pd

# 결과를 DataFrame으로 변환
results_df = pd.DataFrame(gs.cv_results_)

# 상위 5개 결과 확인
top_results = results_df.nlargest(5, 'mean_test_score')
print(top_results[['param_svc__C',
                        'param_svc__gamma',
                        'mean_test_score',
                        'std_test_score']])

# 최적 파라미터로 테스트 정확도 계산
y_pred = gs.predict(X_test)
test_score = gs.score(X_test, y_test)
print(f'테스트 정확도: {test_score:.3f}')

💡 실무 팁

cv_results_에서 std_test_score도 확인하세요. 평균이 비슷하면 표준편차가 작은 파라미터가 더 안정적입니다.

RandomizedSearchCV로 효율화하기

RandomizedSearchCV는 파라미터 공간에서 무작위로 샘플링해서 탐색합니다. 파라미터가 많거나 범위가 넓을 때 GridSearchCV보다 훨씬 효율적입니다.

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

# 연속 분포로 파라미터 정의
param_dist = [
    {'svc__C': loguniform(0.0001, 1000.0),
     'svc__kernel': ['linear']},

    {'svc__C': loguniform(0.0001, 1000.0),
     'svc__gamma': loguniform(0.0001, 1000.0),
     'svc__kernel': ['rbf']}
]

# RandomizedSearchCV 실행
rs = RandomizedSearchCV(estimator=pipe_svc,
                        param_distributions=param_dist,
                        n_iter=30,
                        cv=10,
                        random_state=1,
                        n_jobs=-1)

rs = rs.fit(X_train, y_train)

print('최고 정확도: %.3f' % rs.best_score_)
print('최적 파라미터:', rs.best_params_)

GridSearch와의 차이점:

  • GridSearch: 72개 조합 모두 탐색 (720번 학습)
  • RandomizedSearch: 30개 조합만 무작위 탐색 (300번 학습)
  • RandomizedSearch가 약 58% 시간 단축, 대신 최적값을 못 찾을 수 있음

중첩 교차 검증 구현

중첩 교차 검증(Nested Cross-Validation)은 파라미터 튜닝과 성능 평가를 분리합니다. 바깥쪽 루프는 성능 평가용, 안쪽 루프는 파라미터 튜닝용입니다.

from sklearn.model_selection import cross_val_score

# 바깥쪽 루프 (5-겹 성능 평가)
# 안쪽 루프 (10-겹 파라미터 튜닝)는 GridSearchCV 내부에서
scores = cross_val_score(
    gs,
    X_train,
    y_train,
    scoring='accuracy',
    cv=5
)

print('SVM CV 정확도: %.3f +/- %.3f' % (scores.mean(), scores.std()))
print('개별 폴드 점수:', scores)

🔍 중첩 CV의 의미

바깥쪽 5-겹: 각 폴드마다 안쪽 GridSearchCV가 실행됩니다.

최종 점수는 5개 폴드의 평균 = 모델의 진정한 일반화 성능

GridSearch vs RandomSearch 비교

두 방법의 특징을 명확히 이해하고 상황에 맞게 선택하세요:

항목 GridSearchCV RandomizedSearchCV
탐색 방식 모든 조합 시도 무작위 샘플링
최적값 보장 (확률 100%) 확률적 (n_iter에 따름)
계산 시간 오래 걸림 빠름
파라미터 수 적을 때 추천 (3~4개) 많을 때 추천 (5개+)
범위 정의 리스트 (이산값) 분포 (연속값)
사용 예시 SVM (C, kernel, gamma) 신경망 (많은 하이퍼파라미터)

💡 선택 기준

GridSearchCV: 파라미터가 3개 이하이고 탐색 공간이 작을 때

RandomizedSearchCV: 파라미터가 많거나 범위가 넓을 때 시간 제약이 있을 때

📌 이번 포스트의 핵심 요약

  • GridSearchCV로 파라미터의 모든 조합 평가
  • cv_results_에서 상위 결과 분석
  • RandomizedSearchCV로 큰 파라미터 공간 효율적 탐색
  • 중첩 교차 검증으로 파라미터 튜닝과 평가 분리
  • n_jobs=-1로 멀티코어 병렬 처리 활용

📚 시리즈 네비게이션

← 1편 - 교차 검증과 혼동 행렬

← 2편 - ROC 곡선과 PR 곡선

현재 글: 3편 - GridSearchCV와 하이퍼파라미터 튜닝

시리즈명: 머신러닝 실전 완전 정복

반응형

댓글