Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

Chapter 05-2: 교차 검증과 그리드 서치 본문

KHUDA 4th/머신러닝 기초 세션

Chapter 05-2: 교차 검증과 그리드 서치

시데브 2023. 8. 22. 03:12
검증 세트의 필요성을 이해하여 교차 검증 방법을 학습하고,
그리드 서치와 랜덤 서치를 이용해 최적의 하이퍼파라미터를 찾아보자. 

 

 

검증 세트

  • 테스트 세트로 일반화 성능을 올바르게 예측하려면 가능한 테스트 세트를 사용하지 말고, 모델을 만들고 마지막에 한 번 사용하는 것이 좋다.
  • 테스트 세트를 사용하지 않고, 훈련 세트를 또 나누어 임시로 사용하는 데이터셋검증 세트(validation set)라 부른다.

출처: https://magazine.hankyung.com/business/article/202012086955b

 

  • 이렇게 나눈 검증 세트를 이용하여 파라미터를 바꿔가며 최적의 파라미터를 찾은 후, 훈련 세트와 검증 세트를 합쳐 해당 파라미터로 모델을 학습한다. 
  • 마지막으로 테스트 세트에서 최종 점수를 평가한다.

 

#와인 데이터셋 넘파이 배열로 변환
import pandas as pd
wine = pd.read_csv('https://bit.ly/wine_csv_data')
data=wine[['alcohol', 'sugar', 'pH']].to_numpy()
target=wine['class'].to_numpy()
 
#훈련, 테스트 데이터셋 분리
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)
print(sub_input.shape, val_input.shape)
(4157, 3) (1040, 3)

-> 원래 5197개였던 훈련 세트가 4157개로 줄고, 검증 세트는 1040개

 

#검증 세트를 이용해 모델 학습
from sklearn.tree import DecisionTreeClassifier
dt=DecisionTreeClassifier(random_state=42)
dt.fit(sub_input, sub_target)
print(dt.score(sub_input, sub_target))
print(dt.score(val_input, val_target))
0.9971133028626413
0.864423076923077

-> 훈련세트에 과대적합!!, 매개변수를 바꿔 더 좋은 모델을 찾아야 한다.

 

 

교차 검증

  • 훈련 데이터가 많을수록 좋은 모델을 만들기에 좋지만, 검증 세트의 크기가 작아지면 검증 점수가 불안정해진다. 이럴때 교차 검증을 이용하면 문제가 해결된다.
  • 교차 검증(cross validation): 검증 세트를 떼어 내어 평가하는 과정을 여러 번 반복하는 방식이다.
  • 교차 검증 기법에는 k-겹 교차 검증(k-Fold Cross Validation), 계층별 k-겹 교차 검증(Stratified k-Fold Cross Validation) 등이 있다.

 

k-겹 교차 검증

  • 훈련 데이터셋을 검증 데이터셋으로 나누는 과정을 k번 반복하고, k개의 검증 점수를 평균한 것이 학습 모델의 성능이 된다.

출처: https://wooono.tistory.com/105

 

 

#교차 검증
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
print(scores)
{'fit_time': array([0.03020883, 0.05241323, 0.03527045, 0.0348165 , 0.02028418]), 
'score_time': array([0.00563622, 0.00165391, 0.01483893, 0.00180101, 0.00155759]), 
'test_score': array([0.86923077, 0.84615385, 0.87680462, 0.84889317, 0.83541867])}
  • fit_time: 모델을 훈련하는 시간
  • score_time: 모델을 검증하는 시간
  • cross_validate() 함수의 디폴트는 5-폴드 교차 검증

 

#교차 검증의 최종 점수
import numpy as np
print(np.mean(scores['test_score']))
0.855300214703487

 

#KFold 교차 검증 분할기를 이용해 타깃 클래스를 고르게 나눔
from sklearn.model_selection import StratifiedKFold
scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
0.855300214703487

 

#10-폴드 교차 검증
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.8574181117533719

 

 

하이퍼파라미터 튜닝

  • 하이퍼파라미터 튜닝: 사용자가 직접 지정하는 파라미터인 하이퍼파라미터의 최적의 값을 가지는 모델을 찾는 과정을 의미한다.
  • 그리드 서치(Grid Search): 사이킷런에서 제공하는 하이퍼파라미터 튜닝을 위한 도구

 

#매개변수 min_impurity_decrease의 최적값 탐색
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: 병렬 실행에 사용할 CPU 코어 수, -1로 설정할 시에 시스템에 있는 모든 코어를 사용

 

#최적의 파라미터로 모델을 다시 학습
gs.fit(train_input, train_target)
 
dt=gs.best_estimator_
print(dt.score(train_input, train_target))
0.9615162593804117

 

#최적의 매개변수와 5번 교차 검증의 평균 점수
print(gs.best_params_)
print(gs.cv_results_['mean_test_score'])
{'min_impurity_decrease': 0.0001}
[0.86819297 0.86453617 0.86492226 0.86780891 0.86761605]

 

#가장 큰 점수의 index를 뽑아 해당 매개변수를 확인
best_index=np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])
{'min_impurity_decrease': 0.0001}

 

#각각 최적의 파라미터를 탐색
params={'min_impurity_decrease':np.arange(0.0001, 0.001, 0.0001),
        'max_depth':range(5, 20, 1),
        'min_samples_split':range(2, 100, 10)}
 
gs=GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)
 
print(gs.best_params_)
print(np.max(gs.cv_results_['mean_test_score']))
{'max_depth': 14, 'min_impurity_decrease': 0.0004, 'min_samples_split': 12}
0.8683865773302731
  • np.arange(a, b, c): a부터 시작하여 b가 될 때까지 c를 계속 더한 배열
  • np.range(a, b, c): np.arange()와 비슷하지만, 정수만 사용할 수 있는 함수

 

랜덤 서치

  • 랜덤 서치(Random Search): 그리드 서치와 방식은 비슷하지만, 모든 조합을 시도하지 않고 각 반복마다 임의의 값을 대입해 지정한 횟수만큼만 평가하는 방식
  • 매개변수의 값이 수치일 때, 값의 범위나 간격을 미리 정하기 어려울 수 있으며, 너무 많은 매개변수 조건이 있어 그리드 서치 수행이 오래 걸릴 수 있을 때, 랜덤 서치를 사용하면 좋다.
#scipy 라이브러리를 이용하여 범위 내의 난수 배열 생성
params={'min_impurity_decrease':uniform(0.0001, 0.001),
        '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)
gs.fit(train_input, train_target)
 
print(gs.best_params_)
print(np.max(gs.cv_results_['mean_test_score']))
 
#테스트 세트로 최종 모델의 성능 확인
dt=gs.best_estimator_
print(dt.score(test_input, test_target))
{'max_depth': 39, 'min_impurity_decrease': 0.00034102546602601173, 'min_samples_leaf': 7, 'min_samples_split': 13}
0.8695428296438884
0.86

 

  • uniform(a, b): a에서 b 사이의 범위 내 실수 배열 생성, 샘플링 횟수는 RandomizedSearchCV의 n_iter 매개변수로 지정
  • randint(a, b): a에서 b 사이의 범위 내 정수 배열 생성, 샘플링 횟수는 RandomizedSearchCV의 n_iter 매개변수로 지정

참고자료

 

[ML] 교차검증 (CV, Cross Validation) 이란?

교차 검증이란? 보통은 train set 으로 모델을 훈련, test set으로 모델을 검증한다. 여기에는 한 가지 약점이 존재한다. 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결

wooono.tistory.com

 

 

[ML] 그리드서치와 랜덤서치

[개요] 그리드서치와 랜덤서치가 무엇인지 알아보고, 어떻게 활용하는지 살펴본다. [내용 정리] 1. 그리드서치 0) 정의 -> 모델의 성능을 가장 높게 하는 최적의 하이퍼파라미터를 찾는 방법으로,

cori.tistory.com

 

[Machine learning] 쉽게 설명하는 Grid search - 모델 성능을 최고로 만드는 hyper parameter를 찾아서 (200727)

index 1. Grid search 의 정의 2. 코드 구현 및 결과 3. 유사한 다른 방법들 1. Grid search 란 무엇인가? 0) 컨셉 : 모델에게 가장 적합한 하이퍼 파라미터를 찾기 Grid search (격자 탐색) 은 모델 하이퍼 파라미

huidea.tistory.com