머신러닝 | 교차 검증과 그리드 서치 | 최적의 파라미터를 찾아주는 교차검증 방법

2022. 2. 11. 20:28·데이터분석과 머신러닝

한빛미디어 도서 <혼자 공부하는 머신러닝+딥러닝>의 전개를 따른 내용이다.

챕터 5, 트리 알고리즘

* 성능이 좋고 이해하기 쉬운 트리 알고리즘 배우기
* 알고리즘 성능을 최대화하기 위한 하이퍼파라미터 튜닝 실습
* 여러 트리를 합쳐 일반화 성능을 높일 수 있는 앙상블 모델 배우기

 

혼공머신 책에서 하이퍼파라미터라는 용어를 처음 만났을 때, 

이걸 최적으로 결정하는 방법은 바로바로 5장에서 배운다고 해서 기다려졌던... 5장..!

 


# 검증 세트 

 

▶ 테스트 세트로 성능을 조정할 경우의 문제점 :

일반화된 모델을 만들어야 하는데, '테스트 세트'에 적절한 모델이 만들어진다.

 

▶ 해결 방법 :

훈련세트의 일부를 떼어내 검증세트로 둔다. (훈련세트의 크기는 작아진다)

* 검증세트는 여러개 둘 수 있다 => 교차검증

모델 성능을 개선 기준을 검증세트에 두고 최적화한다. 

즉, 검증세트의 score가 좋아지도록 모델의 매개변수를 조정해간다.

그리고 가장 마지막에는 "테스트 세트를 딱 한번만 체크"하여 성능 확인을 끝낸다.

 

 

모델의 fit은 현재 검증세트를 제외한 나머지 train set으로 한다.

fit한 뒤에 score를 확인해보았다.

 

validation set의 score를 확인해보니, train set의 score보다 많이 작다.

∴ 모델의 파라미터를 좀 조정하여 validation set의 score를 높여야겠다.  

 

 

 

# 교차검증 해보기

사이킷런의 교차검증 메서드 cross_validate()를 사용해보자.

 

* 짚고 가기

검증세트1, ..., k 中 검증세트3의 score는

모델을 검증세트 3만을 제외한 train set으로 fit한 모델이 도출한 score다.

최종 검증점수는 각 검증세트에 대한 score의 평균이다.

 

* k-Fold 교차검증

train set을 k분할로 나누어 검증세트로 둔다. 

 

.

.

 

cross_validate()

▶ 기본값 : 5-폴드 교차검증

▶ 폴드를 골고루 나누는 방법? :

검증세트에 타깃 클래스를 골고루 나누기 위해서는 분할기를 사용해야 한다.

기본값으로 StratifiedKFold() 분할기가 지정되어있다.

분할기 StratifiedKFold()에 shuffle=True 매개변수를 지정하면 train set을 골고루 섞은 교차세트를 만들 수 있다.

(회귀 모델의 경우 KFold 분할기를 사용)

 

 

cross_validate에 분할기 매개변수 cv를 지정하지 않은 상태
 
cross_validate()의 리턴값 : 딕셔너리
{'fit_time': array([0.01010561, 0.00961161, 0.01013398, 0.01000714, 0.00965095]),
'score_time': array([0.00130916, 0.00123882, 0.00117517, 0.00128078, 0.00116754]),
'test_score': array([0.86923077, 0.84615385, 0.87680462, 0.84889317, 0.83541867])}

 

리턴하는 딕셔너리의 세번째 키인 test_score에는 k개의 값이 담겨있다. 

이를 평균내서 교차검증의 최종 score를 얻는 원리다.

 

평균낸 값이 교차검증의 score다.

 

▶ 이때, 분할기 StratifiedKFold()의 shuffle 매개변수를 True로 설정하여 cross_validate()에 cv=분할기 매개변수를 넣으면, train set를 골고루 섞어서 검증세트들을 만들 수 있다. 

 

 

* 참고

StratifiedKFold 매개변수에서 random_state는 shuffle과 관련된 매개변수다.

그래서 shuffle이 False인데 random_state를 지정하면 이런 오류가 뜬다.

ValueError: Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True.

 

+ 추가실습

더보기

shuffle=False, random_state=None이고 n_splite=5인 상태가,

cross_validate() 메서드의 cv=StratifiedKFold() 기본값이다.

따라서 아래 score 결과는 동일하다

 

 

 

또한 이 모델에서는 n_splites=10으로 지정하여 교차검증의 횟수를 늘리면,

검증세트들의 평균 score가 증가한다.

 

 

 

 


# 하이퍼파라미터의 최적 조합 찾기 - 랜덤서치

 

교차검증 score를 높게 하기 위해서 하이퍼파라미터들의 최적 조합을 찾아야 한다. 

사이킷런의 GridSearchCV 클래스가 그 최적조합 찾기를 도와준다!

 

▶ GridSearchCV객체에 '모델', '파라미터 정보', 'CPU코어수'를 넘기면 된다.

* 그리고 '전체 train set'으로 fit한다. (검증세트 나눈 거 말고!)

 

▶ 그러면 각 파라미터 경우별로 최상의 교차검증 scroe를 확인가능하고,

최적의 파라미터값 또한 알 수 있다. 

* 교차검증은 5회가 기본값이다

 

 


 

# 여러 하이퍼파라미터를 전달하는 경우

두가지 교차검증 모델을 사용할 수 있다. 

 

① GridSearchCV 클래스 이용

각 하이퍼파라미터의 수치 범위는 임의의 범위, 임의의 간격으로 지정해주었다.

다만 이렇게 임의로 했을 경우 그 범위나 간격이 올바른지에 대한 판단이 또 필요하다. 

 

 

② RandomizedSearchCV 이용

이번에는 파라미터의 범위만 지정하고 간격은 지정하지 않는다.

사이파이 라이브러리의 uniform, randint를 사용할 것이다. 

 

RandomizedSearchCV 객체의 파라미터 자리 (param_distributions)에는 딕셔너리가 들어가는데, 딕셔너리의 value에는 확률분포가 들어가야 한다.

더보기
사이킷런 문서의 해당 내용

 

[ 과정 ]

① 어떤 확률분포의 지정범위내에서 랜덤으로 하이퍼파라미터 샘플을 뽑는다.

② 총 n번 샘플링하여 n회 교차검증을 시행하도록 객체에 전달하고, fit한다.

* n회 교차검증을 한다는 것의 의미를 오해하지 말자. 

k-fold 교차검증의 score는 k개의 검증세트 score를 평균낸 것이다. 

이 k-fold 교차검증을 100회 시행하여 100개의 교차검증 score를 얻어서, 가장 좋은 score를 얻는 하이퍼파라미터 값이 무엇인지 알아내는 실습임을 확실히 하자! 

 

랜덤 샘플링 대상 : scipy의 확률분포 객체를 이용한다.
n_iter=100으로, 총 100번 샘플링하여 교차검증하게 된다.

 

 

결과 확인:

더보기

▶ 총 100회의 교차검증 결과 (파라미터값은 랜덤 샘플링됨) ◀

 

 

▶ 이 중 가장 큰 값이 최적 모델의 교차검증 결과다! ◀

 

 

▶ 어떤 파라미터값이 최적이었을까? ◀

 

최적의 파라미터값을 확인가능하다

 

 

위와 같이(접은글) 최적의 모델을 만드는 하이퍼파라미터값을 알아냈다. 

그러면 가장 마지막으로,

test set의 score를 확인해보면 된다. 

 

 


+추가실습

 

교차검증 cross_validate()에서 cv 매개변수에 분할기 StratifiedKFold()를 전달한 것을 기억해보자.

RandomizedSearchCV 객체에도 기본적으로 StratifiedKFold() 분할기가 지정된다. (아래 문서 참고)

기본적으로 5-fold 교차검증이 사용된다. 

 

① 10-fold로 바꾸어 실습해보았다. 

score가 높아졌다. (차이는 근소했음)

 

 

 

② fold는 무조건 같은 수로 분할이 되는 걸까?

최대한 같은 수로 fold를 나누는 것을 확인가능했다.

StratifiedKFold 클래스의 split()메서드에 train_input과 train_target을 매개변수에 넘겨주면, 해당 train set을 또다시 train set과 validation set으로 나눈 index들을 반환해준다. 

현재 StratifiedKFold 객체에 n_splits가 10으로 지정되어 있기에, 검증세트는 총 10개 만들 수 있다.

 

 


이번 내용 요약

 

- 하이퍼파라미터 튜닝은 랜덤서치 클래스를 이용하면 좋다!

range로 간격을 딱 정하지 말고, 확률분포 객체를 이용하여 훨씬 넓은 범위의 파라미터 조합을 만들어내서 교차검증할 수 있다. 

 


 

이전 글:

머신러닝 | 트리 알고리즘 - 결정 트리 (Decision tree model)

 

다음 글: 

머신러닝 | 트리의 앙상블 | sklearn 앙상블 모델 4종류 특징 비교

 

 

 

 

반응형

'데이터분석과 머신러닝' 카테고리의 다른 글

혼공단 7기 4주차 미션인증  (0) 2022.02.13
머신러닝 | 트리의 앙상블 | sklearn 앙상블 모델 4종류 특징 비교  (0) 2022.02.13
머신러닝 | 트리 알고리즘 - 결정 트리 (Decision tree model)  (0) 2022.02.10
머신러닝 | 확률적 경사 하강법  (0) 2022.01.30
혼공단 7기 3주차 미션인증  (0) 2022.01.30
'데이터분석과 머신러닝' 카테고리의 다른 글
  • 혼공단 7기 4주차 미션인증
  • 머신러닝 | 트리의 앙상블 | sklearn 앙상블 모델 4종류 특징 비교
  • 머신러닝 | 트리 알고리즘 - 결정 트리 (Decision tree model)
  • 머신러닝 | 확률적 경사 하강법
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
머신러닝 | 교차 검증과 그리드 서치 | 최적의 파라미터를 찾아주는 교차검증 방법
상단으로

티스토리툴바