Python

하이퍼 파라미터 - Grid Search, Random Search

jsys 2024. 2. 19. 17:44

 

* 하이퍼 파라미터

: 머신러닝 알고리즘을 구성하는 주요 구성 요소. 모델의 학습 과정이나 구조를 제어하는 매개변수로, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있다.

-> 학습 알고리즘들은 각각 다른 하이퍼 파라미터를 가지게 되는데, 모델은 주어진 하이퍼 파라미터를 가지고 데이터를 학습하게 된다.(ex. 의사 결정 트리의 최대 깊이, 랜덤 포레스트의 트리 개수 등)

 

 


* Grid Search

: 가능한 모든 하이퍼파라미터 조합을 시도하여 최적의 조합을 찾는 방법. 촘촘하게 파라미터를 입력하면서 테스트를 하는 방식

 

> 주어진 각 하이퍼파라미터에 대해 미리 정의된 값의 그리드(격자)를 만들고, 이 그리드의 모든 조합을 탐색함
> 각 조합에 대해 교차 검증을 사용하여 모델을 평가하고, 최적의 하이퍼파라미터 조합을 선택한다.
> 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸린다. 

> Scikit-learn 라이브러리가 GridSearchCV라는 함수를 제공

 

 

> 다음은 결정 트리 알고리즘의 최적화 파라미터를 순차적으로 적용해 붓꽃 데이터를 예측 분석하는 데 GridSearchCV를 이용한 예제이다.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

# 데이터를 로딩하고 학습데이터와 테스트 데이터 분리
iris_data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, 
                                                    test_size=0.2, random_state=121)
dtree = DecisionTreeClassifier()

# 파라미터를 딕셔너리 형태로 설정
parameters = {
    "max_depth" : [1, 2 ,3],
    "min_samples_split" : [2, 3]
}

>> max_depth와 min_sample_split의 값을 변화시키면서 최적화를 진행

 

 

import pandas as pd

# Grid Search
grid_dtree = GridSearchCV(dtree, param_grid = parameters, cv = 3, refit=True)  # 가장 좋은 파라미터 설정으로 재학습 시킴

# Grid Search 학습
grid_dtree.fit(X_train, y_train)

# GridSearchCV 결과 추출
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df

>> 학습 데이터 세트를 GridSearchSV 객체의 fit 메서드에 인자로 입력

 

* param_grid : key+리스트 값을 가지는 딕셔너리가 주어짐. 파라미터명과 사용될 여러 파라미터 값 지정

* cv : Cross Validation의 약자. 교차 검증을 위해 분할되는 학습/테스트 세트의 개수를 지정

* refit : 디폴트가 True로, True이면 가장 최적의 하이퍼 파라미터 설정으로 재학습시킴.

 

 

>> 결과 칼럼별 의미

params : 수행할 때마다 적용된 개별 하이퍼 파라미터값

rank_test_score : 하이퍼 파라미터별로 성능이 좋은 socre 순위를 나타냄. 1이 가장 뛰어난 순위

mean_test_score : 개별 하이퍼 파라미터별로 CV의 폴딩 테스트 세트에 대해 총 수행한 평가 평균값

 

 

 

# 최적의 파라미터
grid_dtree.best_params_

>> out:

{'max_depth': 3, 'min_samples_split': 2}

 

# 최고 정확도
grid_dtree.best_score_

>> out: 

0.975

 

>> max_depth가 3, min_samples_split가 2일 때 평균 최고 정확도가 97.50%

 

 

 

estimator = grid_dtree.best_estimator_  # 재학습
pred = estimator.predict(X_test)
accuracy_score(y_test, pred)

>> out:

0.9666666666666667

 

>> 테스트 데이터 세트의 정확도가 약 96.67%라는 결과가 도출됨

 

 

 

 

 


* Random Search

: 하이퍼파라미터 공간에서 무작위로 조합을 선택하여 최적의 조합을 찾는 방법.

 

> 미리 지정된 횟수나 시간 동안 무작위로 하이퍼파라미터를 샘플링하여 모델을 평가함.

> Random Search는 하이퍼파라미터로 시도할 숫자의 구간과, 횟수를 정해준다.(Grid Search는 실험할 하이퍼파라미터들을 명시적으로 정해줘야 함)
> Grid Search와 달리 모든 조합을 탐색하지 않기 때문에 계산 비용이 덜 들 수 있음.
> 무작위로 샘플링하기 때문에 어떤 경우에는 Grid Search보다 더 나은 성능을 보일 수 있다. 특히 하이퍼파라미터의 중요도나 상호작용이 불분명한 경우에 유용하다.

(Grid를 만들어서 하이퍼파라미터를 찾는 것보다, 랜덤으로 숫자를 뽑아서 그걸 하이퍼파라미터로 시도해보는 것이 더 좋은 성능의 모델을 찾는 확률을 높일 수 있다는 것)
> Scikit-learn의 RandomSearchCV라는 함수를 활용하면 짧은 코드로도 Random Search를 구현할 수 있음

 

 

 

 

 

* Grid Search VS Random Search

(참고: https://www.linkedin.com/pulse/tale-hyperparameter-tuning-random-search-cv-grid-swaroop-piduguralla)

 

Random Search CV: 조합을 무작위로 샘플링하여 탐색에 중점을 둔다. (더 넓은 범위 탐색 가능)

Grid Search CV: 모든 조합을 체계적으로 평가한다. (지정된 범위 내 철저한 탐색 가능)

 

>> 검색 공간이 큰 경우 Random Search CV가 더 효율적/ 검색 공간이 상대적으로 작고 계산이 가능한 경우 Grid Search CV

>> Random Search CV는 조합을 무작위로 선택하기 때문에 최상의 하이퍼파라미터 세트를 찾을 수 없을 가능성이 있다./ 반면에 Grid Search CV는 지정된 그리드 내에서 최적의 설정을 찾을 가능성이 높다.

 

 

 

'Python' 카테고리의 다른 글

[머신러닝] 분류모델 평가지표  (0) 2024.02.20
Feature Enginering  (0) 2024.02.19
PyCaret Windows 10 아나콘다 설치  (0) 2024.02.14
환경 변수 설정으로 API 키 숨기기  (0) 2024.02.01
[Streamlit] Input widgets(예시/연습)  (1) 2024.01.29