이사님의 말
"이런 저런 값으로 모델을 많이 만들어서 테스트 세트로 평가하면 결국 테스트 세트에 잘 맞는 모델이 만들어지는 것 아닌가요?"
지금까지는 훈련세트와 테스트 세트만을 이용해서 모델을 평가 해왔다.
왜? 복잡하게 설명한느 것을 피하기 위해서..
하지만 3개의 세트로 나눠서 모델을 훈련하는 게 바람직한 방법입니다.
즉 테스트 세트를 사용해 자꾸 성능을 확인하다보면 점점 테스트 세트에 맞추게 되는 것이다.
이제부터 올바르게 예측하려면?
모델을 만들고 나서 마지막에 딱 한번만 테스트 세트를 사용하는 것이 좋다.
그렇다면 max_depth매개변수를 사용한 하이퍼파라미터 튜닝을 어떻게 할 수 있을까?
검증세트를 사용하자~!
-----
검증세트
테스트 세트를 사용하지 않으면 모델이 과대적합인지 과소적합인지 판단하기 어렵다. 테스트 세트를 사용하지 않고 이를 측정하는 간단한 방법은 훈련세트를 나누는 것!
이 데이터를 검증 세트라고 부른다.
(검증세트를 가지고 파라미터 매개변수 튜닝을 합니다.)
-> 훈련세트에서 모델을 훈련하고 검증세트로 모델을 평가합니다. 이런 식으로 테스트 하고 싶은 매개변수를 바꿔가며 가장 좋은 모델을 고릅니다.
그 다음 이 매개변수를 사용해 훈련세트와 검증세트를 합쳐 전체 훈련 데이터에서 모델을 다시 훈련합니다. 그리고 마지막에 테스트 세트에서 최종 점수를 평가합니다. -> 이렇게 하면 실전에 투입했을 때 테스트 세트의점수와 비슷한 성능을 기대할 수 있을 것이빈다.
단순히 train_test_split() 함수를 2번 적용해서 훈련세트와 검증세트로 나눠준 것 뿐입니다. !!
여기서 훈련세트와 검증세트의 크기를 확인해보면,
원래 5197개였던 훈련세트가 4157개로 줄고, 검증세트는 1040개가 되었습니다. 이제 sub_input, sub_target과 val_input, val_target를 사용해 모델을 만들고 평가해보겠습니다.
모델을 평가해보았습니다. 이 모델은 훈련세트에 과대적합 되어있습니다. 매개변수를 바꿔서 더 좋은 모델을 찾아야 합니다. 그 전에 검증세트에 대해서 좀 더 알아야 할 것이 있습니다.
----
교차 검증
검증세트를 만드느라 훈련세트가 줄었습니다. 20%
훈련에 많은 데이터를 사용할 수록 좋은 모델이 되는데 그렇다고 검증세트를 조금 떼어놓으면 검증점수가 들쭉날쭉할 것
이럴 때 교차 검증을 이용하면 안정적으로 검증점수를 얻고 훈련에 더 많은 데이터를 사용할 수 있습니다.
교차 검증은 검증세트를 떼어내어 평가하는 과정을 여러번 반복한다.
그 다음 이 점수를 평균하여 최종 검증 점수를 얻습니다. 이 과정을 그림으로 보면,
사이킷 런에서는 cross_validate()라는 교차 검증 함수가 있습니다.
교차 검증의 최종점수는 test_score 키에 담긴 5개의 점수를 평균하여 얻을 수 있습니다.
85% 정도의 검증평균을 얻을 수 있습니다.
cross_validate()는 훈련세트를 섞어 폴드를 나누지 않습니다. 만약 교차 검증을 할 때 훈련세트를 섞으려면 분할기를 지정해야 함
사이킷런의 분할기는 교차 검증에서 폴드를 어떻게 나눌 지 결정해줍니다.
<분할기를 사용한 교차검증>
교차 검증에 대해서 얘기했습니다. 이어서는 결정트리의 매개변수 값을 바꿔가며 가장 좋은 성능이 나오는 모델을 찾아보겠습니다.
<하이퍼파라미터 튜닝>
모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터를 하이퍼파라미터라고 합니다.
-그리드 서치
하이퍼 파라미터 탐색과 교차검증을 한번에 수행합니다.
기본 매개변수를 사용한 결정트리 모델에서 min_impurity_decrese 매개변수의 최적값을 찾아보겠습니다.
p.252 GridSearchCV 클래스를 사용하니 매개변수를 일일이 바꿔가며 교차검증을 수행하지 않고 더 좋습니다.
그런데 아직도 아쉬운점이 있습니다. 매개변수의 간격을 0.0001 혹은 1로 설정했었습니다. 이보다 더 좁거나 넓은 간격으로 시도해볼 수 있지 않을까요?(매개변수의 값이 수치일 때 값의 범위나 간격을 미리 정하기 어려울 수 있습니다. ) 또한 그리드 서치를 사용하면 꽤 많은 자원을 필요로 합니다. 시간도 많이 걸리고요!! 그래서 그 다음에 나온 것이 "랜덤 서치"입니다.
랜덤서치를 사용하려면 SCIPY에 있는 확률 분포 클래스를 사용해야합니다!
<<랜덤 서치>>
랜덤서치에는 매개변수 값의 목록을 전달하는 것이 아니라 !! 매개변수를 샘플링할 수 있는 확률분포 객체를 전달합니다.
먼저 2개의 확률 분포 클래스를 임포트 해보겠습니다.
uniform과 randint클래스는 모두 주어진 범위에서 고르게 값을 뽑습니다. 이를 -> "균등분포에서 샘플링한다." 고 말합니다.
randint는 정수값을, uniform은 실숫값을 뽑습니다.
0에서 10 사이의 범위를 갖는 randint 객체를 만들고 10개의 숫자를 샘플링 해보겠습니다.
참고로 마지막 원소인 10은 포함이 안됩니다.)
결고ㅏ를 보면
0:2개
2:2개
4:2개
5:1개
6:1개
7:2개
10개밖에 되지 않아서 고르게 샘플링 되는 것 같지 않습니다만 샘플링 숫자를 늘리면 쉽게 확인 할 수 이씁니다!!
1000개를 샘플링 해보도록 하죠!
순서대로 0,1,2,3....9가 거의 균등하게 나온 것을 볼 수 있습니다.
uniform의 사용법도 동일합니다. 실수를 출력해보도록 하겠습니다.
0과 1사이에 실수값 10개를 추출, 샘플링 해줍니다.
좀 이해가 되셨나요?'
랜덤서치에 randint과 uniform 클래스 객체를 넘겨주고 총 몇번을 샘플링해서 최적의 매개변수를 찾으라고 명령할 수 있습니다.
이러한 방식을 사용한다면 훨씬더 자원을 효율적으로 사용한다는 장점이 있습니다. !
탐색할 매개변수의 딕셔너리를 만들어 보겠습니다.
1. 0.0001~0.001 사이에서 랜덤 샘플링 해라.
2. 트리의 깊이를 20~50 까지 제한하라.
샘플링 횟수는 n_iter 매개변수에 지정합니다.
위에서 만든 params객체도 넣는 것이 보이네요
모델을 만드는 개수인 n_iter이 1000으로
1. 0.0001~0.001 사이에서 랜덤 샘플링 해라.
여기에서 샘플링을 100번만 하는 것이죠 교차검증을 수행하고 최적의 매개변수 조합을 찾습니다.
앞서 그리드 서치보다 훨씬 교차검증 수를 줄이면서 넓은 영역을 효과적으로 탐색할 수 있습니다.
그래서 모델의 최적의 파라미터를 찾는 것 입니다.
최적의 매개변수 조합을 출력해보겠습니다.
최고의 교차검증 점수도 확인해보겠습니다.
최적의 모델은 이미 전체 훈련세트로 훈련되어 best_estimator_속성에 저장되어 있습니다. 이 모델을 최종모델로 결정하고 테스트 세트의 성능을 확인해보죠.
test 세트에서 최종검증해서 점수를 만들면 86%가 나온다는 것을 확인할 수 있습니다. 검증세트보다 살짝 낮은 수치이긴 합니다. 랜덤 서치로 매개변수 탐색을 해서 하이퍼 파라미터 튜닝을 했다면 그렇게 해서 얻은 점수를 가지고 가장 좋은 모델입니다!! (86% 정도의 성능을 예상할 수 있다.
마무리!!✔😘
훈련세트와 테스트 세트만 분류했었는데 검증세트가 더 필요하다!
왜냐하면 테스트 세트는 사용하면 안되고 따로 나눠야 되기 때문에
검증세트를 사용해서 모델을 튜닝한다.
그 과정을 좀 더 편리하게 하기 위해서 훈련세트를 가능하면 많이 사용하기 위해서 교차 검증을 사용한다고 했고
교차 검증을 사용해서 여러개의 모델의 파라미터를 test해야 되는데 번거롭다.
그리드 서치를 사용해서 교차 검증과 매개변수 탐색을 한꺼번에 수행을 한다.
그리드 서치를 하다보면 매개변수가 많아서 그 구간을 잘게 쪼개서 테스트를 해보고 싶은데 너무 많은 모델이 만들어지기 때문에 랜덤하게 균등분포해서 샘플링해서 매개변수 탐색을 수행하는 randomizesearchCV를 사용해보았다.
randomizeSearchCV는 만들 모델의 개수를 지정할 수 있기때문에 제가 가진 자원 안에서 최대한 많은 모델을 만들어서 탐색을 넓은 범위해서 수행해볼 수 있는 장점이 있다.!!
'프로그래밍 > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼자 공부하는 머신러닝+딥러닝] 13강 트리의 앙상블 (0) | 2022.08.04 |
---|---|
[혼자 공부하는 머신러닝+딥러닝] 11강 로지스틱 회귀로 와인 분류하기 & 결정 트리 (0) | 2022.07.14 |
[혼자 공부하는 머신러닝+딥러닝] 10강 확률적 경사 하강법 _ SGD Classifier (0) | 2022.07.13 |