Valorile Shapley constituie o modalitate larg adoptată de a atribui contribuția fiecărei caracteristici (variabilă explicativă) la predicția unui model. Folosit în cea mai mare parte în învățarea supravegheată, această postare ilustrează un exemplu de utilizare a acestora pentru a explica previziunile serii de timp, cu valori Shapley exacte și pe baza ahead::dynrmf model cu regresori externi.
Codul de mai jos folosește ahead pachet pentru a calcula valorile exacte Shapley pentru o prognoză în serie de timp. Acesta folosește ahead::dynrmf_shap pentru a calcula valorile Shapley și ahead::plot_dynrmf_shap_waterfall funcția de a le reprezenta grafic.
Mai întâi, instalați pachetul:
devtools::install_github("Techtonique/ahead")
Apoi, rulați următorul cod (aplică valorile Shapley la dynrmf model, pentru diferite scenarii). Eu folosesc uschange set de date (modificări trimestriale ale variabilelor macroeconomice din SUA) din fpp2 pachet. Variabila seriei temporale țintă este Consumption; regresorii sunt Income, Savingsși Unemployment (la scară).
library(fpp2); library(ahead); library(e1071); library(misc)
library(ggplot2); library(patchwork)
y <- fpp2::uschange(, "Consumption")
xreg <- scale(fpp2::uschange(, c("Income", "Savings", "Unemployment")))
split <- misc::splitts(y, split_prob = 0.9)
xreg_train <- window(xreg, start = start(split$training), end = end(split$training))
xreg_test <- window(xreg, start = start(split$testing), end = end(split$testing))
shap <- ahead::dynrmf_shap(
y = split$training,
xreg_fit = xreg_train,
xreg_predict = xreg_test,
fit_func = e1071::svm
)
p1 <- ahead::plot_dynrmf_shap_waterfall(shap, title = "Baseline scenario")
xreg_pess <- xreg_test
xreg_pess(,"Income") <- -1;
xreg_pess(,"Savings") <- -0.5
shap_pess <- dynrmf_shap(
y = split$training,
xreg_fit = xreg_train,
xreg_predict = xreg_pess,
fit_func = e1071::svm
)
p2 <- ahead::plot_dynrmf_shap_waterfall(shap_pess, title = "Pessimistic scenario")
xreg_opt <- xreg_test
xreg_opt(,"Income") <- 2;
xreg_opt(,"Savings") <- 0.5
shap_opt <- dynrmf_shap(
y = split$training,
xreg_fit = xreg_train,
xreg_predict = xreg_opt,
fit_func = e1071::svm
)
p3 <- ahead::plot_dynrmf_shap_waterfall(shap_opt, title = "Optimistic scenario")
xreg_ovr <- xreg_test
xreg_ovr(,"Income") <- 2.5;
xreg_ovr(,"Savings") <- 0.75
shap_ovr <- ahead::dynrmf_shap(
y = split$training,
xreg_fit = xreg_train,
xreg_predict = xreg_ovr,
fit_func = e1071::svm
)
p4 <- plot_dynrmf_shap_waterfall(shap_ovr, title = "Overly optimistic scenario")
(p1 + p2)/(p3 + p4)

O verificare, care este întotdeauna o practică bună atunci când se utilizează valorile Shapley, este de a vedea dacă suma valorilor Shapley este egală cu diferența dintre predicție și prognoza de bază (prognoza modelului când fiecare regresor este înlocuit cu media coloanei setului de antrenament). Este cazul în parcelele de mai sus.
Este demn de menționat că valorile exacte Shapley pot fi calculate în acest context, deoarece există doar câțiva regresori externi. Acest lucru rămâne fezabil pentru un număr mic de regresori (mai puțin de 15, ceea ce, din nou, în acest context, nu este absurd de luat în considerare).
