수식이 나오지 않는다면 새로고침(F5)을 해주세요
모바일은 수식이 나오지 않습니다.
📌 Variable importance measures.(요인 중요도)
단일 트리 모델의 경우 예측할 때 어떤 요인이 중요한지 쉽게 알 수 있습니다. 하지만, 여러 트리들을 묶어 사용하는 Bagging의 방법에서는 이러한 요인 중요도를 쉽게 얻을 수 없습니다. 예측 정확도가 높은 대신, 설명력이 떨어지는 것이죠.
설명력을 위해 어떤 변수가 중요한지 보는 방법을 2가지를 알아보고 후 포스팅에서 최근 유행하는 SHAP에 대해서 알아보려 합니다.
◼️ Mean Decrease Impurity(MDI)
회귀 트리의 경우, 주어진 예측 변수에 대한 분할로 인해 RSS(residual sum of squares)가 얼마나 감소되었는지를 모든 T개의 트리에 대해 평균화한 총량을 볼 수 있습니다.
쉽게 설명하면 어떠한 변수 $x_i$로 트리를 분할 하였을 때 오차가 얼마나 줄었는지를 모든 T개의 트리에 대해 확인하는 것입니다. 이렇게 하면 $T_1$ 트리에서 $x_i$의 점수, $T_2$ 트리에서의 $x_i$ 점수, 이런식으로 나아가 모든 트리에서의 $x_i$ 점수를 얻을 수 있습니다. 이 점수들을 평균을 내는 것입니다.
이 값이 크다는 것은 오차가 많이 줄었다는 의미이니 점수가 클수록 해당 예측 변수의 중요도가 높다는 것입니다.
이러한 방식으로 분류 트리에서는 주어진 예측 변수로 분할하였을 때 Gini 지수가 얼마나 감소하였는지를 모든 $T$개의 트리에 대해 더한 총량을 평균화 합니다.
- $t$ : 각 노드
- $s$ : 분할
- $N_t$ : 노드 $t$에서의 subjects 수
- $N_{t_L}, N_{t_R}$ : 노드 $t$에서 분할한 후의 왼쪽, 오른쪽 노드에서의 subjects 수
- $p_L$ : $\dfrac{N_{t_L}}{N_t}$ (분할 후 왼쪽 subjects수 / 분한 전 subjects 수)
- $p_R : \dfrac{N_{t_R}}{N_t}$ (분할 후 오른쪽 subjects수 / 분한 전 subjects 수)
라고 했을 때, 분할 $s$에서 노드 $t$의 불순도(Impurity)는 아래와 같습니다.
$$
\Delta i(s,t) = i(t) - p_L i(t_L) - p_R i(t_R)
$$
여기서 $i(t)$는 분류 오류, Gini 지수, 교차 엔트로피, 회귀의 경우 MSE와 같은 불순도 측정치 입니다.
만약 Gini 지수라고 본다면 $\Delta i(s,t)$는 분할 전 Gini 지수에서 분할 후의 Gini 지수들을 뺀 값이 되는 것입니다.
그럼 변수 $X_j$의 중요도를 구해봅시다. 모든 트리에서 $X_j$로 인해 줄은 불순도를 더한 다음 평균화 한다고 했습니다.
$$
Importance(X_j) = \frac1T \sum_T \sum_{t \in T, v(s_t) = X_j} p(t) \Delta i(s_t, t)
$$
여기서 $p(t)$는 노드 $t$에 도달하는 샘플의 비율 $N_t/N$을 나타내고, $v(s_t)=X_j$ 는 분할 $s_t$에서 사용되는 변수를 나타냅니다.
◼️ Mean Decreas Accuracy(MDA)
2 번째 방법입니다. OOB(Out-of-Bag) 데이터를 이용하고, permutation 방법을 이용합니다.
각 트리에 대해서 OOB 샘플(부트스트랩 resampling으로 선택되지 못한)의 예측 오류(분류 : accuracy 등, 회귀 : MSE)를 기록합니다.
이제 OOB 샘플의 $j$번째 변수의 feature$(x)$ 값을 무작위 순서로 섞습니다. 이제 이 순서를 바꾼 데이터로 또 다시 예측 오류를 계산합니다.
계산한 두가지 예측 오류의 차이를 계산합니다.
이 과정을 $T$개의 나무 개수만큼 시행하고, 각 변수에서 계산한 중요도의 평균을 계산합니다.
만약 해당 feature$(x)$가 중요하다면 무작위 순서로 섞은 데이터로 오류를 계산했을 때, 오류가 오히려 더 높아져 이들의 차는 더 커질 것입니다.
쉽게 설명하면 성능이 오히려 높아진다면 순서를 바꾼 feature는 별로 중요하지 않은 것이고, 낮아진다면 해당 feautre는 중요하다고 보는 것 입니다.
$$
VI_T(X_j) = \dfrac{1}{n_T^{OOB}}(\sum_i I(y_i = \hat{y}_{i,T})-\sum_i I(y_i = \hat{y}_{i,\pi,T}))
$$
위 식이 트리 $T$에서의 식 이들을 평균화한 아래 식이 최종 식입니다.
$$
VI(X_j) = \dfrac{1}{T}\sum_TVI_T(X_j)
$$
📌 With R
- 데이터 불러오기, 분할, 모델 피팅 (데이터는 iris 데이터)
# 라이브러리, seed 설정
library(ISLR)
set.seed(42)
library(randomForest)
# train, test = 7:3
n = dim(iris)[1]
train = sample(n, n*0.7)
b_train = iris[train,]
b_test = iris[-train,]
# model fitting with split..4
model = randomForest(Species~., data= b_train,
mtry = 4, importance= TRUE)
model
- 중요도 확인
importance(model)
- 중요도 plotting
varImpPlot(model)
자 이렇게 R 코드로 MDI와 MDA모두 확인 할 수 있습니다.
'🌞 Statistics for AI > Machine learning' 카테고리의 다른 글
2. Boosting : Gradient Boosting(왜 Gradient인가?) (1) | 2023.10.15 |
---|---|
1. Boosting : AdaBoost (1) | 2023.10.14 |
3. Bagging(배깅) : Random Forest은 뭐가 다를까? (0) | 2023.10.12 |
2. Bagging(배깅) : Out of bag error estimation (0) | 2023.10.12 |
1. Bagging(배깅) : 왜 여러 모델을 쓰는가? (0) | 2023.10.10 |