수식이 나오지 않는다면 새로고침(F5)을 해주세요
모바일은 수식이 나오지 않습니다.
📌 Gradient Boosting
Gradient Boosting은 Gradient descent와 boosting을 합친 것으로, 경사하강법과 부스팅 기법을 사용합니다.
경사하강법에서 loss인 $L(\theta)$를 최소화하기 위해 아래와 같은 방법으로 $\theta$를 업데이트 합니다.
$$
\theta^{s+1} = \theta^s - \rho \dfrac{\partial}{\partial \theta} L(\theta) \big\lvert_{\theta^s}
$$
이 업데이트는 gradient인 $\nabla L(\theta^{s})$에 기반을 둡니다.
직관적이고 쉽게 봅시다.
📌 Why Gradient?
손실 함수(loss function)을 아래처럼 MSE(mean squre error)라고 해봅시다.
$$
L(y_i, f(x_i)) = \frac12(y_i - f(x_i))^2
$$
우선 residual인 오차는 당연히 아래와 같을 겁니다.(실제값 - 예측값)
$$
residual = y_i -f(x_i)
$$
이번엔 손실함수의 gradient를 보겠습니다.
$$
\begin{align}
\nabla L(y_i, f(x_i)) &= \frac{\partial}{\partial f(x_i)}\left[\frac{1}{2}(y_i - f(x_i))^2\right]
\\ &= -1 \cdot (y_i - f(x_i))
\\ &= f(x_i) - y_i
\end{align}
$$
보시면 음의 gradient가 residual과 같음을 볼수 있죠?
앞서 살펴보았던 Adaboost의 경우 잔차라 볼 수 있는 예측에 실패한 값에 가중치를 주어 다음 모델에서 그 데이터를 가지고 학습했다면,
Gradient boosting에서는 잔차 = negative gradient를 가지고 학습합니다.
한번 Friedman's gradient boost algorithm과 함께 봅시다.
📌 Friedman's gradient boost algorithm
이 알고리즘은 Greedy function approximation: A gradient boosting machine.(Jerome H. Friedman . 2011)에 개제된 알고리즘입니다.
1. 첫 모델을 아래와 같이 손실함수를 최소로 하는 상수 $\mu$로 둡니다.
$$
\hat{f}(\textbf{x}) = \arg\min_{\mu} \sum_{i=1}^N L(y_i,\mu)
$$
2. working response로 음의 그레디언트를 계산
$$
z_i = -\dfrac{\theta}{\theta f(\textbf{x}_i)} L(y_i, f(\textbf{x}_i)) \big\lvert{f(\textbf{x}_i)=\hat{f}(\textbf{x}_i)}
$$
3. 이 음의 그레디언트 $z_i$를 output으로 하고 $\textbf{x}_i$를 input으로 하는 모델 $g(\textbf{x})$을 fitting 합니다.
4. 아래의 식을 최소화 하는 경사하강법 단계 $\rho$를 찾습니다.
$$
\rho = \arg \min_{\rho} \sum^N_{i=1} L(y_i,\hat{f}(\textbf{x}_i) + \rho g(\textbf{x}_i))
$$
5. 이를 이용하여 다음 $\hat{f}(\textbf{x})$를 업데이트 합니다.
$$
\hat{f}(\textbf{x}) \leftarrow \hat{f}(\textbf{x}) + \rho g(\textbf{x})
$$
6. 2~5 단계를 반복합니다.
📌 With R
- 라이브러리, 데이터 불러오고 train, test set 나누기
# 라이브러리 불러오기
# 데이터 : iris data
library(gbm)
set.seed(42)
# train : test = 7:3
n = dim(iris)[1]
train = sample(n, n*0.7)
itrain = iris[train,]
itest = iris[-train,]
- 10 fold-cv 준비하기
# 10-cv
library(caret)
mycontrol = trainControl(method='cv', number=10,
savePredictions = 'final',
classProbs=T)
- Grid search를 위한 파라미터 준비(나무개수 200 or 500, 나무깊이 3 or 5, 학습률 0.01 or 0.1..)
# hyperparameters grid.
params = expand.grid(.n.trees = c(200,500),
.interaction.depth=c(3,5),
.shrinkage=c(0.01,0.1),
.n.minobsinnode=2)
- fitting
# fitting
model = train(Species~., data=itrain, method='gbm',
trControl=mycontrol,
tuneGrid= params)
- 결과 확인
model
정확도는 맨처음인 학습률 0,01, 깊이 3, 나무개수 200일때가 가장 좋네요.
- test set로 확인
# pred
pred = predict(model, itest)
confusionMatrix(pred, itest$Species)
'🌞 Statistics for AI > Machine learning' 카테고리의 다른 글
XGBoost에 대해(원리와 공식) (1) | 2023.10.15 |
---|---|
XGBoost: A Scalable Tree Boosting System(Carlos & Tianqi. 2016) 리뷰 (1) | 2023.10.15 |
1. Boosting : AdaBoost (1) | 2023.10.14 |
변수 중요도 : Mean Decrease Impurity, Mean Decrease Accuracy (1) | 2023.10.13 |
3. Bagging(배깅) : Random Forest은 뭐가 다를까? (0) | 2023.10.12 |