0Pricing
R Academy · Lección

Importancia de las características e interpretación de modelos

Extraiga y visualice la importancia de las variables y los valores SHAP de modelos de ensamblaje.

Importancia de las características e interpretación de modelos es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Por qué es importante interpretar los modelos

Los modelos precisos en los que nadie confía son inútiles en la práctica. La interpretación de modelos responde a dos preguntas: ¿Qué características son más importantes a nivel global? (importancia global) y ¿Por qué el modelo realizó esta predicción específica? (explicación local). Tanto XGBoost como ranger proporcionan herramientas integradas para calcular la importancia global, mientras que los valores SHAP permiten obtener explicaciones locales.

# 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() — Tres métricas

xgb.importance(model) devuelve un data frame con tres métricas de importancia para cada característica:

  • Gain: mejora promedio de la pérdida debida a las divisiones realizadas con esta característica (la métrica más informativa).
  • Cover: número promedio de observaciones afectadas por las divisiones realizadas con esta característica.
  • Frequency: proporción de divisiones en las que se utilizó esta característica.
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) crea un gráfico de barras horizontales de la importancia de las características. De forma predeterminada, utiliza la métrica Gain. El argumento top_n limita la salida a las características más importantes para facilitar la interpretació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)'
)

Importancia de variables en ranger

ranger admite dos medidas de importancia: 'impurity' (rápida y calculada durante el entrenamiento) y 'permutation' (más lenta, pero mide el impacto real de cada característica en las predicciones). En general, se prefiere la importancia por permutación para obtener clasificaciones fiables.

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

Comparación de la importancia en ranger y XGBoost

Los distintos modelos asignan puntuaciones de importancia diferentes porque miden aspectos distintos. La importancia basada en la impureza (la opción predeterminada de ranger) puede estar sesgada hacia las características con muchos valores distintos. La importancia por permutación es más robusta. Gain de XGBoost suele ser la métrica más informativa de sus tres métricas.

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

¿Qué son los valores SHAP?

Los valores SHAP (SHapley Additive exPlanations) descomponen cada predicción en contribuciones de cada característica, basándose en la teoría de juegos. Para una predicción sobre una observación, los valores SHAP suman la diferencia entre la salida del modelo y la línea base (la predicción promedio). Esto permite obtener explicaciones tanto globales como locales.

XGBoost admite de forma nativa tree SHAP mediante 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)

Conceptos básicos del paquete shapviz

El paquete shapviz proporciona una completa capa de visualización sobre los valores SHAP. Pase la matriz SHAP sin procesar y la matriz de características a shapviz() y, a continuación, utilice funciones de trazado como sv_importance(), sv_waterfall() y 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')

Gráfico de cascada — Explicación local

Un gráfico de cascada explica una predicción individual: muestra cómo cada característica desplazó la predicción por encima o por debajo de la línea base. Los valores SHAP positivos (barras rojas) aumentan la predicción; los valores negativos (barras azules) la reducen. La línea base es la salida promedio del modelo.

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

Gráficos de dependencia parcial

Un gráfico de dependencia parcial (PDP) muestra el efecto marginal de una característica sobre la salida del modelo, promediado respecto a todas las demás características. Permite ver si la relación es lineal, monótona o presenta patrones no lineales. Utilice el paquete pdp o 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')

Gráfico de dependencia SHAP

Un gráfico de dependencia SHAP muestra el valor SHAP de una característica en función de su valor real. Es similar a un PDP, pero utiliza atribuciones SHAP exactas y puede colorear los puntos según una segunda característica que interactúa con ella, lo que permite revelar efectos de interacción.

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
)

Paquete vip — Importancia unificada

El paquete vip proporciona una interfaz de importancia independiente del modelo que funciona con ranger, XGBoost y cualquier modelo de parsnip. vip(model) crea un gráfico de barras; vi(model) devuelve los valores de importancia como un 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)

Comprobación rápida

En la importancia de características de XGBoost, ¿qué métrica se considera generalmente la más informativa para comprender la calidad de las características?

Resumen de la interpretación

Ideas clave sobre la importancia de las características y la interpretación de modelos:

  • xgb.importance(model) devuelve Gain, Cover y Frequency; Gain es la métrica más informativa.
  • xgb.plot.importance(imp) crea un gráfico de barras de la importancia en XGBoost.
  • ranger admite la importancia 'impurity' (rápida) y 'permutation' (fiable).
  • Los valores SHAP descomponen cada predicción en contribuciones de cada característica.
  • shapviz proporciona gráficos de cascada, beeswarm y dependencia para SHAP.
  • Los gráficos de dependencia parcial muestran el efecto marginal promedio de cada característica.
  • El paquete vip proporciona una interfaz de importancia unificada e independiente del modelo.
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')

Preguntas frecuentes

¿La lección «Importancia de las características e interpretación de modelos» es gratis?

Sí — el texto completo de «Importancia de las características e interpretación de modelos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Importancia de las características e interpretación de modelos»?

Extraiga y visualice la importancia de las variables y los valores SHAP de modelos de ensamblaje. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Importancia de las características e interpretación de modelos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Árboles de decisión: base de los ensamblajes
  2. Bosques aleatorios con ranger
  3. Gradient boosting con xgboost
  4. Importancia de las características e interpretación de modelos
← Volver a R Academy