본문 바로가기

Personal/AI, Big Data

혼공머신 12강 - 교차 검증과 그리드 서치

* 혼자공부하는 머신러닝 + 딥러닝 책의 Youtube 강의를 보며 실습 및 공부한 내용입니다.

 

Chapter 05 트리 알고리즘

05 -2 교차 검증과 그리드 서치

목적: 검증 세트가 필요한 이유를 이해하고 교차 검증에 대해 배웁니다. 그리드 서치와 랜덤 서치를 이용해 최적의 성능을 내는 하이퍼파라미터를 찾습니다.

핵심 키워드: 검증 세트, 교차 검증, 그리드 서치, 랜덤 서치

 

책 242p 시작하기 전 에피소드

-> 테스트 세트를 사용해 자꾸 성능을 확인하면 점점 테스트 세트에 맞추게 된다. 테스트 세트로 일반화 성능을 올바르게 예측하려면 가능한 한 테스트 세트를 사용하지 말아야 한다.  max_depth 매개변수를 사용한 하이퍼파라미터 튜닝을 어떻게 할 수 있을까?

 

검증 세트

-> 검증 세트: 하이퍼파라미터 튜닝을 위해 모델을 평가할 때, 테스트 세트를 사용하지 않기 위해 훈련 세트에서 다시 떼어 낸 데이터 세트입니다.

+ 테스트 세트와 검증 세트에 얼마나 많은 샘플을 덜어 놔야 하나? 보통 20~30% 훈련 데이터가 아주 많으면 단 몇%만으로도 가능하다.

 

이전 강의에서 사용한 데이터 불러옴.
class 열 타깃으로 사용. 나머지 열은 특성 배열에 저장.

 

훈련 세트와 테스트 세트 나누는 코드
훈련 세트 sub_~, 검증 세트 val_~ 배열을 만든다.
훈련세트와 검증 세트의 크기를 확인해 보자.

원래 5,197개였던 훈련 세트가 4,157개로 줄었다. 검증 세트는 1,040개이다.

sub_~ 2개와 val_~ 2개를 활용해 모델을 만들고 평가해보자.

훈련 세트에 과대적합된 것을 알 수 있다.

 

결정 트리

-> 검증 세트를 떼어 내어 평가하는 과정을 여러 번 반복한다.

-> 이 점수를 평균하여 최종 점수를 얻는다.

3-폴드 교차 검증

+ 3-폴드 교차 검증이란? 훈련 세트를 세 부분으로 나눠서 교차 검증을 수행하는 것을 3-폴드 교차 검증이라고 한다. 훈련 세트를 몇 부분으로 나누냐에 따라 k-폴드 교차 검증 또는 k-겹 교차 검증이라고도 부른다.

 

-> 보통 5-폴드 교차 검증이나 10-폴드 교차 검증을 많이 사용한다.

-> 이렇게 하면 데이터의 80~90%까지 훈련에 사용할 수 있다.

cross_validate() 함수는 교차 검증 함수로 사이킷런에 있다. 사용법은 먼저 평가할 모델 객체를 첫 번째 매개변수로 전달하고 그 다음 훈련 세트 전체를 전달하면 된다.

 

직접 실습
책의 위 실습 결과

fit_time과 score_time은 코랩에서 리소스를 사용하는 상황에 따라 달라질 수 있어서 실습한 값과 책의 값이 다르다.

cross_validate() 함수는 기본적으로 5-폴드 교차 검증을 수행하여 각 키마다 5개의 숫자가 담겨있다. 교차 검증의 최종 점수를 얻어보자. test_score 키에 담긴 5개의 점수를 평균하여 얻을 수 있다.

 

교차 검증 최종 점수 계산 결과

주의할 점: cross_validate() 는 훈련 세트를 섞어 폴드를 나누지 않는다. 그래서 교차 검증을 할 때 훈련 세트를 섞으려면 분할기를 지정해야 한다. 사이킷런의 분할기는 교차 검증에서 폴드를 어떻게 나눌지 결정해 준다.

cross_validate() 함수는 기본적으로 회귀 모델일 경우 KFold 분할기를 사용하고 분류 모델일 경우 타깃 클래스를 골고루 나누기 위해 StatifiedKFold를 사용한다.

 

앞서 수행한 교차 검증과 동일한 코드
훈련 세트를 섞은 후 10-폴드 교차 검증 수행

n_splits 매개변수는 몇 폴드 교차 검증을 할지 정한다. 

KFold 클래스도 동일한 방식으로 사용할 수 있다.

이제 결정 트리의 매개변수 값을 바꿔가며 가장 좋은 성능이 나오는 모델을 찾아 보자.

테스트 세트를 사용하지 않고 교차 검증을 통해 좋은 모델을 고르면 된다.

 

하이퍼파라미터 튜닝

머신러닝 모델이 학습하는 파라미터를 모델 파라미터라고 부른다.

모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터를 하이퍼파라미터라고 한다.

사이킷런과 같은 머신러닝 라이브러리를 사용할 때는 모두 클래스나 메서드의 매개변수로 표현되는 것이 하이퍼파라미터.

 

하이퍼파라미터 튜닝 방법

-> 라이브러리가 제공하는 기본값을 그대로 사용해 모델을 훈련한다.

-> 검증 세트의 점수나 교차 검증을 통해서 매개변수를 조금씩 바꿔 본다.

-> 모델의 매개변수를 바꿔가면서 모델을 훈련하고 교차 검증을 수행해야 한다.

+ 사람의 개입 없이 하이퍼파라미터 튜닝을 자동으로 수행하는 기술은: AutoML

 

=> 사이킷런에서 제공하는 그리드 서치를 사용한다.

 

사이킷런의 GridSearchCV 클래스

-> 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행한다.

-> 별도로 cross_validate() 함수를 호출할 필요가 없다.

5개의 값을 시도하기 위해 클래스에 탐색 대상 모델과 변수 전달해 그리드 서치 객체를 만들었다.
결정 트리 클래스의 객체를 생성하자마자 바로 전달
fit 메서드 호출하면 그리드 서치 객체는 결정 트리 모델 값을 바꿔가며 5번 실행됨.

 

best_estimator_ 속성에 검증 점수가 가장 높은 모델이 저장되어 있다.

이 모델을 일반 결정 트리처럼 똑같이 사용할 수 있다.

그리드 서치로 찾은 최적의 매개변수
각 매개변수에서 수행한 교차 검증의 평균 점수 출력
argmax 함수로 가장 큰 값의 인덱스를 추출했다. 그 다음 매개변수 출력
그리드 서치 과정
조금 더 복잡한 매개변수 조합을 탐색하자.

min一impurity_decrease는 노드를 분할하기 위한 불순도 감소 최소량

max_depth로 트리의 깊이 제한

min_samples_split 노드를 나누기 위한 최소 샘플 수

이 매개변수로 수행할교차 검증 횟수는 9(arrange함수 결과)x15(range함수 결과)x10(range함수 결과)으로 1,350이다. 기본 5-폴드 교차 검증을 수행하므로 6,750의 모델 수가 만들어진다.

 

그리드 서치 실행 및 최상의 매개변수 조합 확인
최상의 교차 검증 점수 확인

랜덤 서치

매개변수의 값이 수치일 때 값의 범위나 간격을 정하기 어려울 수 있다.

또 너무 많은 매개변수 조건이 있어 그리드 서치 수행 시간이 오래 걸릴 수 있다.

위의 2가지 상황에서 랜덤 서치를 사용하면 좋다.

 

랜덤 서치에는 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달한다.

+싸이파이(scipy) 라이브러리란? 파이썬의 핵심 과학 라이브러리 중 하나로 적분, 보간, 선형 대수, 확률 등을 포함한 수치 계산 전용 라이브러리이다.

싸이파이에서 2개의 확률 분포 클래스 임포트 및 10개의 숫자 샘플링

uniform과 randint는 주어진 범위에서 고르게 값을 뽑는다. => '균등 분포에서 샘플링한다.'

randint는 정숫값을 uniform은 실숫값을 뽑는다.

randint 객체를 만들고 10개의 숫자를 샘플링해보았다.

1,000개를 샘플링해서 각 숫자의 개수를 세어 본 결과
uniform 클래스 사용해서 10개의 실수 추출
탐색할 매개변수의 딕셔너리 생성
RandomizedSearchCV 클래스로 랜덤 서치 수행
최적의 매개변수 조합과 최고의 교차 검증 점수 확인
최적 모델로 테스트 세트 성능 확인

 

결론

검증 세트 여러 번 반복하면 교차 검증 -> 하이퍼파라미터 탐색은 그리드 서치를 사용 -> 매개변수 값이 수치형이고 특히 연속적인 실숫값이면 랜덤 서치 활용