[머신러닝] RandomSearchCV 사용 방법 및 GridSearchCV 차이점
머신러닝 모델의 성능을 높이기 위해 여러 가지 방법을 고안하거나 실행해 보실 텐데, 이번에 HyperParmeter Tuning 방법 중 하나인 RandomSearchCV에 대한 설명 및 사용방법에 알아보고자 합니다. 추가로 GridSearchCV와 어떤 점이 다른지 비교해 보겠습니다.
1. RandomSearchCV 란?
RandomSearchCV는 머신러닝 모델의 하이퍼파라미터를 최적화하는 방법 중 하나입니다. 이 방법은 하이퍼파라미터의 특정 범위 내에서 무작위로 선택하여 모델을 평가하고, 이 중에서 가장 좋은 성능을 보이는 파라미터를 찾습니다. RandomSearchCV는 다양한 하이퍼파라미터 조합을 신속하게 탐색할 수 있는 장점이 있습니다.
사용자가 지정한 파라미터 값(시행 횟수 또는 시간) 내에서 실행되며, 각 시행에서 하이퍼파라미터의 새로운 조합을 테스트합니다. RandomSearchCV는 sklearn 라이브러리에서 제공하는 클래스로, 교차 검증을 사용하여 각 조합의 성능을 평가합니다. 이 과정은 병렬 처리도 지원하여 더 빠른 계산이 가능합니다. RandomSearchCV는 특히 하이퍼파라미터의 차원이 많거나, 탐색 공간이 클 때 유용하게 사용됩니다.
2. RandomSearchCV 4가지 장점
- 효율성: RandomSearchCV는 모든 가능한 조합을 평가하지 않고, 무작위로 선택된 하이퍼파라미터 조합을 사용하여 비교적 빠르게 최적의 조합을 찾을 수 있습니다. - GridsearchCV는 너무 오래 걸려요...
- 비용 효과적: 큰 파라미터 공간에 대해 더 적은 계산으로 좋은 결과를 얻을 수 있어, 계산 비용을 절감할 수 있습니다.
- 확장성: 파라미터 공간이 클 때 GridSearchCV에 비해 더 나은 성능을 발휘할 가능성이 높습니다.
- 유연성: 다양한 확률 분포에서 파라미터를 샘플링할 수 있어, 파라미터의 중요성에 따라 탐색 전략을 조정할 수 있습니다.
3. RandomSearchCV와 GridSearchCV의 차이점
특성 | RandomSearchCV | GridSearchCV |
탐색 방식 | 무작위로 하이퍼파라미터 조합 선택 | 가능한 모든 하이퍼파라미터 조합을 체계적으로 탐색 |
속도 및 효율성 | 일반적으로 더 빠르며 하이퍼파라미터의 수가 많을 때 효율적 | 모든 조합을 평가하기 때문에 더 많은 시간과 계산력이 필요함 |
계산 비용 | 비교적 낮음 | 높음 |
과적합(Overfitting)의 위험 | 무작위 선택으로 과적합의 위험이 낮아질 수 있음 | 모든 가능한 조합을 탐색함으로써 최적의 값에 과적합 될 수 있음 |
파라미터 중요도 발견 | 중요하지 않는 파라미터에 의해 결과가 크게 좌우되지 않음 | 모든 파라미터의 영향을 평가하므로 중요 파라미터와 그렇지 않은 파라미터를 구분할 수 있음 |
유연성 | 하이퍼파라미터의 분포를 자유롭게 선택할 수 있음 | 고정된 간격으로 하이퍼파라미터 평가 |
4. RandomSearchCV 코드 공유
RandomizedSearchCV하이퍼파라미터 값과, 평가 방법에 원하시는 값을 넣으시면 될 것 같습니다. 또한 Random_state=42로 고정해주세요. 모델 학습 과정에서의 무작 요소 통제 및 일관된 방식을 유지하기 위해서입니다.
4. 1 전체 코드 설명
import numpy as np
import time
from sklearn.model_selection import RandomizedSearchCV
import xgboost as xgb
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
# 결과 출력 함수
def print_results(model_name, rscv):
print("="*100)
print(f'{model_name} 최적 파라미터:', rscv.best_params_)
rmse = np.sqrt(-rscv.best_score_)
print(f'{model_name} 예측 RMSE: {rmse:.4f}')
print("="*100)
# RandomizedSearchCV 실행 함수
def execute_random_search(model_name, model, params, X_train, y_train):
print(f"{model_name}에 대한 RandomizedSearchCV 실행 중")
start_time = time.time() # 학습 시작 시간
rscv = RandomizedSearchCV(estimator=model, param_distributions=params, n_iter=100, scoring='neg_mean_squared_error', cv=5, refit=True, n_jobs=-1, verbose=2, random_state=42)
rscv.fit(X_train, y_train)
end_time = time.time() # 학습 종료 시간
elapsed_time = int(end_time - start_time) # 경과 시간을 정수 초로 변환
hours, remainder = divmod(elapsed_time, 3600) # 시간과 나머지(초) 계산
minutes, seconds = divmod(remainder, 60) # 분과 초 계산
print_results(model_name, rscv)
# "총 학습시간은 OO분 OO초 입니다."와 같은 형식으로 시간을 출력
if hours > 0:
print("총 학습시간은 {}시간 {}분 {}초 입니다.".format(hours, minutes, seconds))
else:
print("총 학습시간은 {}분 {}초 입니다.".format(minutes, seconds))
# 메인 함수
def run_random_search(X_train, y_train):
models_params = {
'XGBRegressor': (xgb.XGBRegressor(), {
"max_depth": [5, 8, 10],
"min_child_weight": [1, 3, 6, 8],
"colsample_bytree": [0.3, 0.5, 0.7],
"n_estimators": [90, 100, 200],
"learning_rate": [0.05, 0.07, 0.1],
"subsample": [0.6, 0.7, 0.8],
"gamma": [0, 0.1, 0.2],
"random_state": [42]
}),
'LGBMRegressor': (LGBMRegressor(force_row_wise=True, verbose=-1), {
"learning_rate": [0.1, 0.15, 0.2],
"max_depth": [6, 10, 20],
"num_leaves": [31, 63, 127],
"n_estimators": [150, 200, 300],
"min_child_weight": [10, 20, 30],
"colsample_bytree": [0.5, 0.7, 0.9],
"random_state": [42]
}),
'CatBoostRegressor': (CatBoostRegressor(verbose=False), {
"depth": [6, 8, 10],
"iterations": [100, 150, 200, 300],
"learning_rate": [0.09, 0.1, 0.15],
"border_count": [128, 254, 512],
"l2_leaf_reg": [3, 5, 9],
"random_state": [42]
}),
}
for model_name, (model, params) in models_params.items():
execute_random_search(model_name, model, params, X_train, y_train)
# 실행
run_random_search(X_train, y_train)
4.2 RandomizedSearchCV 파라미터 설명
- estimator: 하이퍼파라미터를 튜닝할 모델 객체입니다.
- param_distributions: 탐색할 하이퍼파라미터의 분포를 사전(dictionary) 형태로 제공합니다. 무작위로 선택될 값의 리스트를 포함합니다.
- n_iter: 하이퍼파라미터 설정의 수를 정의합니다. 여기서는 100번의 다른 조합으로 모델을 평가합니다.
- scoring: 모델 평가 기준을 정의합니다. 이 예에서는 'neg_mean_squared_error'를 사용하여 평균 제곱 오차의 음수 값을 사용합니다.
- cv: 교차 검증 분할 수를 지정합니다. 여기서는 5로 설정되어 있습니다.
- refit: 최적의 파라미터를 찾은 후 주어진 데이터에 대해 모델을 다시 학습시킬지 여부를 결정합니다. True로 설정되어 있습니다.
- n_jobs: 동시에 실행할 작업의 수를 지정합니다. -1은 가능한 모든 프로세서를 사용한다는 것을 의미합니다.
- verbose: 로그 출력의 상세도를 조절합니다. 2로 설정되어 있어 중간 결과도 출력됩니다.
4.3 RandomizedSearchCV 사용 결과
사용하고 나면 다음과 같은 결과가 출력됩니다.
- 전체 화면
- 결과 확대 화면
5. 결론
개인적으로 하이퍼파라미터 튜닝 과정에서 시간은 정말 중요하다고 생각합니다.
만약 여러분이 GridSearchCV를 사용해 오면서 긴 학습 시간을 경험하셨다면, RandomSearchCV를 고려해 보시는 것을 추천드립니다. RandomSearchCV는 GridSearchCV에 비해 더 짧은 시간 안에 하이퍼파라미터의 효율적인 조합을 찾을 수 있습니다. 특히 많은 수의 하이퍼파라미터를 가진 모델에서 더욱 두드러집니다.
하이퍼파라미터 튜닝을 통해 여러분의 모델 성능을 최적화하고, 예측 정확도를 향상시켜 보세요!
그리고 Sklearn공식 홈페이지에 있는 RandomeSearchCV 링크를 공유드립니다 : 공식홈페이지 바로가기
추가적으로 GridSearchCV와 Optuna에 대한 설명도 첨부드려요 ~!
댓글