결정트리 모델로 와인 구분하는 모델 완성! max_depth
바꿔가면서 성능 테스트 여러 번 해서 최적의 모델을 찾아야지 ㅎㅎ 그런데...
이사님🗣️ "최적의 모델을 찾는 건 좋은데, 그 과정에서 자꾸 테스트 세트로 평가를 하면 테스트 세트에만 잘 맞는 모델이 되어버리는 거 아닌가요?" ㅇ ㅠㅇ
해결책은 생각보다 간단했다. 테스트세트 말고, 따로 검증용 세트를 또 준비하면 된다!
train_test_split
을 사용 = 검증세트 분할test
말고) val
로 하면 되는 거임!↪ 그래서 나온 것이 바로 ...!
cross_validate()
: 사이킷런에서 제공하는 교차검증 함수!cv
: 이 매개변수로 폴드 수를 지정할 수도 있음. (기본값 = 5)train_test_split
처럼 알아서 훈련세트를 섞어주지는 않음.alpha
)를 바꿔가면서 score 보면서 최적의 매개변수를 찾으면 되고, 이 과정은 테스트세트가 아닌 검증세트로 해야 함.✌🏻그런데 여기서 짚고 넘어가야 할 포인트가 두 가지 있다.
Point① 그럼 우리가 매개변수 바꿔가면서 일일이cross_validate
하고 있어야 하나?
Point② 사실, 매개변수들의 최적값은 순차적으로 찾을 수 없게 되어있다. 이를테면, max_depth 최적값 찾아서 고정해놓고 그 다음으로 min_samples_split을 바꿔가면서 찾는 것이 불가능하다. 매개변수 상호 간에 영향을 끼치기 때문이다.
그렇다면,
동시에 매개변수를 바꿔가며 최적의 값을 찾는 이 복잡한 과정을 어찌할 것인가?
GridSearchCV()
params
: 딕셔너리 형태로 탐색할 매개변수 후보들을 전달하기 위해 사용한 변수n_jobs
: 작업에 사용할 CPU 코어 수를 지정하는 매개변수 (기본값=1).best_params_
: 찾아낸 최적의 매개변수가 저장된 곳.best_estimator_
: 최적의 매개변수 조합으로 훈련시킨 최적의 모델이 저장된 곳.cv_results_
딕셔너리의 'mean_test_score' 키에 저장되어있음..argmax()
로 꺼내고, 'params' 키를 거쳐서, 최적의 매개변수를 뽑아볼 수도 있음. ([14]의 값을 좀 돌아 돌아 얻어낸 느낌..!😅)np.arange()
함수와 파이썬의 range()
함수를 활용✌🏻그런데, 여기서 또 한 번 아쉬운 점이 두 가지 있다.
Point① 위에서 매개변수 후보 간격들을 0.001, 1, 10으로 했었는데, 굳이 이렇게 간격을 둔 것에 대한 특별한 근거가 없다.
Point② 또, [17] 직접 해보면 알겠지만, 너무 많은 매개변수 조합이 있어서 그리드서치 수행 시간이 오래 걸릴 수 있다. (위 예시는 무려 9*15*10*5=6,750 가지나 있었다)
RandomizedSearchCV()
uniform
과 randint
클래스를 활용하면 됨. (플러스알파 참조)n_iter
로 샘플링 횟수 지정해줘야 함.점수(score)가 아주 만족스럽진 않지만 어쨌든 다양한 매개변수 테스트해냈다..! 앞으로는 일일이 매개변수 안 바꾸고 그리드서치나 랜덤서치 쓰면 되겠어~!
cross_validate()
는 기본적으로 회귀모델일 경우 KFold()
분할기를 사용하고,StratifiedKFold()
분할기를 사용함.cross_validate
안에 넣어줘도 됨!n_splits
: 몇(k) 폴드 교차검증을 할지 설정하는 매개변수randint(a,b)
: a 부터 b-1 중에 랜덤한 정수값을 뽑음..rvs(n)
: n개를 샘플링 해줌(뽑아줌).uniform(a,b)
: a~b 사이에서 랜덤한 실수값을 뽑음.254p. 랜덤서치에서
n_iter=100
이라는 건, 매개변수 각각을 100개씩 뽑아서 조합해본다는 게 아니라, 랜덤하게 100가지의 조합을 구해본다고 보면 되나요? 그래서 그리드서치보다 검증 수가 줄어든 거라고 보는 거죠? ⏯️(맞을듯)
자꾸 문제상황들이 연이어 제시되면서(검증세트 단점 있음 - 교차검증! - 근데 교차검증도 단점 있음 - 그리드 서치! - 근데 그리드서치도••• 이런 식..^^) 처음엔 되게 복잡하게 느껴졌는데, 다시 큰 줄기를 잡으면서 복습하니까 괜찮네! 새로운 도구들을 알아갈수록 어떻게 한참 전에 이미 이런 생각들을 하고 이미 라이브러리로 구현까지 해놨는지 놀라울 따름이다... 지금은 돈방석에 앉아계시겠지..? 열심히 하자 흑흑
와인 구분하는 결정트리 모델 만들었지만, '테스트 세트에만 맞춰진 거 아니냐'는 이사님의 일침 → 검증 세트 추가 → but 검증세트까지 떼어내는 부담 있음 → 교차검증으로 극복! → 근데 매개변수를 바꿔가면서 평가하는 과정이 지루하고 복잡해짐ㅠ → 그 과정을 자동화한 그리드서치 활용! → but 간격 설정에 관한 한계가 있고, 시간이 오래 걸림 → 넓은 범위 속을 무작위로 탐색하여 효율적인 랜덤서치로 극복! 휴 험난한 하루였다...