모델 학습 시 사용자가 모델의 오차를 줄이기 위해 설정해주는 값을 하이퍼 파라미터라고 한다.

하이퍼 파라미터의 보통 경험치나 시험을 통해 알수 있어 최적화 값을 찾가 위해 CV모델등을 사용한다.

CV 는 cross validation의 약자로 Sklearn모델의 CV가 붙어있는 경우 하이퍼 파라미터를 기능이 추가된 모델이다.

Cross Validation은 교차검증으로 CV개수로 K Fold 교차검증하여 입력된 하이퍼 파라미터의 값의 평균을 검증한다. 

 

대표적인 CV모델이 GridSearchCV와 RandomSearchCV 등이 있고 RidgeCV 등 각 모델에 cross validation 기능을 제공하는 기능을 제공한다.

 

 

ElasticNet은 L1과 L2 규제가 있는 선형회귀 모델로 하이퍼 파라미터로 람다값의 alpha값과 L1과 L2의 비율인 l1_ratio 2개의 하이퍼 파라미터가 있다.

GridSearchCV는 입력하는 하이퍼 파라미터를 dic로 input이 필요하다.

param dictionary를 생성하여, alpha값과 l1_ratio값의 리스트를 정의한다.

from sklearn.linear_model import ElasticNet
model = ElasticNet()


from sklearn.model_selection import GridSearchCV
param = { 
    "alpha":[0.1,0.5,1.0,10,100], 
    "l1_ratio":[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
    ,}

 

GridSearchCV의 주요 파라미터로는 estimator로 model과 하이퍼 파라미터 값을 정의한 param_grid, 

cross_validation을 몇개로 분리할것인지 cv값 (K fold의 k값으로 생각하면 된다),

성능을 측정하기 위한 score 값이 있다. CV의 score는 값이 높은것이 best 값으로 판단하기 때문에 mean_squared_error처럼 값이 낮아야 좋은경우 neg_가 앞에 붙어 음수로 만들어 높은 값이 좋게 만들어준다.

SCORE에 입력 가능한 값은 sklearn.metrics.SCORES로 확인 가능하다.

vervose값을 1이상으로 입력 시 중간 처리과정을 확인할 수 있다. (시간이 오래 걸리므로)

 

grid = GridSearchCV(estimator=model, param_grid=param, cv=10, scoring="neg_mean_squared_error", verbose=1)
grid.fit(X_train,y_train)

grid.best_params_
# {'alpha': 100, 'l1_ratio': 1.0}

pred = grid.predict(X_test)

from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, pred)**0.5
20558.508566893157

best 하이퍼 파라미터는 best_params_로 값을 확인 할 수 있다

best param값으로 별도로 모델을 생성하지 않고, predict로 예측값을 생성할 수 있다.

 

from sklearn.metrics import SCORES

SCORERS
{'explained_variance': make_scorer(explained_variance_score),
 'r2': make_scorer(r2_score),
 'max_error': make_scorer(max_error, greater_is_better=False),
 'matthews_corrcoef': make_scorer(matthews_corrcoef),
 'neg_median_absolute_error': make_scorer(median_absolute_error, greater_is_better=False),
 'neg_mean_absolute_error': make_scorer(mean_absolute_error, greater_is_better=False),
 'neg_mean_absolute_percentage_error': make_scorer(mean_absolute_percentage_error, greater_is_better=False),
 'neg_mean_squared_error': make_scorer(mean_squared_error, greater_is_better=False),
 'neg_mean_squared_log_error': make_scorer(mean_squared_log_error, greater_is_better=False),
 'neg_root_mean_squared_error': make_scorer(mean_squared_error, greater_is_better=False, squared=False),
 'neg_mean_poisson_deviance': make_scorer(mean_poisson_deviance, greater_is_better=False),
 'neg_mean_gamma_deviance': make_scorer(mean_gamma_deviance, greater_is_better=False),
 'accuracy': make_scorer(accuracy_score),
 'top_k_accuracy': make_scorer(top_k_accuracy_score, needs_threshold=True),
 'roc_auc': make_scorer(roc_auc_score, needs_threshold=True),
 'roc_auc_ovr': make_scorer(roc_auc_score, needs_proba=True, multi_class=ovr),
 'roc_auc_ovo': make_scorer(roc_auc_score, needs_proba=True, multi_class=ovo),
 'roc_auc_ovr_weighted': make_scorer(roc_auc_score, needs_proba=True, multi_class=ovr, average=weighted),
 'roc_auc_ovo_weighted': make_scorer(roc_auc_score, needs_proba=True, multi_class=ovo, average=weighted),
 'balanced_accuracy': make_scorer(balanced_accuracy_score),
 'average_precision': make_scorer(average_precision_score, needs_threshold=True),
 'neg_log_loss': make_scorer(log_loss, greater_is_better=False, needs_proba=True),
 'neg_brier_score': make_scorer(brier_score_loss, greater_is_better=False, needs_proba=True),
 'positive_likelihood_ratio': make_scorer(positive_likelihood_ratio),
 'neg_negative_likelihood_ratio': make_scorer(negative_likelihood_ratio, greater_is_better=False),
 'adjusted_rand_score': make_scorer(adjusted_rand_score),
 'rand_score': make_scorer(rand_score),
 'homogeneity_score': make_scorer(homogeneity_score),
 'completeness_score': make_scorer(completeness_score),
 'v_measure_score': make_scorer(v_measure_score),
 'mutual_info_score': make_scorer(mutual_info_score),
 'adjusted_mutual_info_score': make_scorer(adjusted_mutual_info_score),
 'normalized_mutual_info_score': make_scorer(normalized_mutual_info_score),
 'fowlkes_mallows_score': make_scorer(fowlkes_mallows_score),
 'precision': make_scorer(precision_score, average=binary),
 'precision_macro': make_scorer(precision_score, pos_label=None, average=macro),
 'precision_micro': make_scorer(precision_score, pos_label=None, average=micro),
 'precision_samples': make_scorer(precision_score, pos_label=None, average=samples),
 'precision_weighted': make_scorer(precision_score, pos_label=None, average=weighted),
 'recall': make_scorer(recall_score, average=binary),
 'recall_macro': make_scorer(recall_score, pos_label=None, average=macro),
 'recall_micro': make_scorer(recall_score, pos_label=None, average=micro),
 'recall_samples': make_scorer(recall_score, pos_label=None, average=samples),
 'recall_weighted': make_scorer(recall_score, pos_label=None, average=weighted),
 'f1': make_scorer(f1_score, average=binary),
 'f1_macro': make_scorer(f1_score, pos_label=None, average=macro),
 'f1_micro': make_scorer(f1_score, pos_label=None, average=micro),
 'f1_samples': make_scorer(f1_score, pos_label=None, average=samples),
 'f1_weighted': make_scorer(f1_score, pos_label=None, average=weighted),
 'jaccard': make_scorer(jaccard_score, average=binary),
 'jaccard_macro': make_scorer(jaccard_score, pos_label=None, average=macro),
 'jaccard_micro': make_scorer(jaccard_score, pos_label=None, average=micro),
 'jaccard_samples': make_scorer(jaccard_score, pos_label=None, average=samples),
 'jaccard_weighted': make_scorer(jaccard_score, pos_label=None, average=weighted)}

+ Recent posts