0Pricing
R Academy · 강의

특성 중요도와 모델 해석

앙상블 모델에서 변수 중요도와 SHAP 값을 추출하고 시각화합니다.

특성 중요도와 모델 해석은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

모델 해석이 중요한 이유

아무도 신뢰하지 않는 정확한 모델은 실제로는 쓸모가 없습니다. 모델 해석은 두 가지 질문에 답합니다. 전체적으로 어떤 특성이 가장 중요한가요?(전역 중요도) 그리고 모델은 왜 이 특정 예측을 내놓았나요?(지역 설명) XGBoost와 ranger는 모두 전역 중요도를 위한 기본 제공 도구를 제공하며, SHAP 값은 지역 설명을 가능하게 합니다.

# The interpretation toolkit we will use:
# - xgb.importance()      XGBoost global importance
# - xgb.plot.importance() Visualise XGBoost importance
# - ranger importance     Random forest importance
# - shapviz package       SHAP value computation + plots

cat('Packages needed: xgboost, ranger, shapviz')

xgb.importance() — 세 가지 지표

xgb.importance(model)은 각 특성에 대해 세 가지 중요도 지표를 포함하는 데이터 프레임을 반환합니다.

  • Gain: 이 특성으로 분할했을 때 손실이 평균적으로 개선된 정도입니다(정보성이 가장 높음).
  • Cover: 이 특성으로 분할했을 때 영향을 받는 관측값 수의 평균입니다.
  • Frequency: 이 특성을 사용한 분할의 비율입니다.
library(xgboost)
library(MASS)

X <- as.matrix(Boston[, -14])
y <- Boston[, 14]
dtrain <- xgb.DMatrix(data = X, label = y)

params <- list(objective = 'reg:squarederror', eta = 0.1,
               max_depth = 5, subsample = 0.8)
model  <- xgboost(data = dtrain, params = params,
                  nrounds = 100, verbose = 0)

imp <- xgb.importance(model = model, feature_names = colnames(X))
print(head(imp))

xgb.plot.importance()

xgb.plot.importance(importance_matrix)는 특성 중요도를 가로 막대 차트로 만듭니다. 기본적으로 Gain 지표를 사용합니다. top_n 인수는 명확하게 표시할 수 있도록 가장 중요한 특성만 출력하도록 제한합니다.

imp <- xgb.importance(model = model, feature_names = colnames(X))

# Plot top 10 features by Gain
xgb.plot.importance(
  importance_matrix = imp,
  top_n  = 10,
  measure = 'Gain',
  main   = 'XGBoost Feature Importance (Gain)'
)

ranger 변수 중요도

ranger는 두 가지 중요도 측정 방법을 지원합니다. 'impurity'는 빠르며 학습 중에 계산되고, 'permutation'은 더 느리지만 각 특성이 예측에 미치는 실제 영향을 측정합니다. 신뢰할 수 있는 순위를 얻으려면 일반적으로 순열 중요도를 선호합니다.

library(ranger)

# Impurity importance (fast)
rf_imp <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'impurity'
)
imp_impurity <- rf_imp$variable.importance

# Permutation importance (more reliable, slower)
rf_perm <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'permutation'
)
imp_permutation <- rf_perm$variable.importance

cbind(impurity = sort(imp_impurity, dec=TRUE),
      permutation = sort(imp_permutation, dec=TRUE))

ranger와 XGBoost 중요도 비교

서로 다른 모델은 서로 다른 대상을 측정하므로 중요도 점수도 다르게 부여합니다. 불순도 기반 중요도(ranger의 기본값)는 고유값이 많은 특성에 편향될 수 있습니다. 순열 중요도가 더 견고합니다. XGBoost의 세 가지 지표 중에서는 일반적으로 Gain이 가장 정보성이 높습니다.

# Align rankings for comparison
xgb_rank <- imp$Feature
rf_rank  <- names(sort(rf_perm$variable.importance, dec=TRUE))

# Spearman rank correlation between the two rankings
shared <- intersect(xgb_rank, rf_rank)
xgb_pos <- match(shared, xgb_rank)
rf_pos  <- match(shared, rf_rank)

cor(xgb_pos, rf_pos, method = 'spearman')

SHAP 값이란 무엇인가요?

SHAP(SHapley Additive exPlanations) 값은 게임 이론에 기반하여 각 예측을 각 특성의 기여도로 분해합니다. 한 관측값에 대한 예측에서 SHAP 값의 합은 모델 출력과 기준값(평균 예측)의 차이와 같습니다. 이를 통해 전역 설명과 지역 설명을 모두 얻을 수 있습니다.

XGBoost는 predict(model, data, predcontrib = TRUE)를 통해 트리 SHAP을 기본적으로 지원합니다.

# Compute SHAP values natively from XGBoost
shap_matrix <- predict(
  model,
  newdata     = dtrain,
  predcontrib = TRUE  # returns SHAP contributions
)

# Result: matrix with one column per feature + BIAS column
dim(shap_matrix)  # rows x (features + 1)
colnames(shap_matrix)

shapviz 패키지 기초

shapviz 패키지는 SHAP 값 위에 풍부한 시각화 기능을 제공합니다. 원시 SHAP 행렬과 특성 행렬을 shapviz()에 전달한 다음 sv_importance(), sv_waterfall(), sv_beeswarm()과 같은 플로팅 함수를 사용합니다.

library(shapviz)

# Build shapviz object from XGBoost model
shp <- shapviz(model, X_pred = X)

# Global importance: mean |SHAP| per feature
sv_importance(shp, kind = 'bar')

# Beeswarm plot (SHAP summary plot)
sv_importance(shp, kind = 'beeswarm')

워터폴 플롯 — 지역 설명

워터폴 플롯은 하나의 예측을 설명합니다. 각 특성이 예측을 기준값보다 높이거나 낮추는 과정을 보여 줍니다. 양의 SHAP 값(빨간색 막대)은 예측을 높이고, 음의 값(파란색 막대)은 예측을 낮춥니다. 기준값은 모델 출력의 평균입니다.

library(shapviz)

shp <- shapviz(model, X_pred = X)

# Explain the prediction for observation 1
sv_waterfall(shp, row_id = 1) +
  ggplot2::labs(
    title = 'SHAP Waterfall — Observation 1',
    subtitle = 'How each feature contributed to this prediction'
  )

부분 의존성 플롯

부분 의존성 플롯(PDP)은 다른 모든 특성에 대해 평균을 낸 한 특성의 모델 출력에 대한 주변 효과를 보여 줍니다. 이를 통해 관계가 선형인지, 단조적인지, 또는 비선형 패턴을 가지는지 확인할 수 있습니다. pdp 패키지 또는 SHAPforxgboost::pdp_shap()을 사용합니다.

library(pdp)

# Partial dependence for 'lstat' in the Boston housing model
# We need a predict function wrapper for ranger
rf <- ranger(medv ~ ., data = MASS::Boston, num.trees = 300)

pd <- partial(
  rf,
  pred.var = 'lstat',
  train    = MASS::Boston,
  type     = 'regression'
)

plot(pd, type = 'l', lwd = 2,
     xlab = 'lstat', ylab = 'Partial Dependence',
     main = 'PDP: lstat vs medv')

SHAP 의존성 플롯

SHAP 의존성 플롯은 한 특성의 실제 값에 따른 SHAP 값을 표시합니다. PDP와 비슷하지만 정확한 SHAP 기여도를 사용하며, 상호작용하는 두 번째 특성에 따라 점에 색을 지정할 수 있어 상호작용 효과를 보여 줍니다.

library(shapviz)

shp <- shapviz(model, X_pred = X)

# SHAP dependence plot for 'lstat', coloured by 'rm'
sv_dependence(
  shp,
  v       = 'lstat',   # main feature on x-axis
  color_var = 'rm'     # interaction feature for colour
)

vip 패키지 — 통합 중요도

vip 패키지는 ranger, XGBoost 및 모든 parsnip 모델에서 작동하는 모델 독립적 중요도 인터페이스를 제공합니다. vip(model)은 막대 차트를 만들고, vi(model)은 중요도 값을 tibble로 반환합니다.

library(vip)

# Works with parsnip fitted models
lm_fit <- fit(
  linear_reg() |> set_engine('lm'),
  medv ~ ., data = MASS::Boston
)

vip(lm_fit, num_features = 10)

# Also works with ranger directly
vip(rf_imp, num_features = 10)

# Return importance as a data frame
vi(rf_imp)

빠른 확인

XGBoost 특성 중요도에서 특성의 품질을 이해하는 데 일반적으로 가장 정보성이 높다고 여겨지는 지표는 무엇인가요?

해석 요약

특성 중요도와 모델 해석의 핵심 요점:

  • xgb.importance(model)은 Gain, Cover, Frequency를 반환하며, Gain이 가장 정보성이 높습니다.
  • xgb.plot.importance(imp)은 XGBoost 중요도를 막대 차트로 만듭니다.
  • ranger는 'impurity'(빠름)와 'permutation'(신뢰할 수 있음) 중요도를 지원합니다.
  • SHAP 값은 각 예측을 특성별 기여도로 분해합니다.
  • shapviz는 SHAP을 위한 워터폴, 비스웜, 의존성 플롯을 제공합니다.
  • 부분 의존성 플롯은 각 특성의 평균 주변 효과를 보여 줍니다.
  • vip 패키지는 모델 독립적인 통합 중요도 인터페이스를 제공합니다.
library(shapviz)

# Complete interpretation workflow
shp <- shapviz(xgb_model, X_pred = X_matrix)

# 1. Global importance
sv_importance(shp, kind = 'beeswarm')

# 2. Local explanation for one observation
sv_waterfall(shp, row_id = 42)

# 3. Feature relationship
sv_dependence(shp, v = 'most_important_feature')

자주 묻는 질문

“특성 중요도와 모델 해석” 강의는 무료인가요?

네 — “특성 중요도와 모델 해석” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“특성 중요도와 모델 해석”에서 뭘 배우나요?

앙상블 모델에서 변수 중요도와 SHAP 값을 추출하고 시각화합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“특성 중요도와 모델 해석” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 의사결정나무: 앙상블의 기초
  2. ranger로 랜덤 포레스트 만들기
  3. xgboost를 활용한 그래디언트 부스팅
  4. 특성 중요도와 모델 해석
← R Academy(으)로 돌아가기