2017년 9월 12일 화요일

[ML] XGBoost 파라미터에 대한 이해.

'Tree'
=> When Trees forms a 'Forest' (Tree Ensembles)

Tree Ensembles 개념을 쓰는 알고리즘이 몇가지 있다.
1. Random Forest (Breiman 1997)
2. Gradient Tree Boosting (Friedman 1999)
3. Gradient Tree Boosting with Regularization (variant of original GBM)
 = XGBoost (eXtreme Gradient Boosting)

...

캐글에서 예측 모델로 이걸 많이 쓴다. 그만큼 예측 성능이 좋고, 병렬로 동작하기 때문에 속도도 빠르다. 일단 따라 써보는건 어렵지 않았는데 파라미터 이름과 의미가 생소했기 때문에 파라미터를 임의로 조절할 수 없었다. 그러다가 어떤 아티클에서 다음과 같은 문구를 읽게 되었는데...
"using xgboost without parameter tuning is like driving a car without changing its gears; you can never up your speed."
헐.. 그래서 XGBoost의 파라미터에 대해 정리해보고자 한다. 정리하고도 뭐가 뭔지 잘 모르겠지만 :D,, 일단 정리하고 보자. xgboost를 이용하는 기본 꼴은 이렇다.

[python]
import xgboost as xgb

# read in data
dtrain = xgb.DMatrix(x_train, y_train)
dtest = xgb.DMatrix(x_test)

# specify parameters via map
param = {'max_depth': 4, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic' }
num_round = 100
bst = xgb.train(param, dtrain, num_round)

# make prediction
preds = bst.predict(dtest)

:: 이제 파라미터에 대해 알아보자.
  XGBoost의 파라미터는 아래 General Parameters, Booster Parameters, Learning Task Parameters의 3개 카테고리로 구분된다. 각 카테고리에 대한 주요 파라미터는 아래와 같고, 모든 파라미터에 대한 정보가 필요하다면 공식 문서를 참조하자.

□ General Parameters : XGBoost의 전반적인 기능을 정의함.
 > booster [default=gbtree] >> 일반적으로 gbtree의 성능이 낫다.
   - gbtree: tree-based models
   - gblinear: linear models
 > silent [default=0]
   - 1: 동작 메시지를 프린트하지 않음.

□ Booster Parameters (아래는 gbtree booster 기준으로 정리되어있음.)
 > eta [default=0.3] => learning_rate
   - GBM의 학습 속도와 유사.
   - 각 단계에서 가중치를 줄임으로써 모델을 더 강건하게 만든다.
   - 일반적으로 0.01-0.2
 > min_child_weight [default=1] (Should be tuned using CV)
   - child의 관측(?)에서 요구되는 최소 가중치의 합
   - over-fitting vs under-fitting을 조정하기 위한 파라미터.
   - 너무 큰 값이 주어지면 under-fitting.
 > max_depth [default=6] (Should be tuned using CV)
   - 트리의 최대 깊이.
   - 일반적으로 3-10
 > max_leaf_nodes
   - 최종 노드의 최대 개수. (max number of terminal nodes)
   - 이진 트리가 생성되기 때문에 max_depth가 6이면 max_leaf_nodes는 2^6개가 됨.
 > gamma [default=0]
   - 분할을 수행하는데 필요한 최소 손실 감소를 지정한다.
   - 알고리즘을 보수적으로 만든다. loss function에 따라 조정해야 한다.
 > subsample [default=1]
   - 각 트리마다의 관측 데이터 샘플링 비율.
   - 값을 적게 주면 over-fitting을 방지하지만 값을 너무 작게 주면 under-fitting.
   - 일반적으로 0.5-1
 > colsample_bytree [default=1]
   - 각 트리마다의 feature 샘플링 비율.
   - 일반적으로 0.5-1
 > lambda [default=1] => reg_lambda
   - 가중치에 대한 L2 정규화 용어 (Ridge 회귀 분석과 유사(?))
 > alpha [default=0] => reg_alpha
   - 가중치에 대한 L1 정규화 용어 (Lasso 회귀 분석과 유사(?))
 > scale_pos_weight [default=1]
   - 불균형한 경우 더 빠른 수렴(convergence)에 도움되므로 0보다 큰 값을 쓸것.

□ Learning Task Parameters : 각 단계에서 계산할 최적화 목표를 정의하는 데 사용된다.
 > objective [default=reg:linear]
   - binary:logistic : 이진 분류를 위한 로지스틱 회귀, 예측된 확률을 반환한다. (not class)
   - multi:softmax : softmax를 사용한 다중 클래스 분류, 예측된 클래스를 반환한다. (not probabilities)
   - multi:softprob : softmax와 같지만 각 클래스에 대한 예상 확률을 반환한다.
 > eval_metric [default according to objective]
   - 회귀 분석인 경우 'rmse'를, 클래스 분류 문제인 경우 'error'를 default로 사용.
   - rmse : root mean square error
   - mae : mean absolute error
   - logloss : negative log-likelihood
   - error : Binary classification error rate (0.5 threshold)
   - merror : Multiclass classification error rate
   - mlogloss : Multiclass logloss
   - auc : Area under the curve
 > seed [default = 0]
   - 난수 시드
   - 재현 가능한 결과를 생성하고 파라미터 튜닝에도 사용할 수 있다.

:: 원문 링크
  > https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

+ 용어 정리.
  # 부스팅(Boosting)? Bagging과 유사하나 Bagging과 다르게 순차적으로 학습을 시킨다. 학습 결과에 가중치를 부여하게 되는데 오답에 높은 가중치를 부여해 정확도를 높게 가져가는 것이 목적이다. (XGBoost, AdaBoost, GradientBoost)
  부스팅은 여러 분류기가 상호보완적 역할을 할 수 있도록 단계적으로 학습을 수행하여 결합함으로써 성능을 올리기 위한 방법이다. (약한 분류기를 세트로 묶는다.)
부스팅이 배깅과 다른 가장 큰 차이점은 분류기들을 순차 학습하도록 하여, 먼저 학습된 분류기의 결과가 다음 분류기의 학습에 정보를 제공하여 이전 분류기의 결점을 보완하는 방향으로 학습이 이루어지도록 한다는 것이다.

  # 배깅(Bagging)? 복원 랜덤 샘플링 방법을 이용해 동일한 모델을 여러 번 모델을 학습시키는 방법. (랜덤하게 추출된 데이터가 일종의 표본 집단이 되는셈.) 학습 과정에서 나온 결과를 중간값으로 맞춰주기 때문에 높은 Variance로 인한 Overfitting을 일부 극복할 수 있다. (RandomForest)


댓글 없음:

댓글 쓰기