(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 prima parte a unei serii de postări pe blog despre învățarea mașinilor spațiale cu R.
Limba R are o varietate de pachete pentru învățare automată, iar multe dintre ele pot fi utilizate pentru sarcini de învățare automată într -un context spațial (Învățarea spațială a mașinilor) Învățarea spațială a mașinilor este, în general, diferită de învățarea tradițională a mașinilor, deoarece variabilele situate mai aproape una de cealaltă sunt adesea mai asemănătoare decât cele situate mai departe. Astfel, trebuie să luăm în considerare asta atunci când construim modele de învățare automată.
În această postare pe blog, comparăm trei dintre cele mai populare cadre de învățare automată din R: semn de omisiune, Tidymodelsși MLR3. Folosim un exemplu simplu pentru a demonstra modul de utilizare a acestor cadre pentru o sarcină spațială de învățare a mașinilor și cum diferă fluxurile lor de lucru. Scopul de aici este de a oferi un sens general al modului în care arată fluxul de lucru al învățării mașinilor spațiale și cum pot fi utilizate cadre diferite pentru a atinge același obiectiv.
Sarcina noastră este să prezicem temperatura în Spania folosind un set de covariate. Avem două seturi de date în acest scop: primul, temperature_train
conține măsurătorile temperaturii din 195 de locații din Spania și a doua, predictor_stack
conține covariatele pe care le vom folosi pentru a prezice temperatura. Aceste covariate includ variabile precum densitatea populației (popdens
), distanța de coastă (coast
) și altitudine (elev
), printre altele.
library(terra) library(sf) train_points <- sf::read_sf("https://github.com/LOEK-RS/FOSSGIS2025-examples/raw/refs/heads/main/data/temp_train.gpkg") predictor_stack <- terra::rast("https://github.com/LOEK-RS/FOSSGIS2025-examples/raw/refs/heads/main/data/predictors.tif")
Folosim un subset de paisprezece dintre covariatele disponibile pentru a prezice temperatura. Dar înainte de a face acest lucru, pentru a ne pregăti datele pentru modelare, trebuie să extragem valorile covariate în locațiile punctelor noastre de antrenament.
predictor_names <- names(predictor_stack)(1:14) temperature_train <- terra::extract(predictor_stack((predictor_names)), train_points, bind = TRUE ) |> sf::st_as_sf()
Acum, al nostru temperature_train
Setul de date conține măsurătorile temperaturii și valorile covariate la fiecare locație și este gata de modelare.
Utilizarea fiecăruia dintre cadre necesită încărcarea pachetelor respective.
library(caret) # for modeling library(blockCV) # for spatial cross-validation library(CAST) # for area of applicability
library(tidymodels) # metapackage for modeling library(spatialsample) # for spatial cross-validation library(waywiser) # for area of applicability library(vip) # for variable importance (used in AOA)
library(mlr3verse) # metapackage for mlr3 modeling library(mlr3spatiotempcv) # for spatial cross-validation library(CAST) # for area of applicability lgr::get_logger("mlr3")$set_threshold("warn")
Fiecare dintre cadre are propriul mod de a configura fluxul de lucru de modelare. Aceasta poate include definirea modelului, metoda de eșantionare și valorile hiperparameterului1. În acest exemplu, folosim modele de pădure aleatorii, astfel cum sunt implementate în Ranger Pachet cu următoarele hiperparametre:
mtry
: Numărul de variabile eșantionate aleatoriu ca candidați la fiecare divizare de 8splitrule
: regula de divizare a"extratrees"
min.node.size
: dimensiunea minimă a nodurilor terminale de 5
De asemenea, folosim o metodă spațială de validare încrucișată cu 5 ori. Înseamnă că datele sunt împărțite în multe blocuri spațiale și fiecare bloc este atribuit unui pli. Modelul este instruit pe un set de blocuri aparținând setului de instruire și evaluat pe blocurile rămase. Rețineți că fiecare cadru are propriul mod de a defini metoda de eșantionare și, prin urmare, implementarea și pliurile pot diferi ușor.
Pentru semn de omisiuneDefinim grila hiperparameterului folosind expand.grid()
Funcția și metoda de eșantionare folosind trainControl()
funcţie. În acest caz, pentru a folosi validarea spațială, folosim blockCV
pachet pentru a crea pliurile, apoi treceți -le la trainControl()
funcţie.
set.seed(22) # hyperparameters tn_grid = expand.grid( mtry = 8, splitrule = "extratrees", min.node.size = 5 ) # resampling spatial_blocks <- blockCV::cv_spatial( temperature_train, k = 5, hexagon = FALSE, progress = FALSE )
train test 1 155 40 2 160 35 3 155 40 4 154 41 5 156 39
train_ids <- lapply(spatial_blocks$folds_list, function(x) x((1))) test_ids <- lapply(spatial_blocks$folds_list, function(x) x((2))) tr_control <- caret::trainControl( method = "cv", index = train_ids, indexOut = test_ids, savePredictions = TRUE )
În Tidymodelspașii sunt:
- Specificați formula de modelare folosind
recipe()
funcţie. - Definiți modelul folosind o funcție din păstârnac Pachet, inclusiv hiperparametre.
- Creați un flux de lucru folosind
workflow()
Funcție, care combină rețeta și modelul. - Definiți metoda de eșantionare folosind
spatial_block_cv()
Funcție din Spațial -eșantion pachet.
set.seed(22) form <- as.formula(paste0("temp ~ ", paste(predictor_names, collapse = " + "))) recipe <- recipes::recipe(form, data = temperature_train) rf_model <- parsnip::rand_forest( trees = 100, mtry = 8, min_n = 5, mode = "regression" ) |> set_engine("ranger", splitrule = "extratrees", importance = "impurity") workflow <- workflows::workflow() |> workflows::add_recipe(recipe) |> workflows::add_model(rf_model) block_folds <- spatialsample::spatial_block_cv(temperature_train, v = 5) spatialsample::autoplot(block_folds)
De bază MLR3 Pașii sunt conectați la terminologia sa:
- Sarcină: Definiți sarcina folosind
as_task_regr_st()
Funcție, care specifică variabila țintă și datele. - Elev: Definiți modelul folosind
lrn()
Funcție, care specifică tipul de model și hiperparametre. - Reeșantionarea: Definiți metoda de eșantionare folosind
rsmp()
Funcție, care specifică tipul de eșantionare și numărul de pliuri. Aici, folosimspcv_block
Metoda de eșantionare.
set.seed(22) task <- mlr3spatiotempcv::as_task_regr_st(temperature_train, target = "temp") learner <- mlr3::lrn("regr.ranger", num.trees = 100, importance = "impurity", mtry = 8, min.node.size = 5, splitrule = "extratrees" ) resampling <- mlr3::rsmp("spcv_block", folds = 5, cols = 10, rows = 10)
Funcția principală a semn de omisiune Pachetul este train()
care ia formula, datele, tipul modelului, rețeaua de reglare, controlul de instruire (inclusiv metoda de eșantionare) și alte alte argumente (de exemplu, numărul de copaci). train()
Funcția va efectua automat reglarea de eșantionare și hiperparameter (dacă este cazul). Modelul final este stocat în finalModel
obiect.
model_caret <- caret::train( temp ~ ., data = st_drop_geometry(temperature_train), method = "ranger", tuneGrid = tn_grid, trControl = tr_control, num.trees = 100, importance = "impurity" ) model_caret_final <- model_caret$finalModel
În TidymodelsThe fit_resamples()
Funcția ia fluxul de lucru definit anterior și pliurile de eșantionare. Aici, folosim și control
Argument pentru a salva predicțiile și fluxul de lucru, care poate fi util pentru analiza ulterioară. fit_best()
Funcția este utilizată pentru a se potrivi celui mai bun model pe baza rezultatelor de eșantionare.
rf_spatial <- tune::fit_resamples( workflow, resamples = block_folds, control = tune::control_resamples(save_pred = TRUE, save_workflow = TRUE) ) model_tidymodels <- fit_best(rf_spatial)
MLR3 Fluxul de lucru aplică resample()
Funcționați la sarcină, elev și metoda de eșantionare. Apoi, pentru a obține modelul final, folosim train()
Funcție pe sarcina și elevul definit anterior.
model_mlr3 <- mlr3::resample( task = task, learner = learner, resampling = resampling ) learner$train(task)
După ce modelele sunt instruite, dorim să le evaluăm performanța. Aici, folosim două dintre cele mai frecvente valori pentru sarcini de regresie: eroarea pătrată medie (RMSE) și coeficientul de determinare (r2)
RMSE și R.2 sunt calculate implicit în semn de omisiune. Valorile de performanță sunt apoi stocate în results
obiect al modelului.
model_caret$results
mtry splitrule min.node.size RMSE Rsquared MAE RMSESD 1 8 extratrees 5 1.119936 0.8406388 0.9008884 0.2269326 RsquaredSD MAESD 1 0.06159361 0.1399976
RMSE și R.2 sunt calculate implicit în Tidymodels. Valorile de performanță sunt extrase din rezultatele de eșantionare folosind collect_metrics()
funcţie.
tune::collect_metrics(rf_spatial)
# A tibble: 2 × 6 .metric .estimator mean n std_err .config1 rmse standard 1.10 5 0.0903 Preprocessor1_Model1 2 rsq standard 0.858 5 0.0424 Preprocessor1_Model1
Trebuie să specificăm măsurile pe care dorim să le calculăm folosind msr()
funcţie. Apoi, aggregate()
Metoda este utilizată pentru a calcula valorile de performanță selectate.
my_measures <- c(mlr3::msr("regr.rmse"), mlr3::msr("regr.rsq")) model_mlr3$aggregate(measures = my_measures)
regr.rmse rsq 1.1391701 0.8209292
Scopul nostru este să prezicem temperatura în Spania folosind covariatele din predictor_stack
set de date. Astfel, dorim să obținem o hartă a valorilor de temperatură prevăzute pentru întreaga țară. predict()
Funcția Terra Pachetul face predicții model pe noile date raster.
Zona de aplicabilitate (AOA) este o metodă pentru a evalua care este zona spațiului de intrare care este similar cu datele de instruire. Este un instrument util pentru a evalua performanța modelului și pentru a identifica zonele în care modelul poate fi aplicat. Zonele din afara AOA sunt considerate a fi în afara domeniului de aplicabilitate al modelului și, astfel, predicțiile din aceste zone ar trebui interpretate cu prudență sau deloc utilizată.
Implementarea inițială a metodei AOA este în Distribuire Pachet – un pachet care extinde semn de omisiune pachet. AOA este calculat folosind aoa()
Funcție, care ia noile date (covariatele) și modelul ca intrare.
AOA_caret <- CAST::aoa( newdata = predictor_stack, model = model_caret, verbose = FALSE ) plot(AOA_caret$AOA)
Waywiser Pachetul implementează metoda AOA pentru Tidymodels2. ww_area_of_applicability()
Funcția ia datele de instruire și importanța variabilă ca intrare. Apoi, pentru a obține AOA, folosim predict()
Funcție din Terra pachet.3
model_aoa <- waywiser::ww_area_of_applicability( st_drop_geometry(temperature_train(, predictor_names)), importance = vip::vi_model(model_tidymodels) ) AOA_tidymodels <- terra::predict(predictor_stack, model_aoa) plot(AOA_tidymodels$aoa)
Distribuire Pachetul poate calcula AOA pentru MLR3 modele. Cu toate acestea, atunci trebuie să specificăm diverse argumente, cum ar fi un raster cu covariate, datele de instruire, variabilele care urmează să fie utilizate, greutățile variabilelor și pliurile de validare încrucișată.
rsmp_cv <- resampling$instantiate(task) AOA_mlr3 <- CAST::aoa( newdata = predictor_stack, train = as.data.frame(task$data()), variables = task$feature_names, weight = data.frame(t(learner$importance())), CVtest = rsmp_cv$instance(order(row_id))$fold, verbose = FALSE ) plot(AOA_mlr3$AOA)
În această postare pe blog, am comparat trei dintre cele mai populare cadre de învățare automată din R: semn de omisiune, Tidymodelsși MLR3. Am demonstrat cum să utilizăm aceste cadre pentru o sarcină spațială de învățare automată, inclusiv specificația modelului, instruirea, evaluarea, predicția și obținerea zonei de aplicabilitate.
Există o mulțime de suprapuneri în funcționalitatea între cele trei cadre. Simultan, cadrele diferă în filozofia și implementarea lor de proiectare. Unii, ca semn de omisiunesunt mai concentrați pe furnizarea unei interfețe consistente și concise, dar oferă o flexibilitate limitată. Alții, ca Tidymodels şi MLR3sunt mai modulare și mai flexibile, permițând fluxuri de lucru și personalizări mai complexe, ceea ce le face, de asemenea, mai complexe de învățat și de utilizare.
Multe etape suplimentare pot fi adăugate la fluxul de lucru prezentat, cum ar fi ingineria caracteristicilor, selecția variabilă, reglarea hiperparameterului, interpretarea modelului și multe altele. În următoarele postări de pe blog, vom arăta mai detaliat aceste trei cadre, și apoi vom prezenta și alte pachete care pot fi utilizate pentru învățarea spațială a mașinilor în R.
Reutilizați
Citare
Citarea Bibtex:
@online{nowosad2025, author = {Nowosad, Jakub}, title = {Spatial Machine Learning with {R:} Caret, Tidymodels, and Mlr3}, date = {2025-04-30}, url = {https://geocompx.org/post/2025/sml-bp1/}, langid = {en} }
Pentru atribuire, vă rugăm să citați această lucrare ca:
Nowosad, Jakub. 2025. „Învățarea spațială a mașinilor cu R: Caret, Tidymodels și MLR3.” 30 aprilie 2025. Https://geocompx.org/post/2025/sml-bp1/.