테스트 세트를 사용해 자꾸 성능을 확인하다 보면 모델을 점점 테스트 세트에 맞추게 된다.
테스트 세트를 사용하지 않으려면 모델이 과대적합인지 과소적합인지 판단하기 어렵다.
테스트 세트를 사용하지 않고 이를 측정하는 간단한 방법은 훈련세트를 또 나누는 것이다.
이 데이터를 검증세트라고 한다.
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)
sub_input: 훈련데이터 val_input: 검증데이터
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))
훈련세트에 과대적합->매개변수 바꿔서 더 좋은 모델 찾아야 한다.
검증세트를 만드느라 훈련세트가 줄었다.
많은 데이터를 훈련에 사용하면 좋은 모델이 보통 만들어진다.
하지만 검증세트를 너무 조금 사용하면 불안정하다.
->교차검증을 사용하면 안정적인 검증 점수를 얻고 훈련에 더 많은 데이터를 사용할 수 있음
3-폴드 교차 검증
= 훈련세트를 세 부분으로 나눠서 교차 검증을 수행하는 것. k-겹 교차검증이라고도 부른다.
이렇게 하면 데이터의 80%~90%까지 훈련에 사용할 수 있다.
검증세트가 줄어들지만 각 폴드에서 계산한 검증 점수를 평균하기 때문에 안정된 점수로 생각 가능하다.
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
print(scores)
import numpy as np
print(np.mean(scores['test_score']))
여기서 test_score은 검증폴드의 점수이다.
교차 검증을 수행하면 입력한 모델에서 얻을 수 있는 최상의 검증 점수를 가늠해 볼 수 있다.
주의할 점: 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-폴드 교차 검증을 수행하려면
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'])) #n_splits 매개변수는 몇(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)
gs.fit(train_input,train_target)
dt = gs.best_estimator_
print(dt.score(train_input, train_target))
print(gs.best_params_)
print(gs.cv_results_['mean_test_score'])
best_index = np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])
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']))
매개변수의 값이 수치일때 값의 범위나 간격을 미리 정하기 어려울 수 있다.
이때 랜덤서치를 사용하면 좋다
랜덤서치에는 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 확률분포객체를 전달한다
from scipy.stats import uniform, randint
rgen = randint(0,10)
rgen.rvs(10)
np.unique(rgen.rvs(1000), return_counts=True)
ugen = uniform(0,1)
ugen.rvs(10)
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))
키워드 정리
- 검증 세트 = 하이퍼파라미터 튜닝을 위해 모델을 평가할 때, 테스트 세트를 사용하지 않기 위해 훈련세트에서 다시 떼어 낸 데이터 세트
- 교차 검증 = 훈련 세트를 여러 폴드로 나눈 다음 한 폴드가 검증 세트의 역할을 하고 나머지 폴드에서는 모델을 훈련한다. 교차 검증은 이런 식으로 모든 폴드에 대해 검증 점수를 얻어 평균하는 방법이다.
- 그리드 서치 = 하이퍼파라미터 탐색을 자동화해 주는 도구이다. 탐색할 매개변수를 나열하면 교차 검증을 수행하여 가장 좋은 검증 점수의 매개변수 조합을 선택한다. 마지막으로 이 매개변수 조합으로 최종 모델을 훈련한다.
- 랜덤 서치 = 연속된 매개변수 값을 탐색할 때 유용하다. 탐색할 값을 직접 나열하는 것이 아니고 탐색 값을 샘플링할 수 있는 확률 분포 객체를 전달한다. 지정된 횟수만큼 샘플링하여 교차 검증을 수행하기 때문에 시스템 자원이 허락하는 만큼 탐색량을 조절할 수 있다.
출처:http://www.yes24.com/Product/Goods/96024871
혼자 공부하는 머신러닝+딥러닝 - YES24
- 혼자 해도 충분하다! 1:1 과외하듯 배우는 인공지능 자습서 이 책은 수식과 이론으로 중무장한 머신러닝, 딥러닝 책에 지친 ‘독학하는 입문자’가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있
www.yes24.com
'Machine Learning > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
6-2.p303~ k-평균 (0) | 2021.10.29 |
---|---|
6-1.p286~ 군집 알고리즘 (0) | 2021.10.28 |
5-3.p263~ 트리의 앙상블 (0) | 2021.10.28 |
03-3p150~특성 공학과 규제 (0) | 2021.09.13 |
01-1p.26~03-2p.149 (0) | 2021.09.13 |