반응형
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 |