Feature-vikt och modelltolkning
Extrahera och visualisera variabelvikt och SHAP-värden från ensemblemodeller.
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.
shapviztillhandahåller vattenfallsdiagram, beeswarm-diagram och beroendediagram för SHAP.- Partiella beroendediagram visar den genomsnittliga marginella effekten av varje funktion.
- Paketet
viptillhandahå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')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
- Beslutsträd: grunden för ensembler
- Random forests med ranger
- Gradient boosting med xgboost
- Feature-vikt och modelltolkning