일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- LG
- 오블완
- 머신러닝
- 해커톤
- 분류
- 티스토리챌린지
- PCA
- AI
- 회귀
- deep learning
- Machine Learning
- gpt
- GPT-4
- Classification
- OpenAI
- 지도학습
- LG Aimers
- LG Aimers 4th
- LLM
- supervised learning
- ChatGPT
- regression
- 딥러닝
Archives
- Today
- Total
SYDev
Chapter 05-2: 교차 검증과 그리드 서치 본문
검증 세트의 필요성을 이해하여 교차 검증 방법을 학습하고,
그리드 서치와 랜덤 서치를 이용해 최적의 하이퍼파라미터를 찾아보자.
검증 세트
- 테스트 세트로 일반화 성능을 올바르게 예측하려면 가능한 테스트 세트를 사용하지 말고, 모델을 만들고 마지막에 한 번 사용하는 것이 좋다.
- 테스트 세트를 사용하지 않고, 훈련 세트를 또 나누어 임시로 사용하는 데이터셋을 검증 세트(validation set)라 부른다.
- 이렇게 나눈 검증 세트를 이용하여 파라미터를 바꿔가며 최적의 파라미터를 찾은 후, 훈련 세트와 검증 세트를 합쳐 해당 파라미터로 모델을 학습한다.
- 마지막으로 테스트 세트에서 최종 점수를 평가한다.
#와인 데이터셋 넘파이 배열로 변환
import pandas as pd
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개의 검증 점수를 평균한 것이 학습 모델의 성능이 된다.
#교차 검증
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 매개변수로 지정
참고자료
- 박해선, <혼자 공부하는 머신러닝+딥러닝>, 한빛미디어(주), 2022.2.4
- https://wooono.tistory.com/105
'KHUDA 4th > 머신러닝 기초 세션' 카테고리의 다른 글
[KHUDA 4th] 머신러닝 4주차 기초 세션 (08.16) (0) | 2023.08.25 |
---|---|
Chapter 05-3: 트리의 앙상블 (0) | 2023.08.22 |
Chapter 05-1: 결정 트리 (0) | 2023.08.22 |
[KHUDA 4th] 머신러닝 3주차 기초 세션 (08.16) (1) | 2023.08.19 |
Chapter 04-2: 확률적 경사 하강법 (0) | 2023.08.14 |