Apprendimento automatico a effetti misti con GPBoost per dati econometrici spaziali raggruppati e areali.

Automatic mixed-effects learning with GPBoost for grouped and areal spatial econometric data.

Una demo utilizzando i dati del PIL europeo

Effetto spaziale (dopo aver considerato le variabili predittive) ed effetto della variabile predittiva 'K' sul PIL europeo - Immagine dell'autore

Introduzione · Descrizione dei dati · Caricamento dei dati e breve visualizzazione Addestramento di un modello GPBoost Scelta dei parametri di sintonizzazione Interpretazione del modello · Modello di effetti casuali stimato · Mappa degli effetti spaziali · Comprensione della funzione degli effetti fissi Estensioni · Effetti casuali separati per diversi periodi di tempo · Interazione tra lo spazio e le variabili predittive degli effetti fissi · Grandi dati · Altri modelli di effetti casuali spaziali · Modelli di effetti misti lineari (generalizzati) e di processi gaussiani ∘ Riferimenti

Introduzione

L’algoritmo GPBoost estende i modelli di effetti casuali lineari e di processi gaussiani sostituendo la funzione di effetti fissi lineare con una funzione non parametrica non lineare modellata utilizzando il tree-boosting. Questo articolo mostra come l’algoritmo GPBoost implementato nella libreria GPBoost può essere utilizzato per modellare i dati con una struttura spaziale e raggruppata. Dimostriamo la funzionalità della libreria GPBoost utilizzando i dati del PIL europeo che rappresenta un esempio di dati econometrici spaziali di tipo areale. Tutti i risultati sono ottenuti utilizzando la versione 1.2.1 di GPBoost. Questa demo utilizza il pacchetto R, ma il pacchetto corrispondente in Python fornisce la stessa funzionalità.

L’applicazione di un modello GPBoost (= combinazione di tree-boosting ed effetti casuali / modelli GP) comporta i seguenti passaggi principali:

  1. Definire un GPModel in cui si specificano i seguenti elementi: – Un modello di effetti casuali (ad esempio, effetti casuali spaziali, effetti casuali raggruppati, combinati spaziali e raggruppati, ecc.) – La verosimiglianza (= distribuzione della variabile di risposta condizionata agli effetti fissi e casuali)
  2. Creare un gpb.Dataset con la variabile di risposta e le variabili predittive degli effetti fissi
  3. Scegliere i parametri di sintonizzazione, ad esempio utilizzando la funzione gpb.grid.search.tune.parameters
  4. Addestrare il modello con la funzione gpboost / gpb.train

In questo articolo, dimostriamo questi passaggi utilizzando un set di dati del mondo reale. Inoltre, mostriamo anche come interpretare i modelli adattati e analizziamo diverse estensioni e funzionalità aggiuntive della libreria GPBoost.

Descrizione dei dati

I dati utilizzati in questa demo sono i dati del prodotto interno lordo (PIL) europeo. Possono essere scaricati da https://raw.githubusercontent.com/fabsig/GPBoost/master/data/gdp_european_regions.csv . I dati sono stati raccolti da Massimo Giannini, dell’Università di Roma Tor Vergata, da Eurostat e gentilmente forniti a Fabio Sigrist per una presentazione all’Università di Roma Tor Vergata il 16 giugno 2023.

I dati sono stati raccolti per 242 regioni europee per gli anni 2000 e 2021. Cioè, il numero totale di punti dati è 484. La variabile di risposta è il PIL / abitante (logaritmico). Ci sono quattro variabili predittive:

  • L: (log) quota di occupazione (empl/pop)
  • K: (log) capitale fisso / popolazione
  • Pop: log(popolazione)
  • Edu: quota di istruzione terziaria

Inoltre, ci sono coordinate spaziali del centroide di ogni regione (longitudine e latitudine), un ID di regione spaziale per le 242 diverse regioni europee e un ulteriore ID di cluster spaziale che identifica il cluster di appartenenza della regione (ci sono due cluster).

Caricamento dei dati e breve visualizzazione

Carichiamo prima i dati e creiamo una mappa che illustra il PIL / abitante (logaritmico) sullo spazio.

library(gpboost)data <- read.csv("https://raw.githubusercontent.com/fabsig/GPBoost/master/data/gdp_european_regions.csv")data <- as.matrix(data) # convertire in matrice poiché la parte di boosting al momento non supporta i data.framescovars <- c("L", "K", "pop", "edu")library(ggplot2)library(viridis)library(gridExtra)p1 <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"],                               GDP=data[,"y"]), aes(x=Long,y=Lat,color=GDP)) +  geom_point(size=2, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("PIL / abitante (logaritmico)")p2 <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"],                                GDP=data[,"y"]), aes(x=Long,y=Lat,color=GDP)) +  geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("PIL / abitante (logaritmico) - Europa esclusi le isole") + xlim(-10,28) + ylim(35,67)grid.arrange(p1, p2, ncol=2)
log del PIL pro capite per 242 regioni europee — Immagine dell'autore

Addestrare un modello GPBoost

Nel seguito, utilizziamo un modello di processo gaussiano con una funzione di covarianza esponenziale per modellare gli effetti casuali spaziali. Inoltre, includiamo effetti casuali raggruppati per la variabile cluster cl. Nella libreria GPBoost, gli effetti casuali di processo gaussiano sono definiti dall’argomento gp_coords e gli effetti casuali raggruppati tramite l’argomento group_data del costruttore GPModel. Le predittive variabili sopra menzionate sono utilizzate nella funzione di alberi a insieme di effetti fissi. Addestriamo il modello utilizzando la funzione gpboost, o equivalente la funzione gpb.train. Notare che utilizziamo i parametri di sintonizzazione selezionati di seguito attraverso la cross-validazione.

gp_model <- GPModel(group_data = data[, c("cl")],                     gp_coords = data[, c("Long", "Lat")],                    likelihood = "gaussian", cov_function = "exponential")params <- list(learning_rate = 0.01, max_depth = 2, num_leaves = 2^10,               min_data_in_leaf = 10, lambda_l2 = 0)nrounds <- 37# gp_model$set_optim_params(params = list(trace=TRUE)) # Per monitorare l'ottimizzazione dei parametriboost_data <- gpb.Dataset(data = data[, covars], label = data[, "y"])gpboost_model <- gpboost(data = boost_data, gp_model = gp_model,                          nrounds = nrounds, params = params,                          verbose = 1) # stesso come gpb.train# stesso come gpb.train gpb.train

Scelta dei parametri di sintonizzazione

È importante scegliere adeguatamente i parametri di sintonizzazione per il boosting. Non esistono valori predefiniti universali e ogni set di dati probabilmente richiederà parametri di sintonizzazione differenti. Notare che ciò può richiedere del tempo. Invece di una ricerca a griglia fissa come in basso, si può anche fare una ricerca a griglia casuale per velocizzare le cose (vedi num_try_random). Di seguito mostriamo come scegliere i parametri di sintonizzazione utilizzando la funzione gpb.grid.search.tune.parameters. Utilizziamo l’errore quadratico medio (mse) come misura di accuratezza di previsione sui dati di validazione. In alternativa, si può anche usare, ad esempio, il log-likelihood negativo di test (test_neg_log_likelihood = valore predefinito se non viene specificato) che tiene anche conto dell’incertezza di previsione.

gp_model <- GPModel(group_data = data[, "cl"],                     gp_coords = data[, c("Long", "Lat")],                    likelihood = "gaussian", cov_function = "exponential")boost_data <- gpb.Dataset(data = data[, covars], label = data[, "y"])param_grid = list("learning_rate" = c(1,0.1,0.01),                   "min_data_in_leaf" = c(10,100,1000),                  "max_depth" = c(1,2,3,5,10),                  "lambda_l2" = c(0,1,10))other_params <- list(num_leaves = 2^10)set.seed(1)opt_params <- gpb.grid.search.tune.parameters(param_grid = param_grid, params = other_params,                                              num_try_random = NULL, nfold = 4,                                              data = boost_data, gp_model = gp_model,                                               nrounds = 1000, early_stopping_rounds = 10,                                              verbose_eval = 1, metric = "mse") # metric = "test_neg_log_likelihood"opt_params# ***** Nuovo miglior risultato di test (l2 = 0.0255393919591794) trovato per la seguente combinazione di parametri: learning_rate: 0.01, min_data_in_leaf: 10, max_depth: 2, lambda_l2: 0, nrounds: 37

Interpretazione del modello

Modello di effetti casuali stimati

Informazioni sul modello di effetti casuali stimati possono essere ottenute chiamando la funzione summary sul gp_model. Per i processi gaussiani, GP_var è la varianza marginale, ovvero la quantità di correlazione spaziale o la variazione spaziale strutturale, e GP_range è il parametro di scala che misura la velocità con cui la correlazione decade nello spazio. Per una funzione di covarianza esponenziale, tre volte questo valore (circa 17 qui) è la distanza in cui la correlazione spaziale (residua) è essenzialmente zero (inferiore al 5%). Come mostrano i risultati di seguito, la quantità di correlazione spaziale è relativamente piccola poiché la varianza marginale di 0,0089 è piccola rispetto alla varianza totale della variabile di risposta, che è circa 0,29. Inoltre, il termine di errore e gli effetti casuali raggruppati cl hanno anche varianze piccole (0,013 e 0,022). Concludiamo quindi che la maggior parte della varianza della variabile di risposta è spiegata dalle variabili predittive a effetti fissi.

summary(gp_model)

## =====================================================## Covariance parameters (random effects):##            Param.## Error_term 0.0131## Group_1    0.0221## GP_var     0.0089## GP_range   5.7502## =====================================================

Mappa degli effetti spaziali

Possiamo tracciare gli effetti casuali spaziali stimati (“previsti”) nelle posizioni dei dati di addestramento chiamando la funzione predict sui dati di addestramento; vedi il codice di seguito. Tale grafico mostra l’effetto spaziale quando si eliminano gli effetti delle variabili predittive a effetto fisso. Si noti che questi effetti spaziali tengono conto sia del processo gaussiano spaziale che degli effetti casuali del cluster della regione raggruppata. Se si desidera ottenere solo effetti casuali spaziali dalla parte di processo gaussiano, è possibile utilizzare la funzione predict_training_data_random_effects (vedi il codice commentato di seguito). In alternativa, è anche possibile eseguire l’interpolazione spaziale (= “Krigging”), ma questo non ha molto senso per i dati areali.

pred <- predict(gpboost_model, group_data_pred = data[1:242, c("cl")],                 gp_coords_pred = data[1:242, c("Long", "Lat")],                data = data[1:242, covars], predict_var = TRUE, pred_latent = TRUE)plot_mu <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"], spat_eff=pred$random_effect_mean),aes(x=Long,y=Lat,color=spat_eff)) +  geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("Effetto spaziale (media)") + xlim(-10,28) + ylim(35,67)plot_sd <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"], std_dev=pred$random_effect_cov),aes(x=Long,y=Lat,color=std_dev)) +  geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("Incertezza (dev. std.)") + xlim(-10,28) + ylim(35,67)grid.arrange(plot_mu, plot_sd, ncol=2)# # Solo effetti casuali spaziali dal processo gaussiano# rand_effs <- predict_training_data_random_effects(gp_model, predict_var = TRUE)[1:242, c("GP", "GP_var")]# plot_mu <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"], spat_eff=rand_effs[,1]),aes(x=Long,y=Lat,color=spat_eff)) +#   geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") + #   ggtitle("Effetto spaziale dal processo gaussiano (media)") + xlim(-10,28) + ylim(35,67)# plot_sd <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"], std_dev=rand_effs[,2]),aes(x=Long,y=Lat,color=std_dev)) +#   geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") + #   ggtitle("Incertezza (dev. std.)") + xlim(-10,28) + ylim(35,67)# grid.arrange(plot_mu, plot_sd, ncol=2)
Effetto spaziale (dopo l'eliminazione delle variabili predittive) - Immagine dell'autore

Comprendere la funzione degli effetti a effetto fisso

Esistono diversi strumenti per capire la forma della funzione degli effetti a effetto fisso. Di seguito consideriamo misure di importanza delle variabili, misure di interazione e grafici di dipendenza. In particolare, guardiamo a

  • valori SHAP
  • grafici di dipendenza SHAP
  • importanza delle variabili basata sulla suddivisione
  • statistica H di Friedman
  • grafici di dipendenza parziale (unidimensionali e bidimensionali)

Come i risultati seguenti mostrano, le informazioni ottenute dai valori SHAP e dai grafici di dipendenza SHAP sono le stesse che quando si guardano le tradizionali misure di importanza delle variabili e i grafici di dipendenza parziale. Le variabili più importanti sono ‘K’ e ‘edu’. Dai grafici di dipendenza, si conclude che ci sono non linearità. Ad esempio, l’effetto di K è quasi piatto per valori grandi e piccoli di K e aumenta tra questi. Inoltre, l’effetto di edu è più ripido per valori piccoli di edu e si appiattisce per valori più grandi di edu. La statistica H di Friedman indica che ci sono alcune interazioni. Per le due variabili con la maggior quantità di interazione, L e pop, creiamo un grafico di dipendenza parziale bidimensionale qui sotto.

# SHAP values
library(SHAPforxgboost)
shap.plot.summary.wrap1(gpboost_model, X = data[,covars]) + ggtitle("Valori SHAP")
Valori SHAP - Immagine dell'autore
# SHAP dependence plots
shap_long <- shap.prep(gpboost_model, X_train = data[,covars])
shap.plot.dependence(data_long = shap_long, x = covars[2], color_feature = covars[4], smooth = FALSE, size = 2) + ggtitle("Grafico di dipendenza SHAP per K")
shap.plot.dependence(data_long = shap_long, x = covars[4], color_feature = covars[2], smooth = FALSE, size = 2) + ggtitle("Grafico di dipendenza SHAP per edu")
Grafico di dipendenza SHAP per K - Immagine dell'autore
Grafico di dipendenza SHAP per edu - Immagine dell'autore
# Importanza delle feature basata sulla suddivisione
feature_importances <- gpb.importance(gpboost_model, percentage = TRUE)
gpb.plot.importance(feature_importances, top_n = 25, measure = "Gain", main = "Importanza delle variabili basata sulla suddivisione")
Importanza delle variabili - Immagine dell'autore
# Statistica H per le interazioni. Nota: non ci sono interazioni se max_depth = 1
library(flashlight)
fl <- flashlight(model = gpboost_model, data = data.frame(y = data[,"y"], data[,covars]), y = "y", label = "gpb",
                 predict_fun = function(m, X) predict(m, data.matrix(X[,covars]), gp_coords_pred = matrix(-100, ncol = 2, nrow = dim(X)[1]),
                                                      group_data_pred = matrix(-1, ncol = 1, nrow = dim(X)[1]), pred_latent = TRUE)$fixed_effect)
plot(imp <- light_interaction(fl, v = covars, pairwise = TRUE)) + ggtitle("Statistica di interazione H") # richiede alcuni secondi
Statistica di interazione H - Immagine dell'autore
# Grafici di dipendenza parziale
gpb.plot.partial.dependence(gpboost_model, data[,covars], variable = 2, xlab = covars[2], ylab = "gdp", main = "Grafico di dipendenza parziale")
gpb.plot.partial.dependence(gpboost_model, data[,covars], variable = 4, xlab = covars[4], ylab = "gdp", main = "Grafico di dipendenza parziale")
Grafico di dipendenza parziale per K - Immagine dell'autore
Grafico di dipendenza parziale per edu - Immagine dell'autore
# Grafico di dipendenza parziale bidimensionale (per visualizzare le interazioni)
i = 1; j = 3; # i vs j
gpb.plot.part.dep.interact(gpboost_model, data[,covars], variables = c(i,j), xlab = covars[i], ylab = covars[j], main = "Grafico di dipendenza parziale bidimensionale")

Grafico di dipendenza parziale bidimensionale per pop e L — Immagine dell'autore

Estensioni

Effetti casuali separati per periodi di tempo diversi

Nel modello sopra, abbiamo utilizzato gli stessi effetti casuali per gli anni 2000 e 2021. In alternativa, è possibile utilizzare effetti casuali spaziali e raggruppati indipendenti per diversi periodi di tempo (indipendenti sotto il prior, condizionati ai dati, ci sono dipendenze …). Nella libreria GPBoost, ciò può essere fatto tramite l’argomento cluster_ids. cluster_ids deve essere un vettore di lunghezza uguale alla dimensione del campione e ogni voce indica il “cluster” a cui appartiene un’osservazione. Diversi cluster hanno effetti casuali spaziali e raggruppati indipendenti, ma gli iperparametri (ad esempio, la varianza marginale, le componenti di varianza, ecc.) e la funzione degli effetti fissi sono gli stessi in tutti i cluster.

Di seguito mostriamo come è possibile adattare un tale modello e creare due mappe spaziali separate. Come mostrano i risultati di seguito, gli effetti spaziali sono abbastanza diversi per gli anni 2000 e 2021. In particolare, c’è meno variazione spaziale (o eterogeneità) residuale per l’anno 2021 rispetto al 2000. Ciò è confermato guardando le deviazioni standard degli effetti casuali spaziali previsti, che è quasi il doppio per il 2000 rispetto all’anno 2021 (vedi sotto). Una ulteriore conclusione è che nel 2000 c’erano più regioni con numeri del PIL “bassi” (effetti spaziali inferiori a 0), e questo non è più il caso per il 2021.

gp_model <- GPModel(group_data = data[, c("cl")], gp_coords = data[, c("Long", "Lat")],                    likelihood = "gaussian", cov_function = "exponential",                    cluster_ids  = c(rep(1,242), rep(2,242)))
boost_data <- gpb.Dataset(data = data[, covars], label = data[, "y"])
params <- list(learning_rate = 0.01, max_depth = 1, num_leaves = 2^10,               min_data_in_leaf = 10, lambda_l2 = 1) # Nota: usiamo gli stessi parametri di tuning come sopra. Idealmente, dovrebbero essere scelti nuovamente
gpboost_model <- gpboost(data = boost_data, gp_model = gp_model, nrounds = nrounds,                         params = params, verbose = 0)
# Mappe spaziali separate per gli anni 2000 e 2021
pred <- predict(gpboost_model, group_data_pred = data[, c("cl")],                 gp_coords_pred = data[, c("Long", "Lat")],                data = data[, covars], predict_var = TRUE, pred_latent = TRUE,                cluster_ids_pred = c(rep(1,242), rep(2,242)))
plot_mu_2000 <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"],                                          spat_eff=pred$random_effect_mean[1:242]),                        aes(x=Long,y=Lat,color=spat_eff)) +  geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("Effetto spaziale per il 2000 (media)") + xlim(-10,28) + ylim(35,67)
plot_mu_2021 <- ggplot(data = data.frame(Lat=data[,"Lat"], Long=data[,"Long"],                                          spat_eff=pred$random_effect_mean[243:484]),                        aes(x=Long,y=Lat,color=spat_eff)) +  geom_point(size=3, alpha=0.5) + scale_color_viridis(option = "B") +   ggtitle("Effetto spaziale per il 2021 (media)") + xlim(-10,28) + ylim(35,67)
grid.arrange(plot_mu_2000, plot_mu_2021, ncol=2)
Effetti spaziali separati per gli anni 2000 e 2021 - Immagine dell'autore

Interazione tra spazio e predictor variabili a effetti fissi

Nel modello sopra, non c’è interazione tra gli effetti casuali e i predictor variabili a effetti fissi. Cioè, non c’è interazione tra le coordinate spaziali e i predictor variabili a effetti fissi. Tale interazione può essere modellata includendo ulteriormente le variabili di input degli effetti casuali (= le coordinate spaziali o la variabile di raggruppamento categorica) nella funzione degli effetti fissi. Il codice qui sotto mostra come ciò possa essere fatto. Come mostra il grafico di importanza delle variabili qui sotto, le coordinate non vengono utilizzate nell’albero di insieme, e non è quindi possibile rilevare tale interazione per questo set di dati.

gp_model <- GPModel(group_data = data[, c("cl")], gp_coords = data[, c("Long", "Lat")],                    likelihood = "gaussian", cov_function = "exponential")covars_interact <- c(c("Long", "Lat"), covars) ## aggiungere le coordinate spaziali ai predictor variabili a effetti fissiboost_data <- gpb.Dataset(data = data[, covars_interact], label = data[, "y"])params <- list(learning_rate = 0.01, max_depth = 1, num_leaves = 2^10,               min_data_in_leaf = 10, lambda_l2 = 1) # Nota: usiamo gli stessi parametri di ottimizzazione di sopra. Idealmente, dovrebbero essere scelti di nuovo.gpboost_model <- gpboost(data = boost_data, gp_model = gp_model, nrounds = nrounds,                         params = params, verbose = 0)feature_importances <- gpb.importance(gpboost_model, percentage = TRUE)gpb.plot.importance(feature_importances, top_n = 25, measure = "Gain",                     main = "Importanza delle variabili quando si includono le coordinate negli effetti fissi")
Importanza delle variabili quando si includono le coordinate nell'albero di insieme - Immagine dell'autore

Grandi dati

Per grandi set di dati, i calcoli con i processi gaussiani sono lenti, e si deve utilizzare un’approximazione. La libreria GPBoost implementa diverse di queste. Ad esempio, impostando gp_approx="vecchia" nel costruttore di GPModel si userà un’approximazione di Vecchia. Il set di dati utilizzato in questo articolo è relativamente piccolo, e possiamo fare tutti i calcoli esattamente.

Altri modelli di effetti casuali spaziali

In precedenza, abbiamo utilizzato un processo gaussiano per modellare gli effetti casuali spaziali. Poiché i dati sono dati areali, un’altra opzione è utilizzare modelli che si basano sulle informazioni di vicinato come i modelli CAR e SAR. Questi modelli attualmente non sono ancora implementati nella libreria GPBoost (potrebbero essere aggiunti in futuro -> contattare l’autore).

Un’altra opzione è utilizzare un modello di effetti casuali raggruppati definito dalla variabile ID di regione categorica per modellare gli effetti spaziali. Il codice qui sotto mostra come ciò può essere fatto in GPBoost. Tuttavia, questo modello essenzialmente ignora la struttura spaziale.

gp_model <- GPModel(group_data = data[, c("group", "cl")], likelihood = "gaussian")

(Generalizzati) modelli di effetti misti lineari e di processi gaussiani

(Generalizzati) modelli di effetti misti lineari e di processi gaussiani possono essere eseguiti anche nella libreria GPBoost. Il codice qui sotto mostra come ciò può essere fatto con la funzione fitGPModel. Si noti che è necessario aggiungere manualmente una colonna di 1 per includere un’intercetta.

X_incl_1 = cbind(Intercept = rep(1,dim(data)[1]), data[, covars])gp_model <- fitGPModel(group_data = data[, c("cl")], gp_coords = data[, c("Long", "Lat")],                       likelihood = "gaussian", cov_function = "exponential",                       y = data[, "y"], X = X_incl_1, params = list(std_dev=TRUE))summary(gp_model)

## =====================================================## Riepilogo del modello:## Log-lik     AIC     BIC ##  195.97 -373.94 -336.30 ## Nb. osservazioni: 484## Nb. di gruppi: 2 (Group_1)## -----------------------------------------------------## Parametri di covarianza (effetti casuali):##            Param. Std. dev.## Error_term 0.0215    0.0017## Group_1    0.0003    0.0008## GP_var     0.0126    0.0047## GP_range   7.2823    3.6585## -----------------------------------------------------## Coefficienti di regressione lineare (effetti fissi):##            Param. Std. dev. z value P(>|z|)## Intercept 16.2816    0.4559 35.7128  0.0000## L          0.4243    0.0565  7.5042  0.0000## K          0.6493    0.0212 30.6755  0.0000## pop        0.0134    0.0097  1.3812  0.1672## edu        0.0100    0.0009 10.9645  0.0000## =====================================================

Riferimenti

  • Sigrist Fabio. “Gaussian Process Boosting”. Journal of Machine Learning Research (2022).
  • Sigrist Fabio. “Latent Gaussian Model Boosting”. IEEE Transactions on Pattern Analysis and Machine Intelligence (2023).
  • https://github.com/fabsig/GPBoost
  • La fonte del dataset è Eurostat; consultare https://ec.europa.eu/eurostat/about-us/policies/copyright per maggiori informazioni sui diritti (“Eurostat ha una politica di incoraggiamento alla libera riutilizzazione dei propri dati, sia a scopo non commerciale che commerciale.”).