XGBOOST 분석

강민수·2023년 3월 4일
0



Loss function

  1. Bagging의 기본적인 loss 식으로써 이전 time series (t-1)에서의 예측값에 현재 분류기의 예측 function을 더한 형태에 regularization 항을 더함
  2. 이 식을 2차 테일러 전개식을 이용한 유클리디안 공간으로의 근사(leaf를 합친후 가중치 계산 = leaf별 가중치 계산 유의)
  3. 구해진 loss func를 최소로 만드는 w를 구하고 대입하여 loss 함수 완성
  4. 모든 특징과 데이터에 대하여 branch를 무한히 만들어 나가며 트리를 만다는 것은 불가능하기 때문에, 현재 노드 기준으로 왼쪽과 오른쪽 branch의 loss와 전체 트리의 loss의 차를 이용한 loss func를 선택한다.

부가적 방법론

  • shrinkage
    tree마다 가중치를 주어 각각의 tree가 가지는 영향력을 줄여 일반화 성능을 올리는 기법
  • column sampling
    Random Forest에서 등장한 개념으로 tree마다 사용하는 column을 다르게 하여 일반화 성능을 올리는 기법

Split point

  • 기존의 Greedy 방식
    -> 가능한 모든 경우에 대하여 순회하면서 최적의 지점을 찾는다
  • Approximate algorithm (paper propose)
    -> 가능한 경우들을 나열하고 일정 개수씩 잘라서(quantile) 가능한 candidate를 만들어 계산
    -> Greedy보다 부정확할 수 있지만 computation 측면에서 효율적(병렬화 가능)

Sparsity-aware split finding

현실의 데이터는 연속적이지 않고 군데군데 비어있는 경우가 많이 존재한다.
1. 데이터가 one-hot encoding 되어있는 경우
2. missing value가 존재하는 경우
3. 통계적으로 0같은 특정값이 많이 존재하는 경우

-> 이런 경우들에 대하여 값을 한쪽 브랜치로 몰아넣음으로써 해결

xgboost parameter

  • eta(learning_rate): learning rate(default = 0.3)
  • gamma(min_split_loss): 새로운 branch를 만들기 위한 최소 loss 값(default = 0)
  • max_depth: 최대 트리 깊이 - overfitting 고려(default = 6)
  • lambda: L2 regularization (d=1)
  • alpha: L1 regularization (d=0)
  • min_child_weight: 각 leaf노드에 포함되어야 하는 최소 sample 수 - overfitting 방지(d=1)
  • max_delta_step: 극단적인 class imbalance 상황에서 사용(d=0)
    -subsample: iteration마다 데이터의 일부만 사용하여 overfitting 방지하는 방식(0~1 비율값 d=1)
  • sampling_method: 위의 subsample하는 방식(uniform,subsample,gradient_based)
    colsample_bytree: column sampling (bylevel,bynode 도 존재)
  • tree method: 트리 만드는 방식(exact -greedy, approx -approximation, hist, gpu_hist)
  • scale_pose_weight: imbalace 상황에서 사용

optuna를 이용한 tuning

import optuna
from optuna.samplers import TPESampler
from optuna import Trial

def objective(trial):
    X = train.drop("Strength",axis=1)
    y = train["Strength"]
    train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.2,random_state=42)
    param = {
        'lambda': trial.suggest_float('lambda', 1e-3, 0.1),
        'alpha': trial.suggest_float('alpha', 1e-3, 1.0),
        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.4, 1),
        'subsample': trial.suggest_float('subsample', 0.4, 1),
        'learning_rate': trial.suggest_float('learning_rate',0.0001, 0.1),
        'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
        'max_depth': trial.suggest_int('max_depth', 4,8),
        'min_child_weight': trial.suggest_int('min_child_weight', 2, 50),
    }
    model =XGBRegressor(**param)  
    
    model.fit(train_x,train_y,eval_set=[(test_x,test_y)],early_stopping_rounds=100)
    
    preds = model.predict(test_x)

	return


sampler = TPESampler()

study_xgb = optuna.create_study(
    direction='minimize',
    study_name = 'Xgboost Optuna', 
    sampler=sampler
)
study_xgb.optimize(objective, n_trials=50)

0개의 댓글