상세 컨텐츠

본문 제목

[혼자 공부하는 머신러닝+딮러닝] 트리 알고리즘 - 교차 검증과 그리드 서치

AI

by 래모 2023. 11. 6. 09:57

본문

검증세트( validation set )

테스트 세트를 사용하지 않으면 모델이 과대적합인지 과소적합인지 판단하기 어렵다.

테스트 세트를 사용하지 않고 이를 측정하는 방법은 훈련세트를 또 나누는 것이다! => 검증세트

 

훈련 : 검증 : 테스트 = 6 : 2 : 2

 

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(data, target, test_size = 0.2 , random_state = 42)
sub_input, val_input, sub_target, val_target = train_test_split(train_input, train_target, test_size = 0.2, random_state = 42)
# train_input을 다시 나눔

 

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state = 42)
dt.fit(sub_input, sub_target)
print(dt.score(sub_input, sub_target)) # 0.9971133028626413
print(dt.score(val_input, val_target)) # 0.864423076923077

 

교차 검증

교차 검증은 검증 세트를 떼어 내어 평가하는 과정을 여러번 반복한다

그 다음 이 점수를 평균하여 최종 검증 점수를 얻는다

 

3-폴드 교차 검증

 

사이킷런에는 cross_validate()라는 교차 검증 함수가 있다

from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
# 평가할 모델 객체를 첫번째 매개변수로 전달 이후 훈련세트 전체를 전달

print(scores)
'''
{'fit_time': array([0.00873518, 0.00848389, 0.01045299, 0.00842595, 0.00686383]), 
'score_time': array([0.00086379, 0.00117707, 0.00069094, 0.00053096, 0.00046802]), 
'test_score': array([0.87019231, 0.84615385, 0.87680462, 0.84889317, 0.83541867])}
'''

 

fit_time : 모델을 훈련하는 시간

score_time : 검증하는 시간

test_score : 교차 검증의 최종 점수는 이 키의 5개 점수를 평균하여 얻을 수 있다 (검증 폴드 점수임!)

 

import numpy as np
print(np.mean(scores['test_score'])) # 0.8554925223957948

 

주의할 점은 cross_validate는 훈련 세트를 섞어 폴드를 나누지 않는다

만약 교차 검증을 할 때 훈련 세트를 섞으려면 분할기를 지정해야한다

 

cross_validate함수는 기본적으로 회귀 모델일 경우  KFold 분할기를 사용하고

분류 모델일 경우 타깃 클래스를 골고루 나누기 위해 StratifiedKFold 사용

 

from sklearn.model_selection import StratifiedKFold

scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
#앞 코드랑 똑같음

 

10-폴드 교차 검증을 수행하려면 다음과 같이 작성함 n_splits가 몇 폴드 교차 검증을 할지 정하는 것임

splitter = StratifiedKFold(n_splits = 10, shuffle = True, random_state = 42)
scores = cross_validate(dt, train_input, train_target, cv = splitter)
print(np.mean(scores['test_score'])) # 0.8581873425226026

 

하이퍼파라미터 튜닝

모델 파라미터 = 머신러닝 모델이 학습하는 파라미터

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

 

하이퍼파라미터 튜닝하는 작업은 어떻게 진행할까?

1. 먼저 라이브러리가 제공하는 기본값을 그대로 사용해 모델 훈련

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

 

사이킷런의 GridSearchCV 클래스는 하이퍼파라미터 탐색과 교차 검증을 한번에 수행한다

from sklearn.model_selection import GridSearchCV

params = {'min_impurity_decrease' : [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}
gs = GridSearchCV(DecisionTreeClassifier(random_state = 42), params, n_jobs = 1)

gs.fit(train_input, train_target)

dt = gs.best_estimator_
print(dt.score(train_input, train_target))

 

gs객체에 fit 메서드를 호출하면 그리드 서치 객체는 결정 트리 모델 min_impurity_decrease 값을 바꿔가며 총 5번 실행한다

GridSearchCV의 cv 기본값은 5이다.

min_impurity_decrease 값마다 5-폴드 교차 검증을 수행하기 때문에 5 X 5 = 25개의 모델을 훈련한다

많은 모델을 훈련하기 때문에 n_jobs 매개변수에서 병렬 실행에 사용할 CPU코어 수를 지정하는 것이 좋다

 

25개의 모델 중에서 검증 점수가 가장 높은 모델의 매개변수 조합으로 전체 훈련세트에서 자동으로 다시 모델을 훈련한다

이 모델은 gs 객체의 best_estimator_ 속성에 저장되어 있다.

 

 

관련글 더보기