본문 바로가기
Study/Machine learning

[Machine learning] 쉽게 설명하는 Grid search - 모델 성능을 최고로 만드는 hyper parameter를 찾아서 (200727)

by 후이 (hui) 2020. 7. 27.
728x90
반응형

 

 

index

1. Grid search 의 정의 

2. 코드 구현 및 결과

3. 유사한 다른 방법들 

 

1. Grid search 란 무엇인가?

0) 컨셉  : 모델에게 가장 적합한 하이퍼 파라미터를 찾기 

Grid search (격자 탐색) 은 모델 하이퍼 파라미터에 넣을 수 있는 값들을

순차적으로 입력한뒤에 가장 높은 성능을 보이는 하이퍼 파라미터들을 찾는 탐색 방법이다. 

 

다시 모델을 학생에 비유해보자면, 학생에게 문제집을 공부시키기 위해선 여러가지 공부법이 있다.

이 공부법들은 머신러닝/딥러닝 수많은 학습 모델 종류들에 해당 된다. 

그리고 그 공부 방법에서도 세부적인 규율들이 있을 것이다.

 

하루에 몇쪽 풀고 모의고사 칠지, 몇번씩 보고 다음페이지 넘어갈지 어디까지 깊게 공부할지 등등

이 세부적인 규율이 하이퍼 파라미터라 생각을 한다. 그리고 그리드 서치는 그 세부적인 규율을 일일히 다 적용해봐가면서

어떤 규율이 가장 이 공부법(모델)에 적합한지 판단하는 것이다. 

 

 

1) 하이퍼 파라미터 (hyper parameter, 초매개변수)의 개념 더 살펴보기

 : 모델을 생성할 때, 사용자가 직접 설정하는 변수가 사전적 정의이다. 

랜덤 포레스트 모델을 우리가 만든다고 하면, 트리의 개수를 몇개까지 할 것인지. 트리의 깊이는 몇까지 할 것인지

딥러닝 모델에서는 layer의 개수, 에폭(학습횟수)의 수 등이 된다.

 

즉, 그 세부적인 규율은 모델을 학습시키는 우리가 정할 수 있다는 거다. 

 

 

** 파라미터와 하이퍼 파라미터의 차이 

반면 파라미터(parameter, 매개변수)는 학습 과정에서 생성되는 변수들이다. 

랜덤 포레스트 모델과 딥러닝 모델의 학습 가중치 들이 파라미터에 해당된다. 

이건 학습 과정에서 세부적인 규율을 통해, 학생에게 축적되는 학습 내용이라 이해하는게 편하겠다. 

더보기

A model parameter is a configuration variable that is internal to the model and whose value can be estimated from data.

- They are required by the model when making predictions.
- They values define the skill of the model on your problem.
- They are estimated or learned from data.
- They are often not set manually by the practitioner.
- They are often saved as part of the learned model.

 

A model hyperparameter is a configuration that is external to the model and whose value cannot be estimated from data.

- They are often used in processes to help estimate model parameters.
- They are often specified by the practitioner.
- They can often be set using heuristics.
- They are often tuned for a given predictive modeling problem.

출처 : Machine Learning Mastery

(내가 본 설명 블로그 링크는 : https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-13-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0Parameter%EC%99%80-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0Hyper-parameter

 

 

+) 딥러닝이건 머신러닝이건 결국 아주 복잡한 함수의 가중치를 찾아나가는 과정이다.

여기서 핵심인 가중치가 바로 파라미터이다. 따라서 파라미터는 학습 과정에서 생성되는 것이며 

y =4x+3 과 같은 1차 식에서는 파라미터가 4 라고 말할 수 있지만

엄청난 차원의 함수인 딥러닝 머신러닝 모델의 경우에는 파라미터가 딱 이 숫자다! 라고 표현할 수 없다. 

 

결론 : 그리드 서치를 하는 이유는

" 가장 우수한 성능을 보이는 모델의 하이퍼 파라미터를 찾기 위해서 "

이유는 단순하다. 모든 경우의 수를 때려 넣어보고 가장 성능이 좋게 만드는 모델의 하이퍼 파라미터를 찾는거다. 

 

2. 코드 구현 및 결과  (출처 : 파이썬 머신러닝 완벽 가이드) 

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

# 데이터를 로딩하고 학습데이타와 테스트 데이터 분리
iris = 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()

### parameter 들을 dictionary 형태로 설정
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}


# param_grid의 하이퍼 파라미터들을 3개의 train, test set fold 로 나누어서 테스트 수행 설정.  
### refit=True 가 default 임. True이면 가장 좋은 파라미터 설정으로 재 학습 시킴.  
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)

# 붓꽃 Train 데이터로 param_grid의 하이퍼 파라미터들을 순차적으로 학습/평가 .
grid_dtree.fit(X_train, y_train)

# GridSearchCV 결과 추출하여 DataFrame으로 변환
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', \
           'split0_test_score', 'split1_test_score', 'split2_test_score']]
           

 



 

출력 결과는 다음과 같다. 그리드 서치는 딕셔너리 형태의 파라미터 변수를 통해 입력되고 

해당 코드에서 사용한 하이퍼 파라미터는  결정트리 모델에서의 최대 트리 깊이 (max_depth)  // 노드를 분할하기 위한 최소한의 샘플데이터 개수 (min_sample_split)

   ( 결정 트리 의 하이퍼파라미터들에 대한 보다 깊은 설명은 아래의 링크를 따라  https://analysis-flood.tistory.com/100

그리고 grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)

여기서 param_grid 인자에 parameters(하이퍼파라미터 정보담긴 딕셔너리) 넣어줌으로써 그리드 서치 정보를 준다.  

이때 CV는 지난 시간에 살펴본 cross validation 교차 검증이다. 

 

이후 fit을 통해 학습을 진행 !

출력 결과 max_depth 3 / min_sample_split3일때 가장 높은 성능을 보이는 것을 테이블에서 확인 할 수 있다.

 

print('GridSearchCV 최적 파라미터:', grid_dtree.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dtree.best_score_))

# GridSearchCV의 refit으로 이미 학습이 된 estimator 반환
estimator = grid_dtree.best_estimator_

# GridSearchCV의 best_estimator_는 이미 최적 하이퍼 파라미터로 학습이 됨
pred = estimator.predict(X_test)
print('테스트 데이터 세트 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

 

 

결과는 아래와 같다. 

fit 한 학습 모델에서 .best_estimator_   를 활용하면, 학습 과정에서 하이퍼 파라미터 조정으로 가장 좋은 성능을 보인 모델이 반환된다. 

해당 모델을 가지고 테스트 데이터에서의 모델 성능을 평가하고 결과를 출력하게 했다. 

 

 

 

 

* 그리드 서치의 치명적인 단점 

시간이 아주~~~~~ 더럽게 ~~~~~ 많이 ~~~ 걸린다. 

당연한 것이. 모든 경우의 수를 다 넣어서 모델을 만드는 것이기 때문에, 앞에서 선언한 

parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]} 여기에 더 많은 숫자를 추가할수록 시간이 더욱 많이 걸림

 

 

3. 유사한 다른 방법들 "Hyper parameter optimization"

 

Grid search 와 같이 모델의 하이퍼 파라미터를 조정하고 찾는 과정을

Hyper parameter tuning /Hyper parameter optimization 이라 일컫는다. 

머신러닝의 경우에는 Grid search 가 Hyper parameter tuning 로 많이 쓰이지만,

또 다른 방법이나 아니면 딥러닝 모델의 경우에는 어떻게 적용 되는지 살펴보았다. 

 

 

3.1 랜덤 서치 random search

그리드 서치는 말그대로 모든 경우를 테이블로 만든뒤 격자로 탐색하는 방식에 해당한다면, 랜덤 서치는 하이퍼 파라미터 값을 랜덤하게 넣어보고 그중 우수한 값을 보인 하이퍼 파라미터를 활용해 모델을 생성한다는 것이다.

어떻게 보면 비효율 적일 수도 있는데, 랜덤 서치가 더 효율적이라는 주장도 있다 왤까? 

 

* 불필요한 탐색 횟수를 줄인다.

그리드 서치는 우리가 딕셔너리에 지정한 모든 값을 다 탐색해야만 한다. 이는 사람이 임의로 정한 값이기 때문에, 어떤 값이 효과적일지는 알 수 없고, 쨌든 입력은 되었으니 한번씩 모델은 다 생성되어야 하는 상황

--> 랜덤 서치는 위와 같은 상황을 방지한다. 랜덤하게 숫자를 넣은 뒤, 정해진 간격(grid) 사이에 위치한 값들에 대해서도 확률적으로 탐색이 가능하므로, 최적 hyperparameter 값을 더 빨리 찾을 수 있다. 

 

 

 

실제로 논문에서 랜덤 서치가 그리드 서치보다 더 성능이 좋은 것을 입증해냄.

http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf

 

 

3.2  Bayesian Optimization

자세한 설명이 담긴 링크를 뿌리고, 다음에 정리해보기로 

자세한 설명 : http://research.sualab.com/introduction/practice/2019/02/19/bayesian-optimization-overview-1.html

 

 

 

 

 

 

728x90
반응형

댓글