59doit

[ R ] xgboost 본문

통계기반 데이터분석

[ R ] xgboost

yul_S2 2022. 12. 5. 10:48
반응형

 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
Comments