오늘의 학습 목표:
🥕 검증 세트
🥕 교차검증
🥕 그리드 서치
🥕 랜덤 서치
위 네 가지에 대해서 다뤄보겠습니다.
테스트 세트를 사용하지 않고도 모델이 과대적합인지 과소적합한지 판단하기 위해서 훈련세트를 또 한번 나눠서 검증 세트를 만들 수 있습니다.
보통 2~30%를 테스트 세트와 검증 세트로 빼두지만, 훈련 데이터가 아주 많다면 테스트와 검증 세트를 단 몇 % 만 떼어 놓아도 문제가 없습니다.
훈련 세트에서 모델을 훈련하고 검증 세트로 모델을 평가하면서, 테스트하고 싶은 매개변수를 바꿔가며 가장 좋은 모델을 고를 수 있습니다.
검증세트를 구분해서 모델을 학습해보겠습니다.
와인데이터를 받아서 학습 넘파일 배열로 바꿔줍니다.
우선 훈련 세트와 테스트 세트를 구분합니다.
그 다음 훈련 세트인 train_input과 train_target을 훈련 세트인 sub_input, sub_target과 검증세트인 val_input, val_target으로 만듭니다.
훈련세트와 테스트 세트를 구분할 때처럼 test_size 매개변수를 0.2로 지정해서 약 20%를 검증세트로 만들었습니다.
결정트리 모델을 학습한 후 훈련 세트와 검증 세트에 대해서 평가를해보았는데요, 훈련 세트 점수가 훨씬 높은 걸 보니 과적합되었다는 것을 알 수 있습니다.
매개변수를 바꿔서 더 좋은 모델을 찾아보겠습니다.
검증 세트를 만드느라 훈련 세트가 줄어들었는데요, 보통은 많은 데이터를 훈련에 사용할수록 좋은 모델이 만들어집니다. 하지만 훈련 세트 양을 늘리기 위해서 검증 세트를 너무 적게 생성하면 검증 점수가 불안정해지는 문제가 생깁니다.
이 문제를 해결하기 위해서 교차검증을 사용할 수 있습니다.
교차검증
- 검증 세트를 떼어내어 평가하는 과정을 여러번 반복한 후, 점수의 평균을 내어 최종 검증 점수를 얻는 방법
위와 같이 훈련 세트를 세 부분으로 나눠서 교차 검증을 수행하는 것을 3-폴드 교차 검증이라고 합니다. (k-fold cross validation)
cross_validate( )
- 교차 검증 함수
- 평가할 모델 객체를 첫 번째 매개변수로 전달
- 훈련 세트 전체를 함수에 전달
cross_val_score( )
- cross_validate( ) 함수의 결과 중에서 test_score( ) 값만 반환
cross_validate( ) 함수는 fit_time, score_time, test_score 키를 가진 딕셔너리를 반환합니다.
처음 2개의 키는 각각 모델을 훈련하는 시간과 검증하는 시간을 의미합니다. 기본적으로 5-폴드 교차 검증을 수행하기 때문에 각 키마다 5개의 숫자가 담겨있습니다.
교차 검증의 최종점수는 test_score 키에 담긴 5개의 점수를 평균하여 얻으며 이름과 달리 검증 폴드의 점수입니다.
StratifiedKFold( )
- 교차검증 분할기
- 교차 검증을 할 때 훈련 세트를 섞는 기능
훈련 세트를 섞은 후 10-폴드 교차 검증을 수행하려면 아래와 같이 작성하면 됩니다.
머신러닝 모델이 학습하는 파라미터 중에서 사용자가 지정해야 하는 파라미터를 하이퍼파라미터라고 합니다.
하이퍼파라미터를 튜닝하는 작업은 검증 세트의 점수나 교차 검증을 통해서 매개변수를 조금씩 바꾸는 것입니다.
사람의 개입 없이 하이퍼파라미터 튜닝을 자동으로 수행하는 기술을 'AutoML'이라고 합니다.
매개변수의 종류가 많을수록 테스트해야하는 매개변수 조합은 복잡해집니다. 이 때 사이킷런에서 제공하는 그리드서치를 사용할 수 있습니다.
GridSearchCV 클래스는 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행합니다.
탐색할 매개변수와 탐색할 값의 리스트를 딕셔너리로 만듭니다.
GridSearchCV 클래스에 탐색 대상 모델과 params 변수를 전달하여 그리드서치 객체를 만듭니다.
그리고 gs 객체에 fit( )매서드를 호출하면 결정트리 모델 min_impurty_decrease 값을 바꿔가며 총 5번 실행합니다. 결론적으로 5 x 5= 25개의 모델을 훈련합니다.
많은 모델을 훈련하기 때문에 GridSearchCV 클래스의 n_jobs 매개변수에 병렬 실행에 사용할 CPU 코어 수를 지정하는 것이 좋습니다.
n_jobs
- 그리드서치 클래스의 매개변수로 병렬 실행에 사용할 CPU 코어 수 지정
교차검증에서 최적의 하이퍼파라미터를 찾으면 전체 훈련 세트로 모델을 다시 학습합니다. 이렇게 학습된 모델은 gs 객체의 best_estimator_ 속성에 저장되어있습니다.
그리드 서치로 찾은 최적의 매개변수는 best_params_ 속성에 저장되어 있습니다.
각 매개변수에서 수행한 교차 검증의 평균 점수는 cv_results 속성의 'mean_test_score'키에 저장되어 있습니다.
넘파이 argmax( ) 함수를 사용하면 가장 큰 값의 인덱스를 출력할 수 있습니다.
이 값이 최상의 검증 점수를 만든 매개변수 조합입니다. 앞에서 출력한 gs.bestparams와 동일한지 확인해보겠습니다.
하이퍼파라미터 튜닝 과정
1. 탐색할 매개변수를 지정한다.
2. 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수가 나오느느 매개변수 조합을 찾는다.
3. 그리드 서치는 최상의 매개변수에서 전체 훈련 세트를 사용해 최종 모델을 훈련한다.
더 복잡한 매개변수 조합을 탐색해보겠습니다.
mean_impurity_decrease
- 결정트리에서 노드를 분할하기 위한 불순도 감소 최소량 지정
min_samples_split
- 노드를 나누기 위한 최소 샘플 수
np.arange( )
- 첫 번째 매개변수 값에서 시작하여 두번째 매개변수에 도달할 때까지 세 번째 매개변수를 계속 더한 배열을 만듦
range( )
- np.arange( ) 와 기능은 비슷하나 정수만 사용할 수 있음
이 매개변수로 수행할 교차검증 횟수는 9x15x10=1350개입니다. 기본 5-폴드 교차 검증을 수행하므로 만들어지는 모델의 수는 6750개입니다!!!
그리드서치를 실행했으니 최상의 매개변수 조합과 최상의 교차 검증 점수를 확인해보겠습니다.
매개변수의 값을 지정할 때 수동으로 간격을 지정했는데요, 매개변수의 값아 수치일 때는 값의 범위나 간격을 미리 정하기 어려울 수 있습니다. 이럴 때 랜덤서치를 사용하면 좋습니다.
랜덤서치
- 연속된 매개변수 값을 탐색할 때 유용
- 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달
- 지정된 횟수만큼 샘플링하여 교차 검증을 수행하기 때문에 시스템 자원이 허락하는 만큼 탐색량 조절 가능
Scipy
- 적분, 보간, 선형 대수, 확률 등을 포함한 수치 계산 전용 라이브러리
uniform
- 균등 분포에서 실수값을 샘플링하는 함수
randit
- 균등분포에서 정수값을 샘플링하는 함수
0에서 10 사이의 범위를 갖는 randit 객체를 만들고 10개의 숫자를 샘플링했습니다. 범위가 좁아서 고르게 샘플링 되지 않아 1000개까지 범위를 늘려보겠습니다.
개수가 늘어나 0에서 9까지의 숫자가 어느 정도 고르게 추출되었습니다.
uniform 클래스도 동일하게 실수를 추출했습니다.
이제 매개변수의 범위를 지정하고 그리드서치를 실행했습니다.
최적의 모델과 매개변수값 그리고 최종모델의 테스트 세트 성능까지 확인했습니다.
여기까지 수동으로 매개변수를 바꾸는 대신 그리드 서치나 랜덤 서치를 사용하는 방법을 알아보았습니다.
다음 시간에는 결정 트리의 확장 버전인 앙상블 모델에 대해서 알아보겠습니다~!
자료 출처: 한빛 미디어