하이퍼 파라미터
머신러닝 알고리즘을 구성하는 주요 구성 요소, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있음
GridSearchCV
교차 검증을 기반으로 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터의 최적 값을 찾아 줌
즉, 데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 해줌
(순차적으로 파라미터를 테스트 하기 때문에, 수행 시간이 상대적으로 오래 걸림!)
주요 매개변수
- estimator(string) : classifier, regressor, pipeline (모델 객체 지정)
- param_grid(dict) : 사용될 파라미터명, 값 을 dict 형태로
- scoring(string) : 예측 성능을 측정할 평가 방법 지정
- cv(int) : 교차 검증을 위하 분할되는 학습/테스트 세트의 개수 지정
- refit(bool) : true인 경우 최적의 하이퍼 파라미터를 찾은 후 입력된 개체를 해당 하이퍼 파라미터로 재학습
- verbose: GridSearchCV의 iteration시마다 수행 결과 메시지를 출력
verbose=0(default)면 메시지 출력 안함
verbose=1이면 간단한 메시지 출력
verbose=2이면 하이퍼 파라미터별 메시지 출력
예시
1. GridSearchCV를 이용하여 최적의 파라미터 추출
- max_depth : 트리의 최대 깊이, 깊이가 깊어지면 과적합될 수 있음.
- min_samples_leaf : 리프노드가 되기 위해 필요한 최소한의 샘플 데이터수 (과적합 제어 용도), 작게 설정 필요
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]
}
import pandas as pd
# Grid Search
grid_dtree = GridSearchCV(dtree, param_grid = parameters, cv = 3, refit=True) #refit=True 가 default 임. True이면 가장 좋은 파라미터 설정으로 재 학습 시킴.
# Grid Search 학습
grid_dtree.fit(X_train, y_train)
# 결과 추출
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df
- params : 적용된 개별 하이퍼 파라미터의 값
- mean_test_score : 세트에 대해 수행된 성능들의 평균값
- rank_test_score : mean_test_score을 바탕으로 평가 순위
- split_test_score : 각 세트별 정확도
위 표에서 4번 행의 rank_test_score의 칼럼 값이 1임, 이것은 해당 파라미터 조합인 max_depth:3, min_samples_split: 2로 평가한 경과 예측 성능이 1위라는 뜻
# 최적의 파라미터
print(grid_dtree.best_params_)
# 최고 정확도
grid_dtree.best_score_
2. 최적의 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 best_estimate_로 저장 & 학습된 best_estimator를 이용해 train_test_split()으로 분리한 테스트 데이터 세트에 대해 예측하고 성능 평가
# GridSearchCV의 refit으로 이미 학습된 estimator 반환
estimator = grid_dtree.best_estimator_
estimator
#GridSearchCV의 best_estimator_는 이미 최적의 학습이 됐으므로 별도 학습 필요 없음
pred = estimator.predict(X_test)
accuracy_score(y_test, pred) #테스트 세트의 정확도 출력
GridSearchCV의 단점
- 최적의 해를 찾지 못하는 경우가 생길 수 있다.
- 동작 방식이 비효율적이다. 지정한 모든 구간을 탐색해야 하기 때문에 굳이 탐색하지 않아도 되는 하이퍼파라미터 값에 대해서도 탐색하는 경우가 생긴다.
RandomizedSearchCV
임의의 하이퍼파라미터를 선정하는 과정을 통해 최적의 해를 찾아가는 기법
랜덤 서치는 그리드 서치에서는 선정되지 않은 하이퍼파라미터에 대해 탐색할 수도 있다는 장점이 있다.
특히, 그리드 서치에 비해 최적의 해를 확률적으로 더 빨리 찾을 수 있다는 장점이 있다.
주요 매개변수
- estimator(string) : classifier, regressor, pipeline (모델 객체 지정)
- param_grid(dict) : 사용될 파라미터명, 값 을 dict 형태로
- n_iter : 파라미터 검색 횟수
- scoring(string) : 예측 성능을 측정할 평가 방법 지정
- cv(int) : 교차 검증을 위하 분할되는 학습/테스트 세트의 개수 지정
- refit(bool) : true인 경우 최적의 하이퍼 파라미터를 찾은 후 입력된 개체를 해당 하이퍼 파라미터로 재학습
GridSearchCV와는 다르게 n_iter변수에 파라미터 검색 횟수를 지정하여, 지정한 횟수만큼만 조합을 반복하여 평가
딕셔너리로 정의된 파라미터 공간에서 무작위로 조합을 선택하여 해당 횟수만큼 모델을 학습하고 성능을 평가
GridSearchCV에서 사용했던 코드를 RandomizedSearchCV 버전으로 바꾼 코드 예시
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, RandomizedSearchCV
import numpy as np
# 데이터를 로딩하고 학습데이터와 테스트 데이터 분리
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]
}
import pandas as pd
# Randomized Search
random_dtree = RandomizedSearchCV(dtree, param_distributions=parameters, n_iter=5, cv=3, refit=True)
# Randomized Search 학습
random_dtree.fit(X_train, y_train)
# 결과 추출
scores_df = pd.DataFrame(random_dtree.cv_results_)
scores_df
✍️ GridSearchCV vs RandomizedSearchCV
- GridSearchCV: 사용자가 사전에 지정한 값들의 모든 조합을 시도하여 최적의 하이퍼파라미터 조합을 찾는다. 사용자가 탐색하려는 하이퍼파라미터의 값들을 그리드 형태로 지정해야 한다. 이는 모든 가능한 조합을 탐색하므로 하이퍼파라미터 값들의 조합이 많을수록 계산 비용이 높아짐
- RandomSearchCV: 사용자가 사전에 지정한 값들의 범위를 기반으로 무작위로 하이퍼파라미터 조합을 선택하여 탐색. 사용자는 각 하이퍼파라미터의 값들의 범위를 지정하고, 이 범위 내에서 무작위로 선택된 조합을 평가한다. 이 방법은 모든 가능한 조합을 시도하지 않으므로 GridSearchCV에 비해 계산 비용이 낮을 수 있음
'머신러닝' 카테고리의 다른 글
[머신러닝] 피처스케일링 - StandardScaler, MinMaxScaler (0) | 2024.02.19 |
---|---|
[머신러닝] 데이터 전처리 - Label Encoding, One-Hot Encoding, get_dummies() (0) | 2024.02.19 |
[머신러닝] K-폴드 교차 검증, stratified K폴드(층화추출) (0) | 2024.02.14 |
[머신러닝] 사이킷런 활용하여 붓꽃 품종 예측하기 (0) | 2024.02.14 |
머신러닝 - pycaret 설치 (0) | 2024.02.14 |