0Pricing
R Academy · レッスン

特徴量の重要度とモデルの解釈

アンサンブルモデルから変数重要度と SHAP 値を抽出し、可視化します。

「特徴量の重要度とモデルの解釈」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

モデルの解釈が重要な理由

誰にも信頼されない正確なモデルは、実務では役に立ちません。モデルの解釈では、次の2つの疑問に答えます。全体として最も重要な特徴量はどれか(グローバルな重要度)と、なぜモデルはこの特定の予測をしたのか(ローカルな説明)です。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() — 3つの指標

xgb.importance(model)は、各特徴量について3つの重要度指標を含むデータフレームを返します。

  • 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は2つの重要度指標をサポートしています。'impurity'は高速で、学習中に計算されます。'permutation'はより低速ですが、各特徴量が予測に与える実際の影響を測定します。信頼性の高い順位付けには、一般に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のデフォルトである不純度ベースの重要度は、カテゴリー数の多い特徴量に偏ることがあります。Permutation重要度のほうが頑健です。XGBoostでは、3つの指標のうち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)値は、ゲーム理論に基づき、各予測を各特徴量の寄与に分解します。1つの観測値に対する予測では、SHAP値の合計がモデル出力とベースライン(平均予測値)の差になります。これにより、グローバルな説明とローカルな説明の両方が可能になります。

XGBoostは、predict(model, data, predcontrib = TRUE)によってtree 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')

ウォーターフォールプロット — ローカルな説明

ウォーターフォールプロットは、1つの予測を説明します。各特徴量によって予測値がベースラインより上または下にどのように動いたかを示します。正の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)は、他のすべての特徴量について平均を取った、1つの特徴量がモデル出力に与える周辺効果を示します。関係が線形か、単調か、非線形パターンを持つかを確認できます。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依存プロットは、1つの特徴量のSHAP値を、その実際の値に対してプロットします。PDPに似ていますが、正確なSHAP帰属値を使用し、2つ目の相互作用する特徴量によって点を色分けできます。これにより、交互作用の効果を明らかにできます。

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時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「特徴量の重要度とモデルの解釈」で何を学びますか?

アンサンブルモデルから変数重要度と SHAP 値を抽出し、可視化します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「特徴量の重要度とモデルの解釈」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 決定木:アンサンブルの基礎
  2. ranger によるランダムフォレスト
  3. xgboost による勾配ブースティング
  4. 特徴量の重要度とモデルの解釈
← R Academyに戻る