Pachete R specializate pentru validare spațială: Spenrorest și Blockcv

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Acest document oferă o imagine de ansamblu a două pachete R, Sprerest şi blockcvcare poate fi utilizat pentru validarea spatială a încrucișării, dar sunt în afara cadrelor standard de învățare automată, cum ar fi semn de omisiune, Tidymodelssau MLR3.

Toate exemplele de mai jos folosesc același set de date, care include măsurătorile de temperatură din Spania, un set de covariate și coordonatele spațiale ale măsurătorilor de temperatură.

Sprerest (https://doi.org/10.32614/cran.package.sperrorest) este conceput pentru estimarea erorilor spațiale și evaluarea importanței variabile pentru modelele predictive. Pachetul în sine nu se potrivește modelelor, dar oferă un set de funcții pentru validarea încrucișată spațială, inclusiv împărțirea datelor și validarea încrucișată a modelului.

În timp ce Sprerest Pachetul are multe funcții (inclusiv un set de funcții pentru partiționarea datelor), funcția principală este sperrorest(). Efectuează validarea spațială pentru modelele de predicție spațială, incluzând evaluarea variabilă a importanței și estimarea erorilor de predicție. Pentru a utiliza această funcție, trebuie să oferim formula, datele, coordonatele, funcția modelului, argumentele modelului, funcția de predicție, funcția de eșantionare și argumentele de eșantionare.

Să o facem pas cu pas. În primul rând, trebuie să pregătim datele prin extragerea coordonatelor și crearea unui cadru de date cu variabila dependentă, covariate și coordonate.

library(sperrorest)
library(ranger)

coordinates <- sf::st_coordinates(temperature)
temperature_df <- sf::st_drop_geometry(temperature)
temperature_df$x <- coordinates(, 1)
temperature_df$y <- coordinates(, 2)

În al doilea rând, trebuie să definim formula pentru model și funcția de predicție.

response_name <- "temp"
covariate_names <- colnames(temperature_df)(2:(ncol(temperature_df) - 7))
fo <- as.formula(paste(
    response_name,
    "~",
    paste(covariate_names, collapse = " + ")
))

În al treilea rând, trebuie să definim funcția de predicție personalizată. Sprerest Pachetul funcționează cu multe funcții de model, dar necesită o funcție de predicție personalizată pentru a extrage predicțiile din obiectul model. În acest exemplu, folosim ranger model, deci trebuie să definim o funcție de predicție personalizată care să extragă predicțiile din ranger obiect model. predict() Funcție din ranger Pachetul returnează o listă cu mai multe elemente, așa că trebuie să extragem predicțiile din această listă.1

mypred <- function(object, newdata) {
    predict(object, newdata)$predictions
}

În al patrulea rând, putem efectua validarea spațială folosind sperrorest() funcţie. Trebuie doar să furnizăm date pregătite anterior, formula, funcția modelului și funcția de predicție. Mai mult, putem defini și unii parametri suplimentari ai modelului, cum ar fi numărul de arbori din ranger model. În cele din urmă, partea importantă este de a defini funcția de eșantionare (smp_fun) și argumentele sale (smp_args) Funcția de eșantionare este utilizată pentru a partiționa datele în seturi de instruire și testare: aici, folosim partition_kmeans() Funcție pentru a partiția datele spațial în pliuri folosind clustering-ul K-Means a coordonatelor.2

# Spatial cross-validation
set.seed(6)
sp_res <- sperrorest(
    formula = fo,
    data = temperature_df,
    coords = c("x", "y"),
    model_fun = ranger,
    model_args = list(num.trees = 100),
    pred_fun = mypred,
    smp_fun = partition_kmeans,
    smp_args = list(repetition = 1:2, nfold = 3),
    progress = FALSE
)

Rezultatul este o listă cu mai multe componente, inclusiv eroarea la niveluri de repetare și pliere, obiectul de eșantionare, importanța variabilă (numai atunci când importance = TRUE), referința și versiunea pachetului.

summary(sp_res$error_rep)
                      mean           sd        median          IQR
train_bias     0.003667002 0.0224183696   0.003667002 0.0158521812
train_stddev   0.399217628 0.0044832845   0.399217628 0.0031701609
train_rmse     0.399038491 0.0042677806   0.399038491 0.0030177766
train_mad      0.316892003 0.0078406248   0.316892003 0.0055441590
train_median   0.033006028 0.0001897285   0.033006028 0.0001341583
train_iqr      0.427813987 0.0083456683   0.427813987 0.0059012787
train_count  390.000000000 0.0000000000 390.000000000 0.0000000000
test_bias     -0.009090677 0.0742284999  -0.009090677 0.0524874756
test_stddev    1.447676903 0.0934364402   1.447676903 0.0660695405
test_rmse      1.444959463 0.0926651037   1.444959463 0.0655241232
test_mad       1.341466967 0.1144815717   1.341466967 0.0809506957
test_median    0.101932523 0.0950544902   0.101932523 0.0672136746
test_iqr       1.876642239 0.1533036116   1.876642239 0.1084020233
test_count   195.000000000 0.0000000000 195.000000000 0.0000000000

Putem contrasta rezultatele obținute cu validarea încrucișată non-spațială prin schimbarea funcției de eșantionare în partition_cv().

# Non-spatial cross-validation
set.seed(11)
nsp_res <- sperrorest(
    formula = fo,
    data = temperature_df,
    coords = c("x", "y"),
    model_fun = ranger,
    model_args = list(num.trees = 100),
    pred_fun = mypred,
    smp_fun = partition_cv,
    smp_args = list(repetition = 1:2, nfold = 3),
    progress = FALSE
)

Pentru a compara ambele rezultate, putem complota valorile RMSE pentru seturile de antrenament și testare atât de validare spațială, cât și de spatie.

library(ggplot2)
# Extract train/test RMSE from spatial CV
sp_train_rmse <- sp_res$error_rep$train_rmse
sp_test_rmse <- sp_res$error_rep$test_rmse
# Extract train/test RMSE from non-spatial CV
nsp_train_rmse <- nsp_res$error_rep$train_rmse
nsp_test_rmse <- nsp_res$error_rep$test_rmse
# Build data frame
rmse_df <- data.frame(
    CV_Type = rep(c("Spatial", "Non-Spatial"), each = 4),
    Set = rep(c("Train", "Test"), each = 2),
    RMSE = c(sp_train_rmse, sp_test_rmse, nsp_train_rmse, nsp_test_rmse)
)
ggplot(rmse_df, aes(x = CV_Type, y = RMSE, fill = Set)) +
    geom_boxplot() +
    facet_wrap(~Set) +
    labs(title = "RMSE Comparison", x = "CV Method", y = "RMSE")

Rezultatele arată că estimarea folosind validarea crucii spațiale este mai puțin optimistă decât validarea încrucișată non-spațială pentru setul de testare.

Mai multe exemple de utilizare a pachetului pot fi găsite la https://giscience-fsu.github.io/sperrorest/articles/spatial-modeling-use-case.html/

blockcv (https://doi.org/10.1111/2041-210x.13107) Pachetul oferă un set de funcții pentru validarea încrucișată, clusteringul spațial și de mediu și estimarea autocorelației spațiale. Pachetul în sine nu se potrivește modelelor.

# remotes::install_github("cran/automap")
library(blockCV)

Strategiile de validare încrucișată separă datele în seturi de instruire și testare pentru a evalua performanța modelului. blockcv Pachetul oferă mai multe strategii de validare încrucișată, inclusiv validare încrucișată bloc, clustering spațial, clustering de mediu, LOO de tamponare și cel mai apropiat LOO de potrivire a distanței vecinului (NNDM).

Validarea încrucișată a blocului este efectuată folosind cv_spatial() funcţie. Alocă blocuri la antrenamentele și testarea pliurilor la întâmplare, sistematic sau într -un model de tablă ( selection argument).

set.seed(61)
sb1 <- cv_spatial(
    x = temperature,
    k = 10, # number of folds
    size = 300000, # size of the blocks in meters
    selection = "random", # random blocks-to-fold
    iteration = 50, # find evenly dispersed folds
    progress = FALSE,
    biomod2 = TRUE
)
   train test
1    170   25
2    169   26
3    171   24
4    180   15
5    181   14
6    183   12
7    182   13
8    165   30
9    179   16
10   175   20

Rezultatul este o listă cu mai multe componente, inclusiv lista de pliuri, ID -urile Folds, tabelul BioMod, numărul de pliuri, dimensiunea de intrare, numele coloanei, blocurile și înregistrările. De exemplu, putem verifica structura listei de pliuri cu str() funcţie.

str(sb1$folds_list)
List of 10
 $ :List of 2
  ..$ : int (1:170) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:25) 23 31 57 39 58 60 21 22 32 27 ...
 $ :List of 2
  ..$ : int (1:169) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:26) 153 155 93 108 95 91 88 154 94 140 ...
 $ :List of 2
  ..$ : int (1:171) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:24) 12 45 175 176 166 20 177 19 167 16 ...
 $ :List of 2
  ..$ : int (1:180) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:15) 134 138 136 133 187 192 174 173 189 190 ...
 $ :List of 2
  ..$ : int (1:181) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:14) 161 142 143 150 160 149 146 147 158 151 ...
 $ :List of 2
  ..$ : int (1:183) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:12) 4 8 5 2 193 1 6 194 164 3 ...
 $ :List of 2
  ..$ : int (1:182) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:13) 128 124 129 130 127 132 131 120 126 125 ...
 $ :List of 2
  ..$ : int (1:165) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:30) 61 70 75 52 77 83 79 86 50 48 ...
 $ :List of 2
  ..$ : int (1:179) 23 31 57 39 58 60 21 22 32 27 ...
  ..$ : int (1:16) 117 87 103 84 105 99 119 101 98 97 ...
 $ :List of 2
  ..$ : int (1:175) 117 87 103 84 105 99 119 101 98 97 ...
  ..$ : int (1:20) 163 181 159 157 186 67 71 41 178 179 ...

cv_plot() Funcția permite, în plus, vizualizarea rezultatelor de validare încrucișată.

cv_plot(sb1, temperature)

Să comparăm rezultatele validării încrucișate cu bloc cu modele sistematice și de bord de control.

set.seed(16)
sb2 <- cv_spatial(
    x = temperature,
    k = 10,
    rows_cols = c(4, 6),
    hexagon = FALSE,
    selection = "systematic"
)
   train test
1    172   23
2    180   15
3    177   18
4    169   26
5    178   17
6    182   13
7    180   15
8    162   33
9    178   17
10   177   18

cv_plot(sb2, temperature)

set.seed(12)
sb3 <- cv_spatial(
    x = temperature,
    k = 10,
    size = 300000,
    hexagon = FALSE,
    selection = "checkerboard"
)
  train test
1    98   97
2    97   98

cv_plot(sb3, temperature)

Strategiile de clustering (cv_cluster()) sunt utilizate pentru a grupa datele în clustere bazate pe asemănare spațială sau de mediu. Asemănarea spațială se bazează doar pe gruparea coordonatelor spațiale.

set.seed(7)
scv <- cv_cluster(x = temperature, k = 10)
   train test
1    169   26
2    169   26
3    173   22
4    178   17
5    179   16
6    182   13
7    176   19
8    171   24
9    178   17
10   180   15
cv_plot(scv, temperature)

Pe de altă parte, gruparea de mediu se bazează pe gruparea valorilor covariatelor extrase din datele raster.

set.seed(2)
ecv <- cv_cluster(x = temperature, r = covariates, k = 5, scale = TRUE)
  train test
1   164   31
2   190    5
3   182   13
4   154   41
5    90  105
cv_plot(ecv, temperature)

Următoarea strategie de validare încrucișată este tamponarea LOO (cunoscută și sub denumirea de LOO spațială). Se efectuează folosind cv_buffer() Funcție, care selectează un tampon în jurul fiecărui punct (punct de testare) și folosește punctele din afara tamponului ca set de testare.3

set.seed(21)
bloo <- cv_buffer(x = temperature, size = 300000, progress = FALSE)
     train            test  
 Min.   : 97.0   Min.   :1  
 Mean   :132.7   Mean   :1  
 Max.   :170.0   Max.   :1  
cv_plot(bloo, temperature, num_plots = c(1, 50, 100))

Rețineți că, mai sus, am complotat doar primul, 50 și 100 puncte pentru a evita supraplotarea.

Ultima strategie de validare încrucișată implementată în blockcv Pachetul este cel mai apropiat loo de potrivire a distanței vecin (NNDM). Se efectuează folosind cv_nndm() Funcția, care încearcă să corespundă celei mai apropiate funcții de distribuție a distanței vecinului între datele de testare și instruire cu cea mai apropiată funcție de distribuție a distanței vecinului între predicția țintă și punctele de instruire. Astfel, în această bază, trebuie să oferim mai multe argumente, inclusiv un raster cu covariatele, numărul de eșantioane, strategia de eșantionare și dimensiunea minimă de antrenament.

set.seed(12)
nncv <- cv_nndm(
    x = temperature,
    r = covariates,
    size = 300000,
    num_sample = 5000,
    sampling = "regular",
    min_train = 0.1,
    plot = TRUE
)
     train            test  
 Min.   :192.0   Min.   :1  
 Mean   :192.9   Mean   :1  
 Max.   :193.0   Max.   :1  

cv_plot(nncv, temperature, num_plots = c(1, 50, 100))

Să folosim acum validarea încrucișată a blocului pentru a se potrivi și evalua un model.

# define formula
response_name <- "temp"
covariate_names <- colnames(temperature_df)(2:(ncol(temperature_df) - 7))
fo <- as.formula(paste(
    response_name,
    "~",
    paste(covariate_names, collapse = " + ")
))

# extract the folds
folds <- sb1$folds_list

model_rmse <- data.frame(fold = seq_along(folds), rmse = rep(NA, length(folds)))

for (k in seq_along(folds)) {
    trainSet <- unlist(folds((k))(1)) # training set indices; first element
    testSet <- unlist(folds((k))(2)) # testing set indices; second element
    rf <- ranger(fo, temperature_df(trainSet, ), num.trees = 100) # model fitting on training set
    pred <- predict(rf, temperature_df(testSet, ))$predictions # predict the test set
    model_rmse(k, "rmse") <- sqrt(mean(
        (temperature_df(testSet, response_name) - pred)^2
    )) # calculate RMSE
}
model_rmse
   fold      rmse
1     1 1.1401856
2     2 0.7848595
3     3 0.9219486
4     4 0.8007453
5     5 0.6485726
6     6 1.2989341
7     7 0.8140209
8     8 1.2050918
9     9 0.9696801
10   10 0.8681127

blockcv Pachetul oferă, de asemenea, funcții pentru verificarea asemănării dintre pliuri (cv_similarity()) și estimarea gamei eficiente de autocorelație spațială (cv_spatial_autocor()) Prima funcție este utilizată pentru a verifica asemănarea dintre pliurile din validarea încrucișată.

cv_similarity(cv = sb1, x = temperature, r = covariates, progress = FALSE)
Warning: The following aesthetics were dropped during statistical transformation:
colour.
ℹ This can happen when ggplot fails to infer the correct grouping structure in
  the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
  variable into a factor?

A doua funcție este utilizată pentru a estima gama eficientă de autocorelație spațială a tuturor straturilor de raster de intrare sau a datelor de răspuns-rolul său este de a ajuta la determinarea dimensiunii blocurilor din validarea încrucișată a blocului.

cv_spatial_autocor(r = covariates, num_sample = 5000, progress = FALSE)

Mai multe exemple de utilizare a pachetului pot fi găsite la https://cran.r-project.org/web/packages/blockcv/vignettes/tutorial_2.html.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.