R Academy · Lektion

Feature-vikt och modelltolkning

Extrahera och visualisera variabelvikt och SHAP-värden från ensemblemodeller.

Lektion 4 av 413 steg

Feature-vikt och modelltolkning är en gratis lektion i R Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för R Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i R Academy innehåller totalt 4 lektioner.

Varför modelltolkning är viktig

Korrekta modeller som ingen litar på är i praktiken oanvändbara. Modelltolkning besvarar två frågor: Vilka funktioner är viktigast globalt? (global viktighet) och Varför gjorde modellen just den här förutsägelsen? (lokal förklaring). Både XGBoost och ranger har inbyggda verktyg för global viktighet, medan SHAP-värden möjliggör lokala förklaringar.

# 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ått

xgb.importance(model) returnerar en data frame med tre viktighetsmått för varje funktion:

  • Gain: genomsnittlig förbättring av förlusten från uppdelningar baserade på denna funktion (mest informativt).
  • Cover: genomsnittligt antal observationer som påverkas av uppdelningar baserade på denna funktion.
  • Frequency: andelen uppdelningar där denna funktion användes.
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) skapar ett horisontellt stapeldiagram över funktionernas viktighet. Som standard används måttet Gain. Argumentet top_n begränsar resultatet till de viktigaste funktionerna för att göra diagrammet tydligare.

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

Variabelviktighet i ranger

ranger stöder två viktighetsmått: 'impurity' (snabbt, beräknas under träningen) och 'permutation' (långsammare, men mäter den faktiska påverkan som varje funktion har på förutsägelserna). Permutationsviktighet föredras generellt för tillförlitliga rangordningar.

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

Jämförelse av viktighet i ranger och XGBoost

Olika modeller tilldelar olika viktighetspoäng eftersom de mäter olika saker. Impuritetsbaserad viktighet (standard i ranger) kan vara snedvriden till förmån för funktioner med många unika värden. Permutationsviktighet är mer robust. Gain i XGBoost är vanligtvis det mest informativa av dess tre mått.

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

Vad är SHAP-värden?

SHAP (SHapley Additive exPlanations)-värden delar upp varje förutsägelse i bidrag från varje funktion, med grund i spelteori. För en förutsägelse för en observation summerar SHAP-värdena till skillnaden mellan modellens utdata och baslinjen (den genomsnittliga förutsägelsen). Detta möjliggör både globala och lokala förklaringar.

XGBoost har inbyggt stöd för tree SHAP 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)

Grunderna i paketet shapviz

Paketet shapviz tillhandahåller ett omfattande visualiseringslager ovanpå SHAP-värden. Skicka den råa SHAP-matrisen och funktionsmatrisen till shapviz(), och använd sedan diagramfunktioner som sv_importance(), sv_waterfall() och 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')

Vattenfallsdiagram — lokal förklaring

Ett vattenfallsdiagram förklarar en enskild förutsägelse: det visar hur varje funktion drev förutsägelsen över eller under baslinjen. Positiva SHAP-värden (röda staplar) ökar förutsägelsen, medan negativa värden (blå staplar) minskar den. Baslinjen är modellens genomsnittliga utdata.

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

Partiella beroendediagram

Ett partiellt beroendediagram (PDP) visar den marginella effekten av en funktion på modellens utdata, beräknad som ett genomsnitt över alla andra funktioner. Det visar om sambandet är linjärt, monotont eller innehåller icke-linjära mönster. Använd paketet 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-beroendediagram

Ett SHAP-beroendediagram visar SHAP-värdet för en funktion plottat mot dess faktiska värde. Det liknar ett PDP men använder exakta SHAP-attributeringar och kan färglägga punkterna efter en andra interagerande funktion, vilket synliggör interaktionseffekter.

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
)

Paketet vip — enhetlig viktighet

Paketet vip tillhandahåller ett modellagnostiskt gränssnitt för viktighet som fungerar med ranger, XGBoost och alla parsnip-modeller. vip(model) skapar ett stapeldiagram, medan vi(model) returnerar viktighetsvärdena 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)

Snabb kontroll

Vilket mått anses generellt vara mest informativt för att förstå funktionernas kvalitet i XGBoosts funktionsviktighet?

Sammanfattning av modelltolkning

Viktiga slutsatser från funktionsviktighet och modelltolkning:

  • xgb.importance(model) returnerar Gain, Cover och Frequency; Gain är mest informativt.
  • xgb.plot.importance(imp) skapar ett stapeldiagram över XGBoosts viktighet.
  • ranger stöder viktighet med 'impurity' (snabb) och 'permutation' (tillförlitlig).
  • SHAP-värden delar upp varje förutsägelse i bidrag från de enskilda funktionerna.
  • shapviz tillhandahåller vattenfallsdiagram, beeswarm-diagram och beroendediagram för SHAP.
  • Partiella beroendediagram visar den genomsnittliga marginella effekten av varje funktion.
  • Paketet vip tillhandahåller ett enhetligt, modellagnostiskt gränssnitt för viktighet.
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 att börja

Lär dig R med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
43
Lektioner
159

Vanliga frågor

Är lektionen ”Feature-vikt och modelltolkning” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen R Academy, inklusive ”Feature-vikt och modelltolkning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i R Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Feature-vikt och modelltolkning”?

Extrahera och visualisera variabelvikt och SHAP-värden från ensemblemodeller. Ni övar på R Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig R Academy?

Du behöver inga förkunskaper. Utbildningen i R Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Feature-vikt och modelltolkning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här R Academy-lektionen?

Ja. Varje R Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Beslutsträd: grunden för ensembler
  2. Random forests med ranger
  3. Gradient boosting med xgboost
  4. Feature-vikt och modelltolkning
← Tillbaka till R Academy