(Acest articol a fost publicat pentru prima dată pe geocompxși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Aceasta este a treia parte a unei serii de postări pe blog despre învățarea mașinilor spațiale cu R.
Puteți găsi lista altor postări pe blog în această serie în prima parte.
Introducere
În această postare pe blog, vom arăta cum să folosim Tidymodels Cadru pentru învățarea spațială a mașinilor. Tidymodels Framework este o colecție de pachete R pentru modelare și învățare automată folosind Tidyverse Principiile.
Pregătiți date
Încărcați pachetele necesare:
library(terra) library(sf) library(tidymodels) library(ranger) library(dplyr) library(spatialsample) library(waywiser) library(vip)
Citiți date:
trainingdata <- sf::st_read("https://github.com/LOEK-RS/FOSSGIS2025-examples/raw/refs/heads/main/data/temp_train.gpkg") predictors <- terra::rast("https://github.com/LOEK-RS/FOSSGIS2025-examples/raw/refs/heads/main/data/predictors.tif")
Pregătiți datele prin extragerea datelor de instruire din raster și transformarea acestora într -un sf
obiect.
trainDat <- sf::st_as_sf(terra::extract(predictors, trainingdata, bind = TRUE)) predictor_names <- names(predictors) # Extract predictor names from the raster response_name <- "temp"
Comparativ cu semn de omisiunenu este necesară scăderea geometriilor.
Un model simplu de antrenament și predicție
În primul rând, antrenăm un model de pădure aleatoriu. Acest lucru se face prin definirea unei rețete și a unui model, și apoi combinându -le într -un flux de lucru. Un astfel de flux de lucru poate fi apoi utilizat pentru a se potrivi modelului la date.
# Define the recipe formula <- as.formula(paste( response_name, "~", paste(predictor_names, collapse = " + ") )) recipe <- recipes::recipe(formula, data = trainDat) rf_model <- parsnip::rand_forest(trees = 100, mode = "regression") |> set_engine("ranger", importance = "impurity") # Create the workflow workflow <- workflows::workflow() |> workflows::add_recipe(recipe) |> workflows::add_model(rf_model) # Fit the model rf_fit <- parsnip::fit(workflow, data = trainDat)
Acum, să folosim modelul pentru predicție spațială cu terra::predict()
.
prediction_raster <- terra::predict(predictors, rf_fit, na.rm = TRUE) plot(prediction_raster)
Validare încrucișată spațială
Validarea încrucișată necesită specificarea modului în care datele sunt împărțite în pliuri. Aici, definim o validare încrucișată non-spațială cu rsample::vfold_cv()
și o validare încrucișată spațială cu spatialsample::spatial_block_cv()
.
random_folds <- rsample::vfold_cv(trainDat, v = 4) block_folds <- spatialsample::spatial_block_cv(trainDat, v = 4, n = 2) spatialsample::autoplot(block_folds)
# control cross-validation keep_pred <- tune::control_resamples(save_pred = TRUE, save_workflow = TRUE)
În continuare, ne potrivim modelul la date folosind validarea încrucișată cu tune::fit_resamples()
.
### Cross-validation rf_random <- tune::fit_resamples( workflow, resamples = random_folds, control = keep_pred ) rf_spatial <- tune::fit_resamples( workflow, resamples = block_folds, control = keep_pred )
Pentru a compara modelele montate, putem folosi tune::collect_metrics()
Funcție pentru a obține valorile.
### get CV metrics tune::collect_metrics(rf_random)
# A tibble: 2 × 6 .metric .estimator mean n std_err .config1 rmse standard 0.934 4 0.0610 Preprocessor1_Model1 2 rsq standard 0.908 4 0.0154 Preprocessor1_Model1
tune::collect_metrics(rf_spatial)
# A tibble: 2 × 6 .metric .estimator mean n std_err .config1 rmse standard 1.33 4 0.271 Preprocessor1_Model1 2 rsq standard 0.740 4 0.0783 Preprocessor1_Model1
# rf_spatial$.metrics # metrics from each fold
În plus, putem vizualiza modelele prin extragerea predicțiilor lor cu tune::collect_predictions()
și complotându -le.
Similar cu semn de omisiunemai întâi definim pliurile și o definiție a controlului trenului. Modelul final este totuși stocat într -un obiect separat.
Reglarea modelului: reglarea hiperparameterului spațial și selecția variabilă
Reglarea hiperparameterului
În continuare, reglăm hiperparametrele modelului. Pentru aceasta, schimbăm fluxul de lucru pentru a include specificațiile de reglare folosind tune()
Funcționați în definiția modelului și definiți o grilă de hiperparametre pentru a căuta. Reglarea se face cu tune::tune_grid()
.
# mark two parameters for tuning: rf_model <- parsnip::rand_forest( trees = 100, mode = "regression", mtry = tune(), min_n = tune() ) |> set_engine("ranger", importance = "impurity") workflow <- update_model(workflow, rf_model) # define tune grid: grid_rf <- grid_space_filling( mtry(range = c(1, 20)), min_n(range = c(2, 10)), size = 30 ) # tune: rf_tuning <- tune_grid( workflow, resamples = block_folds, grid = grid_rf, control = keep_pred )
Rezultatele pot fi extrase cu collect_metrics()
și apoi vizualizat.
rf_tuning |> collect_metrics()
# A tibble: 60 × 8 mtry min_n .metric .estimator mean n std_err .config1 1 5 rmse standard 1.91 4 0.307 Preprocessor1_Model01 2 1 5 rsq standard 0.613 4 0.0849 Preprocessor1_Model01 3 1 9 rmse standard 1.93 4 0.311 Preprocessor1_Model02 4 1 9 rsq standard 0.582 4 0.103 Preprocessor1_Model02 5 2 4 rmse standard 1.61 4 0.318 Preprocessor1_Model03 6 2 4 rsq standard 0.697 4 0.0692 Preprocessor1_Model03 7 2 2 rmse standard 1.68 4 0.285 Preprocessor1_Model04 8 2 2 rsq standard 0.654 4 0.111 Preprocessor1_Model04 9 3 7 rmse standard 1.47 4 0.304 Preprocessor1_Model05 10 3 7 rsq standard 0.713 4 0.0837 Preprocessor1_Model05 # ℹ 50 more rows
rf_tuning |> collect_metrics() |> mutate(min_n = factor(min_n)) |> ggplot(aes(mtry, mean, color = min_n)) + geom_line(linewidth = 1.5, alpha = 0.6) + geom_point(size = 2) + facet_wrap(~.metric, scales = "free", nrow = 2) + scale_x_log10(labels = scales::label_number()) + scale_color_viridis_d(option = "plasma", begin = .9, end = 0)
În cele din urmă, putem extrage cel mai bun model și îl putem folosi pentru a obține importanța variabilă și a face predicții.
finalmodel <- fit_best(rf_tuning) finalmodel
══ Workflow (trained) ══════════════════════════════════════════════════════════ Preprocessor: Recipe Model: rand_forest() ── Preprocessor ──────────────────────────────────────────────────────────────── 0 Recipe Steps ── Model ─────────────────────────────────────────────────────────────────────── Ranger result Call: ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~19L, x), num.trees = ~100, min.node.size = min_rows(~3L, x), importance = ~"impurity", num.threads = 1, verbose = FALSE, seed = sample.int(10^5, 1)) Type: Regression Number of trees: 100 Sample size: 195 Number of independent variables: 22 Mtry: 19 Target node size: 3 Variable importance mode: impurity Splitrule: variance OOB prediction error (MSE): 0.7477837 R squared (OOB): 0.9062111
imp <- extract_fit_parsnip(finalmodel) |> vip::vip() imp
final_pred <- terra::predict(predictors, finalmodel, na.rm = TRUE) plot(final_pred)
Zona de aplicabilitate
Waywiser Pachetul oferă un set de instrumente pentru evaluarea modelelor spațiale, inclusiv o implementare a evaluării pe mai multe scări și a zonei de aplicabilitate. Zona de aplicabilitate este o măsură a cât de bine poate fi aplicat modelul (având în vedere datele de instruire) la datele de predicție. Poate fi calculat cu ww_area_of_applicability()
funcționare și apoi a prezis pe raster cu terra::predict()
.
model_aoa <- waywiser::ww_area_of_applicability( st_drop_geometry(trainDat(, predictor_names)), importance = vip::vi_model(finalmodel) ) AOA <- terra::predict(predictors, model_aoa) plot(AOA$aoa)
Mai multe informații despre Waywiser Pachetul poate fi găsit în documentația sa.
Rezumat
Această postare pe blog a arătat cum să folosești Tidymodels Cadru pentru învățarea spațială a mașinilor. Am demonstrat cum să antrenez un model forestier aleatoriu, să efectuăm validarea spațială, să regleze hiperparametre și să evaluăm aria de aplicabilitate. De asemenea, am arătat cum să vizualizăm rezultatele și să extragem importanța variabilă.1
Tidymodels Cadru cu pachetele sale Spațial -eșantion şi Waywiser Oferă o modalitate puternică și flexibilă de a efectua învățarea spațială a mașinilor în R. În același timp, este ceva mai complexă decât semn de omisiune: necesită să vă familiarizați cu mai multe pachete2 și relațiile dintre ei. Astfel, decizia care trebuie utilizată depinde de nevoile și preferințele specifice ale utilizatorului.
Această postare pe blog a fost scrisă inițial ca supliment la afișul „Un inventar al pachetelor de învățare automată spațială în R” prezentat la Conferința Fossgis 2025 din Muenster, Germania. Afișul este disponibil la https://doi.org/10.5281/zenodo.15088973.
Reutilizați
Citare
Citarea Bibtex:
@online{meyer2025, author = {Meyer, Hanna and Nowosad, Jakub}, title = {Spatial Machine Learning with the Tidymodels Framework}, date = {2025-05-28}, url = {https://geocompx.org/post/2025/sml-bp3/}, langid = {en} }
Pentru atribuire, vă rugăm să citați această lucrare ca:
Meyer, Hanna și Jakub Nowosad. 2025. „Învățarea spațială a mașinilor cu cadrul TidyModels.” 28 mai 2025. Https://geocompx.org/post/2025/sml-bp3/.