model selection, 교차검증(cross validation), hold-out method, k-fold cross validation, 하이퍼 파라미터 최적화, RandomizedSearchCV, GridSearchCV, target encoder
교차 검증
cross_val_score
을 사용하면 교차검증을 쉽게 적용할 수 있다고 하는데, 일단 참고만 하자. 실습을 하면서 실제로 써본 적은 없다. 뒤에 배울 Random search cv를 주로 썼다.하이퍼 파라미터 최적화
검증곡선(validation curve)
을 그리며 확인할 수도 있다. (검증곡선에 대해선 필요시 더 찾아보자)RandomizedSearchCV
를 주로 사용했다. 이걸 설명할 때는 GridSearchCV
를 함께 설명하는게 좋겠다.RandomizedSearchCV
를 더 자주 사용한다고는 한다.from scipy.stats import randint, uniform
pipe = make_pipeline(
TargetEncoder(),
SimpleImputer(),
RandomForestRegressor(random_state=2)
)
dists = {
'targetencoder__smoothing': [2.,20.,50.,60.,100.,500.,1000.], # int로 넣으면 error(bug)
'targetencoder__min_samples_leaf': randint(1, 10),
'simpleimputer__strategy': ['mean', 'median'],
'randomforestregressor__n_estimators': randint(50, 500),
'randomforestregressor__max_depth': [5, 10, 15, 20, None],
'randomforestregressor__max_features': uniform(0, 1) # max_features
}
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);
dists
부분에는 내가 탐색하고자 하는 하이퍼 파라미터와 그 범위를 지정해주면 된다. RandomizedSearchCV
중에 scoring 잘 넣는거 유의해야 한다. cv를 쭉 하면서 이 지정된 score가 가장 높은 걸 찾아 뱉어주기 때문이다. 또한 n_iter
와 cv
도 유의해서 사용해야 하는데, 이 탐색을 랜덤하게 50번 * 교차검증을 3번(fold 수 = 3이므로) 한다면, 총 150번의 탐색을 하는 것이기 때문에 잘 못 설정하면 시간이 아주 올래 걸리기 때문이다. clf.best_params_ #탐색결과 찾아낸 최적의 파라미터 값을 확인할 수 있음.
-clf.best_score_ # -를 붙인 것은 그 값이 작아질 수록 성능이 좋아지는 걸 뜻하는 score 종류에 붙는다.
clf.cv_results_ #이걸 잘 sort하면 파라미터 조합으로 만들어진 모델들을 순위별로 나열할 수도 있다.
pipe = clf.best_estimator_
# 만들어진 모델 중 가장 성능이 좋은 모델을 이렇게 불러올 수 있다. 중요!!!!
class_weight
주는 거랑 Simpleimputer
, target_encoding
잘 설정하는 것도 모델 성능에 큰 영향을 준다고 한다.