59doit
[ R ] xgboost 본문
xgboost
xgboost는 부스팅 방식을 기반으로 만들어진 모델
분류하기 어려운 특정 영역에 초점을 두고 정확도를 높이는 알고리즘 높은 정확도가 가장 큰 강점
배깅과 동일하게 복원 추출방식으로 첫 번째 학습 데이터 셋을 생성하는 방법은 동일
두 번째부터는 학습된 트리 모델의 결과를 바탕으로 정확도가 낮은 영역에 높은 가중치를 적용하여 해당 영역을 학습 데이터 셋으로 구성 즉, 기계학습이 안 되는 데이터셋을 집중적으로 학습하여 트리 모델의 정확도를 높이는 방식
X는 컬럼 이름을 가지는 데이터 메트릭스 형식이며, Y는 라벨 벡터, 즉 타겟값을 벡터 형태로 넣는 것이다. R에서 다루는 대부분의 데이터들이 데이터프레임 형식으로 되어있기 때문에 모델을 생성하기 전에 객체를 정의해야한다.
xgboost 인풋 정의
xgboost패키지 내 xgboost()함수 이용
xgboost(data = NULL, label = NULL, missing = NULL, params = list(), nrounds, verbose = 1, print.every.n = 1L, early.stop.round = NULL, maximize = NULL, ...)
objective: y변수가 이항(“binary:logistic”) 또는 다항(“multi:softmax”) 지정
max_depth: tree의 깊이 지정(tree-2인 경우 간단한 트리 생성)
nthread: 사용 수 지정
nrounds: 반복 학습 수 지정
eta: 학습률 지정(기본값 0.3: 숫자가 낮을수록 모델의 복잡도가 높아지고, 컴퓨팅 파워가 많아짐)
verbose: 메시지 출력 여부. 0: 메시지 출력 안함, 1: 메시지 출력)
xgbosst :
ex) 다항 분류 xgboost 모델 생성
#1 패키지 설치
install.packages("xgboost") library(xgboost) |
#1-1 iris 데이터
data(iris) iris summary(iris) |
변수 확인하기 > iris > Species 확인
#2 y변수 생성
iris_label <- ifelse(iris$Species == 'setosa', 0, ifelse(iris$Species == 'versicolor', 1, 2)) iris_label # [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # [34] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 # [67] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 # [100] 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 # [133] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 table(iris_label) # iris_label # 0 1 2 # 50 50 50 iris$label <- iris_label head(iris) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species label # 1 5.1 3.5 1.4 0.2 setosa 0 # 2 4.9 3.0 1.4 0.2 setosa 0 # 3 4.7 3.2 1.3 0.2 setosa 0 # 4 4.6 3.1 1.5 0.2 setosa 0 # 5 5.0 3.6 1.4 0.2 setosa 0 # 6 5.4 3.9 1.7 0. 4 setosa 0 |
setosa = 0 , versicolor = 1 , 아무것도 지정안한건 즉, 나머지를 말함 = 2
head(iris) 통해서 새로운 label 이라는 파생변수가 생겼고 변수도 지정되어있음을 확인 할 수 있다.
#3 data set 생성
idx <- sample(nrow(iris), 0.7 * nrow(iris)) train <- iris[idx, ] test <- iris[-idx, ] |
train에 70%, test에 30%
#4 matrix 객체 변환
# train set 생성
train_mat <- as.matrix(train[-c(5:6)]) # Species, label 컬럼 빼기 Species는 문자형, label 은 y변수 이용하여 설정 head(train_mat) # Sepal.Length Sepal.Width Petal.Length Petal.Width # 40 5.1 3.4 1.5 0.2 # 133 6.4 2.8 5.6 2.2 # 138 6.4 3.1 5.5 1.8 # 68 5.8 2.7 4.1 1.0 # 5 5.0 3.6 1.4 0.2 # 139 6.0 3.0 4.8 1.8 dim(train_mat) # [1] 105 4 train_lab <- train$label # label 은 y변수 이용하여 설정 train_lab # [1] 0 2 2 1 0 2 1 2 2 1 1 0 0 2 1 0 2 2 1 1 1 0 2 0 2 0 0 0 2 1 0 2 0 0 0 # [36] 1 2 1 2 1 0 1 2 2 2 0 2 2 0 1 2 0 1 0 1 0 0 0 2 0 2 1 2 0 0 2 0 1 2 2 # [71] 0 1 0 2 0 1 2 1 2 0 1 1 2 1 2 0 2 1 2 0 0 2 1 1 2 1 0 1 0 2 1 1 0 0 1 length(train_lab) # 105 |
label = 답
#5 xgb.DMatrix 객체 변환
dtrain <- xgb.DMatrix(data = train_mat, label = train_lab) dtrain # xgb.DMatrix dim: 105 x 4 info: label colnames: yes |
xgb.DMatrix()함수: 학습데이터 생성
#6 model생성 – xgboost matrix 객체 이용
xgb_model <- xgboost(data = dtrain, max_depth = 2, eta = 1, nthread = 2, nrounds = 2, objective = "multi:softmax", num_class = 3, verbose = 0) xgb_model # ##### xgb.Booster # raw: 8.8 Kb # call: # xgb.train(params = params, data = dtrain, nrounds = nrounds, # watchlist = watchlist, verbose = verbose, print_every_n = print_every_n, # early_stopping_rounds = early_stopping_rounds, maximize = maximize, # save_period = save_period, save_name = save_name, xgb_model = xgb_model, # callbacks = callbacks, max_depth = 2, eta = 1, nthread = 2, # objective = "multi:softmax", num_class = 3) # params (as set within xgb.train): # max_depth = "2", eta = "1", nthread = "2", objective = "multi:softmax", num_class = "3", validate_parameters = "TRUE" # xgb.attributes: # niter # callbacks: # cb.evaluation.log() # # of features: 4 # niter: 2 # nfeatures : 4 # evaluation_log: # iter train_mlogloss # 1 0.2800362 # 2 0.1373349 |
xgboost()함수: 트리모델 생성
- max_depth
말그대로 의사결정나무의 깊이의 한도
기본값 : 6 / 범위 : [0,∞] (커질수록 더 복잡한 모델이 생성되며 overfitting의 문제를 일으킬 수 있다)
최대 트리의 깊이. N이라고 가정하면 2^N개의 리프 노드가 생긴다. 10일 때 최대 1024개의 리프 노트가 생긴다.
일반적으로 Feature 수에 따라 3~6으로 세팅한 후 성능이 증가하고, 오버 피팅이 나지 않을 때까지 늘려간다.
제한된 리소스에 모델을 올려야 할 경우 울며 겨자 먹기로 약간의 성능을 포기하고 depth를 줄이기도 한다. - eta
'Step size shrinkage'로, 학습 단계별로 가중치를 얼마나 적용할지 결정하는 숫자이다. 가중치이므로 0~1사이의 값을 가지며, 낮을수록 more conservative-보수적인 모델 이 된다. - nthread
기본값 : 최대
학습에 사용할 thread수. - nrounds
iteration을 몇번 진행할지 - objective
어떤 목적을 가지고 학습을 진행할지 - num_class
복수의 클래스를 가진 분류모델을 짤 때 쓰는 값으로, 클래스가 몇개가 존재하는지 알려주는 값 - verbose
학습마다 평가값들에 대한 메세지를 출력할지
#7 test set 생성
test_mat <- as.matrix(test[-c(5:6)]) dim(test_mat) test_lab <- test$label length(test_lab) |
#8 model prediction
pred_iris <- predict(xgb_model, test_mat) pred_iris |
predict()함수
#9 confusion matrix
table(pred_iris, test_lab) # test_lab # pred_iris 0 1 2 # 0 13 0 0 # 1 0 18 1 # 2 0 0 13 |
예측과 테스트 답을 만들어서 10에서 성능평가
#10 모델 성능평가1 – Accuracy (분류정확도)
(13 + 18 + 13) / length(test_lab) # [1] 0.9777778 |
library(caret) str(test_lab) # num [1:45] 0 0 0 0 0 0 0 0 0 0 ... str(pred_iris) # num [1:45] 0 0 0 0 0 0 0 0 0 0 ... #factor 변환하기 test_lab <- as.factor(test_lab) pred_iris <- as.factor(pred_iris) str(test_lab) # Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 1 1 1 ... str(pred_iris) # Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 1 1 1 ... caret::confusionMatrix(test_lab, pred_iris)$overall[1] # Accuracy # 0.9777778 |
결과동일
#11 model의 중요 변수(feature)와 영향력 보기
importance_matrix <- xgb.importance(colnames(train_mat), model = xgb_model) importance_matrix # Feature Gain Cover Frequency # 1: Petal.Length 0.5592039 0.7625949 0.8181818 # 2: Petal.Width 0.4407961 0.2374051 0.1818182 |
#12 중요 변수 시각화
xgb.plot.importance(importance_matrix) ![]() |
막대그래프 높은것이 중요한것
'통계기반 데이터분석' 카테고리의 다른 글
[ R ] 연관분석 #2 시각화 (0) | 2022.12.04 |
---|---|
[ R ] 연관분석 #1 (0) | 2022.12.04 |
[ R ] 군집분석 #2 (0) | 2022.12.03 |
[ R ] 군집분석 #1 (0) | 2022.12.03 |
[ R ] 오분류표 (1) | 2022.12.03 |