特徴量の重要度とモデルの解釈
アンサンブルモデルから変数重要度と 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 決定木:アンサンブルの基礎
- ranger によるランダムフォレスト
- xgboost による勾配ブースティング
- 特徴量の重要度とモデルの解釈