혼자 공부하는 머신러닝 + 딥러닝 05-2 교차 검증과 그리드 서치

손지호·2023년 8월 5일
0

검증 세트

테스트 세트 사용하지 않으면 모델이 과대적합인지 과소적합인지 판단하기 어렵다. 테스트 세트를 사용하지 않고 이를 측정하는 간단한 방법은 훈련 세트를 또 나누는 것!! 이 데이터를 검증 세트(vaildation set)라고 부른다!!

앞에서 전체 테이터 중 20%를 테스트 세트로 만들고 나머지 80%를 훈련 세트로 만들었다. 이 훈련 세트 중에서 다시 20%를 떼어 검증 세트로 만든다.

+ 테스트 세트와 검증 세트에 얼마나 많은 샘플을 덜어 놔야 하나요?
보통 2-30%를 테스트 세트와 검증 세트로 떼어 놓음. 하지만 문제에 따라 다르다. 훈련 데이터가 아주 많다면 단 몇 %만 떼어 놓아도 전체 데이터를 대표하는 데 문제가 없음!

훈련 세트에서 모델을 훈련하고 검증 세트로 모델을 평가함. 이런 식으로 테스트하고 싶은 매개변수를 바꿔가며 가장 좋은 모델을 고른다. 그 다음 이 매개변수를 사용해 훈련 세트와 검증 세트를 합쳐 전체 훈련 데이터에서 모델을 다시 훈련한다. 그리고 마지막에 테스트 세트에서 최종 점수를 평가한다. 아마도 실전에 투입했을 때 테스트 세트의 점수와 비슷한 성능을 기대할 수 있을 것!

# 이전 절에 사용했던 데이터 다시 불러와 검증 세트 만들어 보기.
import pandas as pd

wine = pd.read_csv('https://bit.ly/wine_csv_data')

# class열을 타깃으로 사용하고 나머지 열은 특성 배열에 저장.
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

# 훈련 세트의 입력 데이터와 타깃 데이터를 train_input과 train_target 배열에 저장.
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)

그다음 train_input과 train_target을 다시 train_test_split() 함수에 넣어 훈련 세트 sub_input, sub_target과 검증 세트 val_input, val_target을 만든다. 여기에서도 test_size 매개변수를 0.2로 지정하여 train_input의 약 20%를 val_input으로 만든다.

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)

→ 원래 5,197개였던 훈련 세트가 4,157개로 줄고, 검증 세트는 1,040개가 됨. 이제 sub_input, sub_target과 val_input, val_target 사용해 모델을 만들고 평가해보기.

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

이렇게 val_input, val_target 사용해 모델 평가하면 됨! 이 모델은 확실히 훈련 세트에 과대적합. 매개변수를 바꿔서 더 좋은 모델 찾아야한다. 그 전에 검증 세트에 관해 좀 더 알아야 할 것이 있음!


교차 검증

검증 세트 만든다고 훈련 세트가 줄었고, 많은 데이터 훈련 할 수록 좋은 모델이 만들어진다. 그렇다고 검증 세트 너무 조금 떼어 놓으면 검증 점수가 들쭉날쭉하고 불안정 할 것. 이때 교차 검증(cross validation) 이용하면 안정적인 검증 점수를 얻고 훈련에 더 많은 데이터 사용 가능!

교차 검증은 검증 세트를 뗴어 내어 평가하는 과정을 여러 번 반복함. 그다음 이 점수를 평균하여 최종 검증 점수를 얻는다.

+ 3-폴드 교차 검증이 뭔가요?
훈련 세트를 세 부분으로 나눠서 교차 검증을 수행하는 것을 3-폴드 교차 검증이라고 한다. 통칭 k-폴드 교차 검증(k-fold cross validation)이라고 하며, 훈련 세트를 몇 부분으로 나누냐에 따라 다르게 부른다. k-겹 교차 검증이라고도 부른다.

보통 5-폴드 교차 검증이나 10-폴드 교차 검증 많이 사용함. 이렇게 하면 데이터의 8-90%까지 훈련에 사용 가능. 검증 세트가 줄어들지만 각 폴드에서 계산한 검증 점수를 평균하기 때문에 안정된 점수로 생각할 수 있음!

사이킷런에는 crossvalidate()라는 교차 검증 함수가 있음. 사용법은 간단한데, 먼저 평가할 모델 객체를 첫 번째 매개변수로 전달한다. 그 다음 앞에서처럼 직접 검증 세트를 떼어 내지 않고 훈련 세트 전체를 cross_validate() 함수에 전달.
사이킷런에는 crossvalidate() 함수의 전산인 cross_val_score() 함수도 있음. 이 함수는 cross_validate() 함수의 결과 중 test_score 값만 반환함.

from sklearn.model_selection import cross_validate

scores = cross_validate(dt, train_input, train_target)
print(scores)
>>> {'fit_time': array([0.00931716, 0.00749564, 0.00773239, 0.00731683, 		0.00710797]), 'score_time': array([0.00109315, 0.00111032, 0.00101209, 		0.00106931, 0.00115085]), 'test_score': array([0.86923077, 0.84615385, 		0.87680462, 0.84889317, 0.83541867])}

이 함수는 fit_time, score_time, test_score 키를 가진 딕셔너리를 반환. 처음 2개의 키는 각각 모델을 훈련하는 시간과 검증하는 시간을 의미함. 각 키마다 5개의 숫자가 담겨 있다. cross_validate() 함수는 기본적으로 5-폴드 교차 검증을 수행. cv 매개변수에서 폴드 수를 바꿀 수도 있음.

훈련과 검증 시간은 코랩에서 리소스를 사용하는 상황에 따라 달라지 수 있으므로 fit_time과 score_time 세트는 출력결과가 책과 다를 수 있음!

교차 검증의 최종 점수는 test_score 키에 담긴 5개의 점수를 평균하여 얻을 수 있음. 이름은 test_score지만 검증 폴드의 점수!!

import numpy as np

print(np.mean(scores['test_score']))
>>> 0.855300214703487

교차 검증 수행하면 입력한 모델에서 얻을 수 있는 최상의 검증 점수를 가늠해 볼 수 있음!!
한 가지 주의할 점은 cross_validate()는 훈련 세트를 섞어 폴드를 나누지 않음. 앞서 우리는 train_test_split() 함수로 전체 데이터를 섞은 후 훈련 세트를 준비했기 때문에 따로 섞을 필요가 없음. 하지만 만약 교차 검증을 할 때 훈련 세트를 섞으려면 분할기(splitter)를 지정.

사이킷런의 분할기는 교차 검증에서 폴드를 어떻게 나눌지 결정해줌. 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']))
>>> 0.855300214703487

# 10-폴드 교차 검증 수행하는 코드
splitter = StratifiedKFold(n_splits=10(←이게 몇(k) 폴드 교차 검증 할지 정함.), shuffle=True, random_state=42)
scores = cross_validate(dt, train_input, train_target, cv=splitter)
print(np.mean(scores['test_score']))
>>> 0.8574181117533719

하이퍼파라미터 튜닝

하이퍼파라미터 : 모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터. 사이킷런과 같은 머신러닝 라이브러리를 사용할 때 이런 하이퍼파라미터는 모두 클래스나 메서드의 매개변수로 표현.

하이퍼파라미터 튜닝하는 작업은 먼저 라이브러리가 제공하는 기본값을 그대로 사용해 모델 훈련. 그 다음 검증 세트의 점수나 교차 검증을 통해 매개변수를 조금씩 바꿔 봄. 모델마다 적게는 1-2개에서 많게는 5-6개의 매개변수를 제공. 이 매개변수를 바꿔가면서 모델을 훈련하고 교차 검증을 수행.

하지만 결정 트리 모델에서 max_depth 값의 최적값은 min_sample_split 매개변수의 값이 바뀌면 함께 달라진다. 즉, 이 두 매개변수를 동시에 바꿔가며 최적의 값을 찾아야 한다.

게다가 매개변수가 많아지면 문제는 더 복잡! 파이썬의 for 반복문으로 이런 과정을 직접 구현할 수도 있지만, 미리 만들어진 그리드 서치(Grid Search)를 사용하면 편리함!!

사이킷런의 GridSearchCV 클래스는 친절하게도 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행. 별도로 cross_validate() 함수를 호출할 필요가 없음.

# 기본 매개변수를 사용한 결정 트리 모델에서 min_impurity_decrease 매개변수의 최적값 찾아보기.
# GridSearchCV 클래스 임포트하여 탐색할 매개변수와 탐색할 값의 리스트를 딕셔너리로 만듦.
from sklearn.model_selection import GridSearchCV

params = {'min_impurity_decrease': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}

# GridSearchCV 클래스에 탐색 대상 모델과 params 변수를 전달하여 그리드 서치 객체를 만듦.
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)

결정 트리 클래스의 객체를 생성하자마자 바로 전달. 그 다음 일반 모델을 훈련하는 것처럼 gs 객체에 fit() 메서드를 호출. 이 메서드 호출하면 그리드 서치 객체는 결정 트리 모델 min_impurity_decrease 값을 바꿔가며 총 5번 실행.

GridSearchCV의 cv 매개변수 기본값은 5. 따라서 min_impurity_decrease 값마다 5-폴드 교차 검증을 수행함. 결국 5 x 5 = 25개의 모델을 훈련함!! 많은 모델 훈련하기 대문에 GridSearchCV 클래스의 n_jobs 매개변수에서 병렬 실행에 사용할 CPU 코어 수를 지정하는 것이 좋음. 이 매개변수의 기본값은 1. -1로 지정하면 시스템에 있는 모든 코어 사용 가능.

gs.fit(train_input, train_target)
>>> GridSearchCV
estimator: DecisionTreeClassifier

DecisionTreeClassifier

교차 검증에서 최적의 하이퍼파라미터를 찾으면 전체 후련 세트로 모델을 다시 만들어야함. 편리하게도 사이킷런의 그리드 서치는 훈련이 끝나면 25개의 모델 중에서 검증 점수가 가장 높은 모델의 매개변수 조합으로 전체 훈련 세트에서 자동으로 다시 모데을 훈련한다. 이 모델은 gs 객체의 bestestimator속성에 저장되어 있음. 이 모델을 일반 결정 트리처럼 똑같이 사용할 수 있다.

dt = gs.best_estimator_
print(dt.score(train_input, train_target))
>>> 0.9615162593804117

# 그리드 서치로 찾은 최적의 매개변수는 best_params_ 속성에 저장되어 있다.
print(gs.best_params_)
>>> {'min_impurity_decrease': 0.0001}

여기서는 0.0001이 가장 좋은 값으로 선택되었음. 각 매개변수에서 수행한 교차 검증의 평균 점수는 cvresults 속성의 'mean_test_score'키에 저장되어 있다.

# 5번의 교차 검증으로 얻은 점수 출력
print(gs.cv_results_['mean_test_score'])
>>> [0.86819297 0.86453617 0.86492226 0.86780891 0.86761605]

넘파이 argmax() 함수 사용하면 가장 큰 값의 인덱스 추출 가능. 그 다음 이 인덱스를 사용해 params 키에 저장된 매개변수를 출력할 수 있음. 이 값이 최상의 검증 점수를 만든 매개변수 조합이다.

# 앞서 출력한 gs.best_params_와 동일한지 확인해보기.
best_index = np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])
>>> {'min_impurity_decrease': 0.0001}

이 과정 정리
1. 먼저 탐색할 매개변수를 지정합니다.
2. 그 다음 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수가 나오는 매개변수 조합을 찾습니다. 이 조합은 그리드 서치 객체에 저장됩니다.
3. 그리드 서치는 최상의 매개변수에서 (교차 검증에 사용한 훈련 세트가 아니라) 전체 훈련 세트를 사용해 최종 모델을 훈련합니다. 이 모델도 그리드 서치 객체에 저장됩니다.

결정 트리에서 min_impurity_decrease는 노드를 분할하기 위한 불순도 감소 최소량을 지저한다. 여기에다가 max_depth로 트리의 깊이를 제한하고 min_sample_split으로 노드를 나누기 위한 최소 샘플 수도 골라보자.

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)-②
          }

넘파이 arange() 함수(①)는 첫 번째 매개변수 값에서 시작하여 두 번쨰 매개변수에 도달할 때까지 세 번째 매개변수를 더한 배열을 만든다. 코드에서는 0.0001에서 시작하여 0.001이 될 때까지 0.001을 계속 더한 배열. 두 번째 매개변수는 포함되지 않으므로 배열의 원소는 총 9개.
파이썬 range() 함수(②)도 비슷. 하지만 이 함수는 정수만 사용 가능. 이 경우 max_depth를 5에서 20까지 1씩 증가하면서 15개의 값 만들어냄. min_samples_split은 2에서 100까지 10씩 증가하면서 10개의 값을 만듦.
따라서 이 매개변수로 수행할 교차 검증 횟수는 9 x 15 x 10 = 1,350개. 기본 5-폴드 교차 검증을 수행하므로 만들어지는 모델의 수는 6,750개나 된다.

# n_jobs 매개변수를 -1로 설정하고 그리드 서치 실행
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)
>>> GridSearchCV
estimator: DecisionTreeClassifier

DecisionTreeClassifier
DecisionTreeClassifier(random_state=42)
# 최상의 매개변수 조합 확인
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

GridSearchCV 클래스를 사용하니 매개변수를 일일이 바꿔가며 교차 검증을 수행하지 않고 원하는 매개변수 값을 나열하면 자동으로 교차 검증을 수행해서 최상의 매개변수를 찾을 수 있다.


랜덤 서치

매개변수으 값이 수치일 때 값의 범위나 간격을 미리 정하기 어렵고 너무 많은 매개변수 조건이 있어 그리드 서치 수행 시간이 오래 걸릴 때, 랜덤 서치(Random Search)를 사용하면 좋다.
랜덤 서치에는 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달한다.
+ 싸이파이(sicpy)는 어떤 라이브러리?
파이썬의 핵심 과학 라이브러리 중 하나. 적분, 보간, 선형 대수, 확률 등을 포함한 수치 계산 전용 라이브러리. 사이킷런은 넘파이와 싸이파이 기능을 많이 사용. 코랩에도 설치되어 있음!

# 싸이파이에서 2개의 확률 분포 클래스를 임포트
from scipy.stats import uniform, randint

싸이파이의 stats 서브 패키지에 있는 uniform과 randint 클래스는 모두 주어진 범위에서 고르게 값을 뽑음. 이를 '균등 분포에서 샘플링한다'라고 말한다. randint는 정숫값을 뽑고, uniform은 실숫값을 뽑음.

# 0에서 10 사이의 범위를 갖는 randint 객체를 만들고 10개의 숫자를 샘플링
# 10개 밖에 되지 않아 샘플링 되는 것 같지 않아 보임.
rgen = randint(0, 10)
rgen.rvs(10)
>>> array([4, 7, 6, 8, 9, 3, 8, 3, 1, 4])

# 샘플링 숫자를 1,000개로 늘려 개수 세어보기
np.unique(rgen.rvs(1000), return_counts=True)
>>> (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 	array([116, 105,  95, 100,  84,  90,  97,  95, 107, 111]))
# 개수 늘어나니 0에서 9까지의 숫자가 어느 정도 고르게 추출. 

# uniform 클래스의 사용법도 동일. 0-1 사이에서 10개의 실수를 추출
ugen = uniform(0, 1)
ugen.rvs(10)
>>> array([0.07156624, 0.51330724, 0.78244744, 0.14237963, 0.05055468,
       0.13124955, 0.15801332, 0.99110938, 0.08459786, 0.92447632])

난수 발생기랑 유사하게 생각하면 된다. 랜덤 서치에 randint과 uniform 클래스 객체를 넘겨주고 총 몇 번을 샘플링해서 최적의 매개변수를 찾으라고 명령할 수 있음. 샘플링 횟수는 시스템 자원이 허락하는 범위 내에서 최대한 크게 하는 것이 좋음.
탐색할 매개변수의 딕셔너리 만들어보기. 여기서는 min_samples_leaf 매개변수를 탐색 대상에 추가. 이 매개변수는 리프 노드가 되기 위한 최소 샘플의 개수. 어떤 노드가 분할하여 만들어질 자식 노드의 샘플 수가 이 값보다 작을 경우 분할하지 않음.

# 탐색할 매개변수 범위
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),
          }

min_imputiry_decrease는 0.0001에서 0.01 사이의 실숫갑을 샘플링함. max_depth는 20에서 50 사이의 정수, min_samples_split은 2에서 25 사이의 정수, min_samples_leaf는 1에서 25 사이의 정수 샘플링. 샘플링 횟수는 사이킷런의 랜덤 서치 클래스인 RandomizedSearchCV의 n_iter 매개변수에 지정.

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)
>>> RandomizedSearchCV
estimator: DecisionTreeClassifier
DecisionTreeClassifier(random_state=42)

DecisionTreeClassifier
DecisionTreeClassifier(random_state=42)

위 parmas에 정의된 매개변수 범위에서 총 100번(n_iter 매개변수)을 샘플링하여 교차 검증을 수행하고 최적의 매개변수 조합을 찾음. 앞서 그리드 서치보다 훨씬 교차 검증 수를 줄이면서 넓은 영역을 효과적으로 탐색할 수 있음.

# 결과 확인. 최적의 매개변수 조합 출력.
print(gs.best_params_)
>>> {'max_depth': 39, 'min_impurity_decrease': 0.00034102546602601173, 'min_samples_leaf': 7, 'min_samples_split': 13}

# 최고의 교차 검증 점수도 확인
print(np.max(gs.cv_results_['mean_test_score']))
>>> 0.8695428296438884

최적의 모델은 이미 전체 훈련 세트(traininput, train_target)로 훈련되어 best_estimator 속성에 저장되어 있음.

# 아 모델을 최종 모델로 결정하고 테스트 세트의 성능 확인.
dt = gs.best_estimator_

print(dt.score(test_input, test_target))
>>> 0.86

테스트 세트 점수는 검증 세트에 대한 점수보다 조금 작은 것이 일반적. 테스트 세트 점수가 아주 만족스럽진 않지만 충분히 다양한 매개변수 테스트해서 얻을 결과임.




전체 코드 (출처 : https://bit.ly/hg-05-2)

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)


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))


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']))


from sklearn.model_selection import StratifiedKFold

scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))


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']))


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)

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))

정리

  • 검증 세트는 하이퍼파라미터 튜닝을 위해 모델을 평가할 때, 테스트 세트를 사용하지 않기 위해 훈련 세트에서 다시 떼어 낸 데이터 세트.
  • 교차 검증은 훈련 세트를 여러 폴드로 나눈 다음 한 폴드가 검증 세트의 역할을 하고 나머지 폴드에서는 모델을 훈련. 교차 검증은 이런 식으로 모든 폴드에 대해 검증 점수를 얻어 평균하는 방법.
  • 그리드 서치는 하이퍼파라미터 탐색을 자동화해 주는 도구. 탐색할 매개변수를 나열하면 교차 검증을 수행하여 가장 좋은 검증점수의 매개변수 조합을 선택. 마지막으로 매개변수 조합으로 최종 모델 훈련.
  • 랜덤 서치는 연속된 매개변수 값을 탐색할 때 유용. 탐색할 값을 직접 나열하는 것이 아니고 탐색 값을 샘플링할 수 있는 확률분포 객체를 전달. 지정된 횟수만큼 샘플링하여 교차 검증을 수행하기 때문에 시스템 자원이 허락하는 만큼 탐색량 조절 가능.

핵심 패키지와 함수

scikit-learn

  • cross_validate() : 교차 검증 수행하는 함수.
    첫 번째 매개변수에 교차 검증을 수행할 모델 객체를 전달함. 두 번째와 세 번째 매개변수에 특성과 타깃 데이터를 전달함.
    scoring 매개변수에 검증에 사용할 평가 지표를 지정할 수 있음. 기본적으로 분류 모델은 정확도를 의미하는 'accuracy', 회귀 모델은 결정계수를 의미하는 'r2'가 된다.
    cv 매개변수에 교차 검증 폴드 수나 스플리터 객체를 지정할 수 있음. 기본값은 5. 회귀일 때는 KFold 클래스를 사용하고 분류일 때는 StratifiedKFold 클래스 사용하여 5-폴드 교차 검증을 수행.
    n_jobs 매개변수는 교차 검증을 수행할 때 사용할 CPU 코어 수를 지정. 기본값은 1로 하나의 코어를 사용. -1로 지정하면 시스템에 있는 모든 코어 사용
    return_train_score 매개변수를 True로 지정하면 훈련 세트의 점수도 반환. 기본값은 False.
  • GridSearchCV : 교차 검증으로 하이퍼파라미터 탐색을 수행. 최상의 모델을 찾은 후 훈련 세트 전체를 사용해 최종 모델을 훈련함.
    첫 번째 매개변수로 그리드 서치를 수행할 모델 객체를 전달. 두 번째 매개변수에는 탐색할 모델의 매개변수와 값을 전달.
  • RandomizedSearchCV : 교차 검증으로 랜덤한 하이퍼파라미터 탐색을 수행. 최상의 모델을 찾은 후 훈련 세트 전체를 사용해 최종 모델을 훈련.
    첫 번째 매개변수로 그리드 서치를 수행할 모델 객체를 전달. 두 번째 매개변수에는 탐색할 모델의 매개변수와 확률 분포 객체를 전달.
    scoring, cv, n_jobs, return_train_score 매개변수는 cross_validate() 함수와 동일.
profile
초보 중의 초보. 열심히 하고자 하는 햄스터!

0개의 댓글