고급 머신러닝 - Hyper Parameter 및 AutoML

1. Hyperparameter 튜닝문제

모델의 파라미터는 어떻게 설정해야 할까?
사용하려는 모델의 Docs를 참고하며 진행하자.
  • RandomForestClassifier, XGBClassifier
  • baysian optimization

1) grid search 

- 옵션 값을 리스트로 놓고 돌리는 방법

단점: 사용자가 정한것만, 오래걸림 

nlist = [50, 70, 100]

for n in nlist: # n, m in list   # max_leaf = m

    model = RandomForestClassifier(n_estimators = n)

    model.fit(X_train, X_valid)

    prediction = model.predict(X_valid)

    print(accuracy(y_valid, prediction)) # 옵션값 바꿀때마다 성능 모니터링


2) random search 

- 옵션 값의 범위를 지정해놓고 랜덤으로 뽑아서 돌리는 방법

단점: 성능 상관없이 무식하게 랜덤으로 뽑는 방법


3) 베이지안 최적화

- 옵션값을 랜덤으로 놓고 몇번 돌려본다음에, 최적의 옵션 값을 베이지안 기반으로 예측함.

- 다만 아래와 같이, 값이 소수로 나오기 때문에 파라미터가 int 형이라면 형에 맞게 넣어줘야 한다.

  • n_estimatros = 50.23132132
  • int(50.23132132) <- 50


# 베이지안 최적화

from bays_opt import BayesianOptization

# make moons 랜덤 이진분류 데이터

from sklearn.datasets import make_moons 


4) 옵튜나 - 현재 최고로 쓰이는 기법

- 구간을 설정하면 알아서, 최적 값을 잡아준다.

ex)

1. 데이터, x-y나누기, 전처리(문자>숫자), train-valid쪼개기, 스케일링

2. 파라미터 튜닝

!pip install optuna
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost
import optuna


from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (
    accuracy_score,
    precision_score,
    recall_score,
    f1_score,
)

def objective(trial): # 옵튜나 객체
    param = {
        'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
        # 'criterion': trial.suggest_categorical('criterion', ['gini', 'entropy', 'log_loss']),
        # 'max_depth': trial.suggest_int('max_depth', 1, 50),
        # 'min_samples_split': trial.suggest_int('min_samples_split', 2, 20),
        # 'min_samples_leaf': trial.suggest_int('min_samples_leaf', 1, 20),
        # 'min_weight_fraction_leaf': trial.suggest_float('min_weight_fraction_leaf', 0.0, 0.5),
        # 'max_features': trial.suggest_categorical('max_features', ['sqrt', 'log2', None]),
        # 'max_leaf_nodes': trial.suggest_int('max_leaf_nodes', 10, 100),
        # 'min_impurity_decrease': trial.suggest_float('min_impurity_decrease', 0.0, 0.5),
        # 'bootstrap': trial.suggest_categorical('bootstrap', [True, False]),
        # 'oob_score': trial.suggest_categorical('oob_score', [True, False]),
        # 'warm_start': trial.suggest_categorical('warm_start', [True, False]),
        # 'class_weight': trial.suggest_categorical('class_weight', [None, 'balanced', 'balanced_subsample']),
        # 'ccp_alpha': trial.suggest_float('ccp_alpha', 0.0, 0.5),
        # 'max_samples': trial.suggest_float('max_samples', 0.1, 1.0) if trial.suggest_categorical('use_max_samples', [True, False]) else None,
        # 'random_state': 1,  # 고정
        # 'n_jobs': -1  # 고정
    }
    model = RandomForestClassifier(**param)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_valid)
    return f1_score(y_valid, y_pred, average='micro') # f1 score는 이진분류 이기 때문에 macro 꼭 해줄 것.
    # 클래스 갯수가 비슷하게 있으면, macro. 아니면 micro


# Create the study
study = optuna.create_study(direction='maximize') # maximize 분류 # 회귀는 minimize
              # 탐색함수, 시도할 횟수
study.optimize(objective, n_trials=100)


# best parameters
print('Best parameters', study.best_params)


model = RandomForestClassifier(**study.best_params) # 최적의 하이퍼 파라미터
model.fit(X_train, y_train)
# y_pred = model.predict(X_valid))
# print('f1_score: ', f1_score(y_valid), y_pred))


# 예측값
y_pred = model.predict(X_valid)

# 정확도
print("Accuracy:", accuracy_score(y_valid, y_pred))

# 정밀도, 재현율, F1 (macro 기준)
print("Precision (macro):", precision_score(y_valid, y_pred, average='macro'))
print("Recall (macro):", recall_score(y_valid, y_pred, average='macro'))
print("F1-score (macro):", f1_score(y_valid, y_pred, average='macro'))

2. Model selection

어떤 모델이 가장 좋을까?

1. Pycaret

- stack ( 여러개의 모델을 이용한 앙상블 ) 을 지원한다.

!pip install pycaret

데이터셋

#pycaret에서 제공하는 'juice' 데이터
from pycaret.datasets import get_data
data = get_data('juice')
#data.info()
print(data)

모델 비교 준비

from pycaret.classification import *  # setup, compare_models
setup_clf = setup(data=data, target='Purchase')
class_top = compare_models()
class_top


2. Autogluon

- 데이터를 몽땅 다 주고서 모델별 스코어를 비교하는 라이브러리




댓글 쓰기

다음 이전