Day to_day

Grid Search CV의 개념 및 장단점 본문

Machine Learning/머신러닝 기초

Grid Search CV의 개념 및 장단점

m_inglet 2023. 2. 24. 02:34
728x90
반응형

❗본 포스팅은 권철민 선생님의 '파이썬 머신러닝 완벽가이드' 강의와 '파이썬 라이브러리를 활용한 머신러닝' 서적을 기반으로 개인적인 정리 목적 하에 재구성하여 작성된 글입니다.

 

 

포스팅 개요

머신러닝을 할 때 데이터에 적합한 모델을 선택하는 것도 중요하지만 그것보다 더 중요한 것은 최적의 하이퍼 파라미터 튜닝을 하는 것이다. 하이퍼 파라미터를 직접 하나하나 넣고 결과를 도출하는 과정을 계속 반복해야 하는데 이럴 때 사용할 수 있는 모듈이 'Grid Search'이다. 이번 포스팅에선 GridSearchCV의 개념에 대해서 알아보고, 실습코드로 사용법을 익히기로 한다. 

 

 

Grid Search 

관심있는 매개변수들을 대상으로 가능한 모든 조합을 시도해 보며 최적 하이퍼 파라미터 튜닝을 하는 것!

알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도찰할 수 있는 방안을 제공해 주는 모듈이다.

 

예를 들어 Decision Tree의 하이퍼 파라미터 max_depth, min_samples_split를 튜닝하고 싶다면,

max_depth = [1,2,3]

min_sample_split = [2,3]

이렇게 있으면 3 * 2 해서 경우의 수는 6개의 파라미터 조합이 나올 수 있다.

이 모든 경우의 수를 적용해서 학습/테스트 하여 최적의 하이퍼 파라미터를 찾는다.

 

그런데 Grid Search를 할 때 여러 가지 매개변수 값으로 많이 시도해 보고 테스트 세트 정확도가 가장 높은 조합을 선택해야 하는데 만약 데이터가 train과 test 데이터로만 나눴더라면 테스트 세트를 이미 사용했기 때문에 모델이 얼마나 좋은지 평가하는 데 사용하지 못한다.

그래서 train, validation, test 셋으로 나눠, '모델 훈련', '매개변수 선택', '최종 모델 평가'를 각각 다른 데이터로 진행하면 더 정확한 모델을 만들수 있다.

 

 

Grid Search CV

이전 글에서 교차검증 (cross validation)에 대해서 포스팅했듯이 train과 validation, test를 나누는 방법에 모델은 민감할 수밖에 없다. 일반화 성능을 더 잘 평가하려면 훈련 세트와 검증 세트를 한번만 나누지 않고, 교차 검증을 사용해서 각 매개변수 조합의 성능을 평가할 수 있다.

교차 검증을 같이 하면서 그리드 서치를 한 번에 해주는 모델이 GridSearchCV이다.

 

그러면 아까의 예시에서

max_depth = [1,2,3]

min_sample_split = [2,3]

이렇게 있으면 3 * 2 해서 경우의 수는 6개가 나오고, cv 폴드를 만약 3개로 나눴다면 6 * 3=18이 되어 학습/검증하는 수행 횟수가 총 18번이 된다.

 

 

Grid Search CV 사용하기

Grid Search CV는 sklearn.model_selection 에서 import 해올 수 있다.

 

Grid Search CV를 사용할 때 필요한 값은

estimator : 모델

param_grid : 테스트할 하이퍼 파라미터 (딕셔너리 형태)

cv : cv 폴드 개수

refit : default는 True 이며 True일 때 가장 좋은 파라미터 설정으로 재학습시킨다는 의미

 

* GridSearchCV를 설정할 때 param_grid를 딕셔너리 형태로 넣어야 하는데 { str : list } 형태로 값을 입력해 주어야 한다. 만약 하이퍼 파라미터 범위 값을 하나만 설정하고 싶다 하더라도 list 형태로 넣어줘야 한다.

 

[실습 코드]

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# 파라미터를 딕셔너리로 저장
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
              'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
print(param_grid)
grid_search = GridSearchCV(svm, param_grid=param_grid, cv=5, return_train_score=True, refit=True)
# 과대 적합되지 않기 위해서 train test 나누기
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
grid_search.fit(X_train, y_train)
score = grid_search.score(X_test, y_test)
print("검증 세트 점수: {:.2f}".format(score))
print(grid_search.best_estimator_)

 

[출력 결과]

검증 세트 점수: 0.97
SVC(C=10, gamma=0.1)

 

 

GridSearchCV는 전체 데이터로 학습한 모델에 접근할 수 있도록 predict와 score 메서드 제공하는데, 그 외에도 다른 메서드들도 있다.

  • cv_results : GridSearchCV의 결과는 딕셔너리 형태로 저장되어 있음
  • best_params_ : 최적의 파라미터를 갖고 있음 (ex. {'C': 10, 'gamma': 0.1} ) 
  • best_score_ : 이 매개변수 설정으로 각 분할에서 얻은 정확도와 평균
  • best_estimator_ : 최적의 매개변수에서 전체 훈련 세트를 사용하여 학습한 모델 (ex. SVC(C=10, gamma=0.1) ) 


[실습 코드]

# 최적의 파라미터로 모델 학습 및 평가
svm = SVC(**grid_search.best_params_)
svm.fit(X_train, y_train)
final_score = svm.score(X_test, y_test)
print("테스트 세트 점수: {:.2f}".format(final_score))

[출력 결과]

테스트 세트 점수: 0.97

 

 

Grid Search CV의 장단점

장점

  • 지정된 범위의 하이퍼 파라미터에 대해서 포괄적인 검색을 수행하여 최상의 하이퍼 파라미터 조합을 검색한다.
  • 재현성 : 동일한 데이터 셋과 하이퍼 파라미터가 주어지면 알고리즘은 항상 동일한 결과를 반환해 준다.
  • 모델 성능 향상 : 최적의 하이퍼 파라미터를 찾아 모델 성능을 개선하는데 도움 된다.

 

단점

  • 하이퍼 파라미터의 수가 많거나 값의 범위가 크면 계산 비용이 많이 들 수 있다.
  • 과적합 : Grid Search CV는 모델이 하이퍼파라미터 튜닝에 사용된 동일한 데이터에 대해 훈련될 때 과적합으로 이어질 수 있다. 이로 인해 새로운 데이터와 보이지 않는 데이터에 대한 성능이 저하될 수 있다.
  • 제한된 범위: Grid Search CV는 하이퍼파라미터 공간의 제한된 범위만 탐색한다. 지정된 범위 내에서만 최적의 하이퍼파라미터를 검색하고 범위 밖에 있는 하이퍼파라미터의 최상의 조합을 놓칠 수 있다.

 

마무리

Grid Search CV에 대해서 개념과 사용법을 알아보았다.

Grid Search CV는 일반적으로 하이퍼 파라미터 튜닝에 널리 사용되는 기술이며 모델의 파라미터 수가 적고, 범위가 그리 넓지 않으면 사용하기 좋은 모듈이다.

728x90
반응형
Comments