머신러닝 - 랜덤 서치(Random Search)
목차
본 글에서는 머신러닝에서 모델의 성능을 극대화하기 위한 하이퍼파라미터 튜닝 중 하나인 랜덤 서치(Random Search)의 개념을 설명하고, Scikit-learn 라이브러리를 사용한 구현 예를 함께 소개하겠습니다.
랜덤 서치란? #
랜덤 서치는 하이퍼파라미터의 최적 조합을 찾기 위해 주어진 파라미터 공간에서 무작위로 선택된 조합을 평가하는 방법입니다. 그리드 서치(Grid Search)가 정해진 파라미터의 모든 조합을 체계적으로 탐색하는 것과 달리, 랜덤 서치는 탐색 공간에서 랜덤하게 조합을 선택하여 평가합니다. 이 방법은 특히 하이퍼파라미터의 차원이 높거나, 탐색 공간이 클 때 유용하며, 종종 더 적은 시간 내에 비슷하거나 더 나은 결과를 도출할 수 있습니다.
주요 파라미터 #
Scikit-learn에서 RandomizedSearchCV 클래스를 통해 랜덤 서치를 구현할 수 있습니다. 주요 파라미터는 다음과 같습니다:
- estimator: 최적화할 모델을 지정합니다. 예를 들어, RandomForestClassifier(), SVC() 등입니다.
- param_distributions: 탐색할 파라미터 공간을 지정합니다. 각 파라미터에 대해 연속 분포를 지정하거나 리스트를 제공할 수 있습니다.
- n_iter: 랜덤하게 선택할 파라미터 설정의 수를 지정합니다. 이 값이 클수록 더 많은 조합을 탐색하지만, 계산 시간도 증가합니다.
- scoring: 모델의 성능을 평가할 기준을 지정합니다. 예를 들어, ‘accuracy’, ‘f1’ 등입니다.
- cv: 교차 검증 분할 전략을 지정합니다. 정수 값을 입력하면 해당 값으로 k-폴드 교차 검증을 수행합니다.
- random_state: 결과의 재현 가능성을 위해 난수 생성기의 시드 값을 지정합니다.
RandomizedSearchCV 구현 코드 #
아래는 RandomizedSearchCV를 사용하여 분류기의 최적 하이퍼파라미터를 찾는 예제입니다. 아래 코드에서는 서포트 벡터 머신(SVM)을 사용합니다.
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.svm import SVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> import scipy.stats as stats
# 데이터셋 로드
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
# 데이터셋을 훈련 세트와 테스트 세트로 분할
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 서포트 벡터 머신 인스턴스화
>>> svc = SVC()
# 탐색할 하이퍼파라미터 공간 정의
>>> param_distributions = {
'C': stats.uniform(0.1, 1000),
'gamma': stats.uniform(0.0001, 0.1),
'kernel': ['linear', 'rbf']
}
# RandomizedSearchCV 인스턴스화
>>> random_search.fit(X_train, y_train)
# 최적의 파라미터와 최고 정확도 출력
>>> print("Best parameters:", random_search.best_params_)
>>> print("Best cross-validation score: {:.2f}".format(random_search.best_score_))
# 테스트 세트에서 성능 평가
>>> accuracy = random_search.score(X_test, y_test)
>>> print("Test set accuracy: {:.2f}".format(accuracy))
이 코드는 SVC 모델에 대해 지정된 C, gamma, kernel 하이퍼파라미터의 랜덤 조합을 탐색하여 최적의 조합을 찾습니다. RandomizedSearchCV는 특히 탐색 공간이 넓을 때 그리드 서치보다 더 효과적인 방법일 수 있습니다.