Q . Cross Validation이란?
A . K-Fold Cross Validation의 경우, K개의 세트로 나누어 학습하고 모델링하여 평가한 세트들의 평균을 내여 검증하는 방법이다.
- Hold-out Validation : Train / Val / Test 세트로 나누어 학습을 진행하는 검증 방법이다.
학습에 사용가능한 데이터가 충분하다면 문제가 없겠지만, 훈련세트의 크기가 모델학습에 충분하지 않을 경우에 CV를 주로 사용한다.
검증세트 크기가 충분히 크지 않다면 예측 성능에 대한 추정이 부정확할 것이다.
시계열( time series ) 데이터에는 CV를 사용하기 힘들다.
from sklearn.model_selection import cross_val_score
k = 3
scores = cross_val_score(pipe, X_train, y_train, cv=k,
scoring='neg_mean_absolute_error')
Q . TargetEncoder란?
A .
모델의 복잡도를 높이는 과정에서 훈련/검증 세트의 손실이 함께 감소하는 시점은 과소적합(underfitting) 되었다고 한다.
이 때는 모델이 더 학습 될 여지가 있다. 하지만 어느 시점부터 훈련데이터의 손실은 계속 감소하는데 검증데이터의 손실은 증가하는 때가 있다. 이때 우리는 과적합(overfitting) 되었다고 한다.
이상적인 모델은 과소적합과 과적합 사이에 존재한다.
검증곡선은 훈련/검증데이터에 대해 ( x축, y축 ) = ( 스코어, 하이퍼파라미터 )로 그린 그래프이다.
validation_curve
from sklearn.model_selection import validation_curve
from sklearn.tree import DecisionTreeRegressor
pipe = make_pipeline(
OrdinalEncoder(),
SimpleImputer(),
DecisionTreeRegressor()
)
depth = range(1, 30, 2)
ts, vs = validation_curve(
pipe, X_train, y_train
, param_name='decisiontreeregressor__max_depth'
, param_range=depth, scoring='neg_mean_absolute_error'
, cv=3
, n_jobs=-1
)
cf. 훈련곡선( learning curve )이라는 용어는 x축이 훈련데이터 수( # of training samples )에 대해 그린 것이므로 검증곡선과 다르다.
여러 하이퍼파라미터를 찾기 위해 Randomized Search CV 사용한다.
하이퍼파라미터 : 모델 훈련중에 학습이 되지 않는 파라미터이다. 따라서, 사용자가 직접 정해주어야 한다.
현실적으로 하이퍼파라미터를 수작업으로 정해주는 것은 어렵다. 최적의 하이퍼파라미터 조합을 찾아주는 도구를 사용해야 한다. 사이킷런에 하이퍼파라미터 튜닝을 도와주는 좋은 툴이 두 가지 있다.
GridSearchCV : 검증하고 싶은 하이퍼파라미터들의 수치를 정해주고 그 조합을 모두 검증한다.
RandomizedSearchCV : 검증하려는 하이퍼파라미터들의 값 범위를 지정해주면 무작위로 값을 지정해 그 조합을 모두 검증한다.
pipe = clf.best_estimator_
: CV가 끝난 후 찾은 best parameter를 사용해 모든 학습데이터(all the training data)를 가지고 다시 학습( refit )한 상태이다.refit
: best parameter를 사용해 다시 학습( refit )한다.from sklearn.model_selection import RandomizedSearchCV
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True)
, SimpleImputer()
, StandardScaler()
, SelectKBest(f_regression)
, Ridge()
)
# 튜닝할 하이퍼파라미터의 범위를 지정해 주는 부분
dists = {
'simpleimputer__strategy': ['mean', 'median'],
'selectkbest__k': range(1, len(X_train.columns)+1),
'ridge__alpha': [0.1, 1, 10],
}
clf = RandomizedSearchCV(
pipe,
param_distributions=dists,
n_iter=50,
cv=3,
scoring='neg_mean_absolute_error',
verbose=1,
n_jobs=-1
)
clf.fit(X_train, y_train);
print('최적 하이퍼파라미터: ', clf.best_params_)
print('MAE: ', -clf.best_score_)
RandomizedSearchCV는 n_iter(=50) * 3 교차검증 = 150 tasks를 수행했다.
GridSearchCV의 경우 어마어마하게 많은 수행을 해야한다.