반응형
XGBoost

XGBoost

eXtreme Gradient Boosting

  • 병렬 처리로 학습, 분류 속도가 빠르다.
  • 다양한 옵션. Customizing 용이
  • Greedy 알고리즘을 사용한 자동 가지치기로 오버피팅 방지가 된다.
  • 다른 알고리즘과 연계에도 성능이 좋다. 뒷단에 다른 레이어 추가.

XGBoost는 딥러닝이 아니다. 여러가지 조건문들이 들어가는 가지치기로 보면 된다. Decision Tree라고 하고 이것들이 다 모이면 최종적으로 forest라고 한다
데이터에 따라 딥러닝보다 성능이 좋은 경우가 많다.

XGBoost는 CART(Classification and regression tree) 앙상블 모델을 사용한다. 모델끼리의 우의 비교를 통해 최종 결정을 내림.

파라미터

  • 일반 파라미터 ; 어떤 모델을 쓸 것인가?
    • gbtree, gblinear, dart
    • nthread ; 쓰레드 수. 디폴트는 max
    • num_feature ; 입력 차원. 디폴트는 max
  • 부스터 파라미터 ; 트리마다 가지치기 옵션
    • eta ; learning rate. 트리에 가지가 많을수록 과적합 발생.
    • gamma ; 정보획득에서 -r. 값이 클수록 트리 depth가 줄어든다. 디폴트는 0
    • max_depth ; 한 트리의 최대 깊이. 클수록 복잡도가 커짐. 즉, 과적합. 디폴트는 6으로 리프노드의 최대개수는 64가 된다.
    • lambda ; L2 Regularization. 클수록 보수적.
    • alpha ; L1 Regularization
  • 학습 과정 파라미터 ; 최적화
    • objective ; 목적함수. reg:linear, binary:logistic, count:poisson 등
    • num_rounds : 라운드 epoch 같은 개념. 너무 커도 좋지 않다.

파라미터를 알아야 모델을 구축할 수 있다.
binary classification 문제에 linear-regression을 적용하면 아무리해도 답이 안나온다.

  • 민감한 정도로 먼저 조정해야 될 것들
    • booster 모양
    • eval_metric(평가함수)/ objective(목적함수)
    • eta (epoch)
    • L1
    • L2

Sample1. XGBClassifier

from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot

dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
x=dataset[:,0:8]
y=dataset[:,8]

# fit model no training data
model = XGBClassifier()
model.fit(x,y)

plot_importance(model)
pyplot.show()
  • fitting후 plot_importance로 어떤 피쳐들의 중요도를 높게 보고있는지 막대그래프로 확인할 수 있다.
  • 중요도가 크게 떨어지는 피쳐들은 삭제하는 것이 성능에 좋은 영향을 주는 경우가 많다.

Sample2. XGBRegressor

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Imputer

# 데이터를 읽고, null 레코드 삭제
data = pd.read_csv('../input/train.csv')
data.dropna(axis=0, subset=['SalePrice'], inplace=True)
# 출력값은 집값
y = data.SalePrice
# 훈련데이터에서 집값제거하고 수치가 아닌 데이터 삭제.
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])
# 데이터 분리. train, validation data. 
train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)

# 데이터 전처리
my_imputer = Imputer()
train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)

  • sklearn의 preprocessing에 Imputer로 데이터를 전처리 하였다.
  • Imputer?
    • 누락 NA 데이터에 대한 전처리가 가능하다.
    • 데이터 파일에서 ‘na’ 스트링을 na로 인식하여 로딩하여도록 하려면 pd.read_csv(‘test.csv’, na_values=‘na’)
  • SimpleImputrer
    -누락된 데이터의 값을 특정 값으로 지정하거나 통계값으로 설정할 수 있다.
    • imp = SimpleImputer(missing_values=np.nan, strategy=‘mean’)
    • imp.fit( data ) ; fitting하여 통계 정보를 구한다.
    • X = imp.transform( data ) ; 위 통계 정보를 사용하여 np.nan값을 컬럼마다 평균값으로 채움.
    • missing_values=-1 로 하면 -1값을 누락값으로 인식.
    • strategy의 종류 ; mean, most_frequent (최고빈도로 스트링 컬럼(category)도 처리가 됨.)
  • Imputer
    • Imputer(missing_vaues=‘NaN’, strategy=‘mean’ , axis=0, verbose=0, copy=True) ; 기본값 확인. (여기는 특이하게 axis=0이 컬럼방향이다.)
from xgboost import XGBRegressor

my_model = XGBRegressor()
# Add silent=True to avoid printing out updates with each cycle
my_model.fit(train_X, train_y, verbose=False)

# make predictions
predictions = my_model.predict(test_X)

from sklearn.metrics import mean_absolute_error
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))
  • 학습은 위와 같이 매우 간단하다.

모델 튜닝

  • 성능을 올리기 위한 필수 과정.
  • n_estimators ; 학습 횟수
  • early_stopping_rounds ; n연속으로 발전(기존 max 갱신)이 없으면 강제 중지
my_model = XGBRegressor(n_estimators=1000)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
  • learning_rate ; 학습률
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
  • n_jobs ; 병렬처리로 보통 cpu core 수로 정하는 것이 좋다.

Author: crazyj7@gmail.com

'AI(DeepLearning)' 카테고리의 다른 글

[ChatGPT] 글쓰기  (0) 2023.02.09
[ChatGPT] 글쓰기 테스트  (1) 2023.02.09
처음해본 kaggle 도전기  (1) 2019.11.27
Custom EarlyStopping  (0) 2019.11.11
타이타닉 kaggle 자료 분석  (0) 2019.08.23

+ Recent posts