
훈련 세트와 테스트 세트 외에, 추가적으로 검증 세트를 사용하는 방식으로 한계점을 해결할 수 있다.
검증 세트는 기존 훈련 세트에서 일부로 만든다.
이러한 과정은 훈련 과정에서 테스트 세트의 영향을 최소화하고, 검증 세트를 통해 최적의 모델을 찾아내기 위해 유용하다.

훈련 세트와 검증 세트의 분리 없이, 데이터 전체를 여러 부분으로 나누어 각 부분을 검증 세트로 사용하고 나머지를 훈련 세트로 사용하는 기법이다. 이를 통해 모델 평가의 안정성을 높이고, 훈련에 더 많은 데이터를 사용할 수 있다.
검증 세트를 떼어 내어 평가하는 과정을 여러번 반복하여 점수의 평균하여 최종 검증 점수를 구한다.
데이터셋을 k개의 폴드로 나누고, 각 폴드를 교차 검증에서 검증 세트로 사용한다.
각 폴드에서 검증 결과를 평균하여 최종 검증 점수를 구한다.
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)# 기본 5-폴드 교차검증
print(scores)
#출력 {'fit_time': array([0.01363206, 0.0181005 , 0.04047799, 0.02029538, 0.0285089 ]), 'score_time': array([0.00164032, 0.00898075, 0.00185561, 0.00185323, 0.00185347]), 'test_score': array([0.86923077, 0.84615385, 0.87680462, 0.84889317, 0.83541867])}
k-폴드 교차 검증을 통해 각 폴드가 검증 세트로 사용되는 과정에서 측정되는 메트릭
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) #n_jobs=-1 : 모든 코어 사용
# 파라미터 5개 cv 5 (총 25번 학습)
gs.fit(train_input, train_target)
#검증 점수가 가장 높은 모델의 매개변수로 전체 훈련 세트를 학습한 모델
dt = gs.best_estimator_
print(dt.score(train_input, train_target))
#출력 0.9615162593804117
# 최적의 파라미터
print(gs.best_params_)
#출력 {'min_impurity_decrease': 0.0001}
# 5번 교차 검증한 점수
print(gs.cv_results_['mean_test_score'])
# [0.86819297 0.86453617 0.86492226 0.86780891 0.86761605]
best_index = np.argmax(gs.cv_results_['mean_test_score']) #argmax : 가장 큰값 인덱스 반환
print(gs.cv_results_['params'][best_index])
#출력 {'min_impurity_decrease': 0.0001}
params = {'min_impurity_decrease': np.arange(0.0001, 0.001, 0.0001), #0.0001 0.0002 0.0003 ~ 0.001 (9개)
'max_depth': range(5, 20, 1), # 5, 6, 7 ~ 20 (15개)
'min_samples_split': range(2, 100, 10) # 2. 12, 22 ~ 92 (10개)
}
#총 교차 검증 수 9 x 15 x 10 = 1350개
#5-폴드 교차 검증 수 1350 x 5 = 6750
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)
print(gs.best_params_)
#출력 {'max_depth': 14, 'min_impurity_decrease': 0.0004, 'min_samples_split': 12}
print(np.max(gs.cv_results_['mean_test_score']))
#출력 0.8683865773302731
✔️ 과정
1. 탐색할 매개변수와 그 값의 범위를 지정한다.
- 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수를 당성하는 매개변수 조합을 찾는다.
이러한 조합은mean_test_score에 저장된다.
- 그리드 서치는 최상의 매개변수에서 전체 훈련 세트를 사용하여 최종 모델을 훈련한다.
모델의 최종 매개변수는best_params_에 저장된다.
RandomizedSearchCV는 매개변수의 조합을 확률적으로 샘플링하여, 최적의 매개변수 조합을 찾는데 사용된다.
# 랜덤 서치
params = {'min_impurity_decrease': uniform(0.0001, 0.0001),
'max_depth': randint(20, 50),
'min_samples_split':randint(2, 25),
'min_samples_leaf': randint(1, 25)
}
from sklearn.model_selection import RandomizedSearchCV
gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params, n_iter=100, n_jobs=-1, random_state=42) #교차 검승수 100
gs.fit(train_input, train_target)
print(gs.best_params_)
#출력 {'max_depth': 47, 'min_impurity_decrease': 0.00015788648955075588, 'min_samples_leaf': 23, 'min_samples_split': 23}
print(np.max(gs.cv_results_['mean_test_score']))
#출력 0.8687702672688236
dt = gs.best_estimator_
print(dt.score(test_input, test_target))
#출력 0.8569230769230769
이러한 하이퍼파라미터 튜닝 방법들은 모델 성능을 최적화하는 데 중요한 역할을 하며, 교차 검증을 통해 안정적으로 최적의 매개변수 조합을 찾을 수 있다.