nan + nan = 2nan

[M/L] GridSearchCV, RandomSearchCV 본문

Statistics/Machine Learning

[M/L] GridSearchCV, RandomSearchCV

2nan 2022. 5. 21. 14:01
728x90

머신러닝 모델을 돌리다 보면, 하이퍼 파라미터를 직접 설정해주어야 한다.

하지만, 처음 모델을 돌리거나 그러다 보면 하이퍼 파라미터를 어떻게 설정해주어야 할지 고민이 되기도 하고

모델을 돌릴 때마다 일일이 설정해주는 것도 귀찮다.

 

이를 위해서 GridSearchCV와 RandomSearchCV로 파라미터들을 한꺼번에 설정하고,

조합을 알아서 맞춰서 직접 최적의 하이퍼 파라미터로 설정된 모델을 만들어준다.

근데 항상 할 때마다, GridSearchCV는 직접 숫자 하나하나를 넣어주고 테스트를 하다보니,

오히려 모델의 Default 값이 높았던 적이 훨씬 많았던 것 같았다.

그래서 RandomSearchCV가 왠지 직접 입력하는 것보다 range 안에서 직접 범위를 찾아주니 조금 더 세밀하고 좋은 것이 아닌가?라는 생각이 들었는데 그에 대한 확신이 없었다.

 

정말 간단하게 설명하자면 딱 이거다.

 

RandomizedSearchCV는 GridSearch에 비해 시간 상 효율적이다. 데이터가 많고 파라미터 튜닝이 많이 필요할 떄 효과적이다.
GridSearchCV는 데이터가 많고, 튜닝해야 할 파라미터가 많은 경우 비효율적이다. 성능 개선을 위해 모든 파라미터 조합을 진행해야할 때 사용하는 것이 적절하다.

 


즉, 데이터가 많고 튜닝을 많이 해야 하는데 시간 상 효율을 따지려면 RandomizedSearchCV를,

데이터가 비교적 적거나, 성능 개선이 필수적이라면 GridSearchCV를 사용하면 될 듯 하다.


 

 

참고)

1. GridSearchCV 예시

from sklearn.model_selection import GridSearchCV

          # 결정 트리의 개수를 지정. 적절한 개수 설정이 중요
params = { 'n_estimators' : [80, 90, 100, 110, 120],
          # 트리의 깊이. 랜덤 포레스트 트리의 루트 노드와 리프 노드 사이 가장 긴 경로 설정
          # 모든 트리가 성장할 수 있는 깊이를 제한
           'max_depth' : [3, 4, 5, 6, 7, 8, 9, 10],
          # 최상의 분할을 찾을 때 고려해야 할 기능의 수
           'learning_rate' : [0.01, 0.1],
          # 자식에 필요한 인스턴스 가중치(hessian)의 최소 합계
           'min_child_weight' : [1, 2, 3, 4]
            }


xgb_cfr = XGBClassifier(random_state=0,
                        n_jobs=-1)
grid_cv = GridSearchCV(xgb_cfr, 
                       param_grid = params, 
                       cv = 5, 
                       n_jobs = -1,
                       verbose=3)
grid_cv.fit(X_train, y_train)

print(f'최적 하이퍼 파라미터: {grid_cv.best_params_}')
print(f'최고 예측 정확도: {(grid_cv.best_score_)*100:.4f}')

- Result

Fitting 5 folds for each of 320 candidates, totalling 1600 fits
최적 하이퍼 파라미터: {'learning_rate': 0.1, 'max_depth': 4, 'min_child_weight': 3, 'n_estimators': 80}
최고 예측 정확도: 84.9548

 

2. RandomSearchCV 예시

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

param_distribs = {
    'n_estimators' : randint(low=1, high=200),
    'max_depth' : randint(low=3, high=100),
    'min_child_weight' : randint(low=1, high=100),
    # 'learning_rate' : randint(low=0.01, high=0.1),
}

xgb_cfr = XGBClassifier(random_state=0,
                        n_jobs=-1)
rand_cv = RandomizedSearchCV(xgb_cfr, 
                            param_distributions=param_distribs,
                            cv = 5, 
                            n_jobs = -1,
                            verbose=3)
rand_cv.fit(X_train, y_train)

print(f'최적 하이퍼 파라미터: {rand_cv.best_params_}')
print(f'최고 예측 정확도: {(rand_cv.best_score_)*100:.4f}')

- Result

Fitting 5 folds for each of 10 candidates, totalling 50 fits
최적 하이퍼 파라미터: {'max_depth': 4, 'min_child_weight': 80, 'n_estimators': 101}
최고 예측 정확도: 84.8467
Comments