교차 검증과 그리드 서치

Jaeseok Han·2024년 4월 21일

머신러닝&딥러닝

목록 보기
11/22

검증 세트

1. 훈련 세트와 테스트 세트 모델 평가의 한계점

  • 테스트 세트에 의존하여 모델의 최적화 및 성능 평가를 진행할 경우, 테스트 세트의 정보에 편향될 수 있다.
  • 테스트 세트는 모델의 최종 성능을 평가하기 위해 따로 보관하는 것이 일반적이므로, 모델 튜닝 과정에 사용하면 안된다.

2. 검증 세트

훈련 세트와 테스트 세트 외에, 추가적으로 검증 세트를 사용하는 방식으로 한계점을 해결할 수 있다.
검증 세트는 기존 훈련 세트에서 일부로 만든다.

  1. 훈련 세트(60%)로 모델을 훈련
  2. 검증 세트(20%)로 사용하여 다양한 매개변수 조합을 테스트하고, 최적의 모델을 선택
  3. 검증 세트에서 최적의 모델을 찾았으면, 훈련 세트와 검증 세트를 합쳐 전체 훈련 데이터를 사용하여 모델을 다시 훈련
  4. 마지막으로, 테스트 세트(20%)를 사용하여 최종 모델의 성능을 평가

이러한 과정은 훈련 과정에서 테스트 세트의 영향을 최소화하고, 검증 세트를 통해 최적의 모델을 찾아내기 위해 유용하다.

교차 검증

훈련 세트와 검증 세트의 분리 없이, 데이터 전체를 여러 부분으로 나누어 각 부분을 검증 세트로 사용하고 나머지를 훈련 세트로 사용하는 기법이다. 이를 통해 모델 평가의 안정성을 높이고, 훈련에 더 많은 데이터를 사용할 수 있다.

검증 세트를 떼어 내어 평가하는 과정을 여러번 반복하여 점수의 평균하여 최종 검증 점수를 구한다.

k-폴드 교차 검증

데이터셋을 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-폴드 교차 검증을 통해 각 폴드가 검증 세트로 사용되는 과정에서 측정되는 메트릭

  • fit_time : 훈련 시간
  • score_time : 검증 시간
  • test_score: 최종 점수

하이퍼파라미터 튜닝

1. 그리드 서치

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. 탐색할 매개변수와 그 값의 범위를 지정한다.

  1. 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수를 당성하는 매개변수 조합을 찾는다.
    이러한 조합은 mean_test_score에 저장된다.
  1. 그리드 서치는 최상의 매개변수에서 전체 훈련 세트를 사용하여 최종 모델을 훈련한다.
    모델의 최종 매개변수는 best_params_에 저장된다.

2. 랜덤 서치

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
  • 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달하여 무작위로 매개변수 조합을 생성한다.
  • 이 방법은 그리드 서치보다 효율적으로 다양한 매개변수 조합을 탐색할 수 있으며, 특히 매개변수 조합의 수가 많을 때 유용하다.

이러한 하이퍼파라미터 튜닝 방법들은 모델 성능을 최적화하는 데 중요한 역할을 하며, 교차 검증을 통해 안정적으로 최적의 매개변수 조합을 찾을 수 있다.

0개의 댓글