R Academy · Lektion

Feature-vigtighed og model-fortolkning

Udtræk og visualisér variabelvigtighed og SHAP-værdier fra ensemblemodeller.

Lektion 4 af 413 trin

Feature-vigtighed og model-fortolkning er en gratis R Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.

Hvorfor modelinterpretation er vigtig

Præcise modeller, som ingen har tillid til, er i praksis ubrugelige. Modelinterpretation besvarer to spørgsmål: Hvilke funktioner er vigtigst på tværs af data? (global vigtighed) og Hvorfor lavede modellen netop denne forudsigelse? (lokal forklaring). Både XGBoost og ranger har indbyggede værktøjer til global vigtighed, mens SHAP-værdier muliggør lokale forklaringer.

# 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() — Tre mål

xgb.importance(model) returnerer en dataramme med tre mål for vigtighed for hver funktion:

  • Gain: gennemsnitlig forbedring af tabet fra opdelinger baseret på denne funktion (mest informativt).
  • Cover: gennemsnitligt antal observationer, der påvirkes af opdelinger baseret på denne funktion.
  • Frequency: andelen af opdelinger, hvor denne funktion blev brugt.
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) opretter et vandret søjlediagram over funktionernes vigtighed. Som standard bruger den målet Gain. Argumentet top_n begrænser outputtet til de vigtigste funktioner, så diagrammet bliver overskueligt.

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)'
)

Variabelfunktionens vigtighed i ranger

ranger understøtter to mål for vigtighed: 'impurity' (hurtigt, beregnes under træningen) og 'permutation' (langsommere, men måler den faktiske påvirkning, som hver funktion har på forudsigelserne). Permutationsbaseret vigtighed foretrækkes generelt til pålidelige rangordninger.

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))

Sammenligning af vigtighed i ranger og XGBoost

Forskellige modeller tildeler forskellige vigtighedsscorer, fordi de måler forskellige ting. Impuritetsbaseret vigtighed (standard i ranger) kan være skæv til fordel for funktioner med mange forskellige værdier. Permutationsbaseret vigtighed er mere robust. XGBoosts Gain er normalt det mest informative af de tre mål.

# 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')

Hvad er SHAP-værdier?

SHAP (SHapley Additive exPlanations)-værdier opdeler hver forudsigelse i bidrag fra de enkelte funktioner med et teoretisk grundlag i spilteori. For en forudsigelse af én observation er summen af SHAP-værdierne lig med forskellen mellem modellens output og baselineværdien (den gennemsnitlige forudsigelse). Det muliggør både globale og lokale forklaringer.

XGBoost understøtter tree SHAP direkte via predict(model, data, predcontrib = TRUE).

# 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)

Grundlæggende om pakken shapviz

Pakken shapviz leverer et omfattende visualiseringslag oven på SHAP-værdier. Send den rå SHAP-matrix og funktionsmatricen til shapviz(), og brug derefter plotfunktioner som sv_importance(), sv_waterfall() og 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')

Vandfaldsdiagram — Lokal forklaring

Et vandfaldsdiagram forklarer en enkelt forudsigelse: Det viser, hvordan hver funktion skubbede forudsigelsen over eller under baselineværdien. Positive SHAP-værdier (røde søjler) øger forudsigelsen, mens negative værdier (blå søjler) sænker den. Baselineværdien er modellens gennemsnitlige output.

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'
  )

Diagrammer for delvis afhængighed

Et diagram for delvis afhængighed (PDP) viser den marginale effekt af én funktion på modellens output, beregnet som gennemsnit over alle andre funktioner. Det viser, om sammenhængen er lineær, monoton eller har ikke-lineære mønstre. Brug pakken pdp eller 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-afhængighedsdiagram

Et SHAP-afhængighedsdiagram viser SHAP-værdien for én funktion plottet mod dens faktiske værdi. Det minder om et PDP, men bruger præcise SHAP-attributioner og kan farvelægge punkter efter en anden interagerende funktion, så interaktionseffekter bliver synlige.

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
)

Pakken vip — Samlet vigtighed

Pakken vip leverer en modeluafhængig grænseflade til vigtighed, som fungerer med ranger, XGBoost og alle parsnip-modeller. vip(model) opretter et søjlediagram, mens vi(model) returnerer vigtighedsværdierne som en 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)

Hurtig kontrol

Hvilket mål anses generelt for at være mest informativt til at forstå kvaliteten af funktioner i XGBoosts funktionsvigtighed?

Opsummering af interpretation

Vigtigste pointer fra funktionsvigtighed og modelinterpretation:

  • xgb.importance(model) returnerer Gain, Cover og Frequency; Gain er mest informativt.
  • xgb.plot.importance(imp) opretter et søjlediagram over XGBoosts vigtighed.
  • ranger understøtter vigtighedsmålene 'impurity' (hurtigt) og 'permutation' (pålideligt).
  • SHAP-værdier opdeler hver forudsigelse i bidrag fra de enkelte funktioner.
  • shapviz leverer vandfaldsdiagrammer, beeswarm-diagrammer og afhængighedsdiagrammer for SHAP.
  • Diagrammer for delvis afhængighed viser den gennemsnitlige marginale effekt af hver funktion.
  • Pakken vip leverer en samlet, modeluafhængig grænseflade til vigtighed.
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')
Gratis at komme i gang

Lær R med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
43
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Feature-vigtighed og model-fortolkning” gratis?

Ja — alle 3 lektioner i læringssporet R Academy, inklusive “Feature-vigtighed og model-fortolkning”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Feature-vigtighed og model-fortolkning”?

Udtræk og visualisér variabelvigtighed og SHAP-værdier fra ensemblemodeller. Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på R Academy?

Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Feature-vigtighed og model-fortolkning”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne R Academy-lektion?

Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Beslutningstræer: Grundlaget for ensembles
  2. Random forests med ranger
  3. Gradient boosting med xgboost
  4. Feature-vigtighed og model-fortolkning
← Tilbage til R Academy