Random forest con ranger
Addestri modelli random forest, ottimizzi mtry e ntrees e valuti l'errore OOB
Random forest con ranger è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.
Che cos'è una random forest?
Una random forest costruisce molti alberi decisionali su campioni bootstrap dei dati, quindi calcola la media delle loro previsioni (regressione) o applica un voto di maggioranza (classificazione). Il nome dell'ensemble deriva da due fonti di casualità: il campionamento bootstrap delle righe e la selezione casuale delle feature a ogni split.
library(ranger)
# Minimal random forest: 500 trees, auto mtry
rf <- ranger(
medv ~ .,
data = MASS::Boston,
num.trees = 500
)
print(rf)Il parametro mtry
mtry è il numero di feature considerate casualmente a ogni split. Utilizzare meno feature rispetto al totale rende gli alberi meno correlati tra loro e riduce la varianza. La regola empirica è mtry = sqrt(p) per la classificazione e mtry = p/3 per la regressione, dove p è il numero di predittori.
p <- ncol(MASS::Boston) - 1 # number of predictors
rf_class <- ranger(
Species ~ ., data = iris,
num.trees = 500,
mtry = floor(sqrt(4)) # sqrt(p) for classification
)
rf_reg <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = floor(p / 3) # p/3 for regression
)
cat('Classification OOB Error:', rf_class$prediction.error)
cat('Regression OOB RMSE:', sqrt(rf_reg$prediction.error))Errore OOB — Validazione gratuita
Poiché ogni albero viene addestrato su un campione bootstrap, circa un terzo delle osservazioni viene escluso (out-of-bag, OOB). Questi campioni OOB fungono da set di validazione integrato per ogni albero. L'errore OOB aggregato è una stima quasi non distorta dell'errore sul test set: non è necessario un set di validazione separato.
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = 4
)
# OOB MSE
cat('OOB MSE:', rf$prediction.error)
# OOB RMSE
cat('OOB RMSE:', sqrt(rf$prediction.error))
# For classification: OOB error rate
rf_cl <- ranger(Species ~ ., data = iris)
cat('OOB Error Rate:', rf_cl$prediction.error)Importanza delle variabili
Impostando importance = 'impurity' si registra la diminuzione totale dell'impurità dei nodi (Gini o MSE) per ogni feature in tutti gli alberi. Impostando importance = 'permutation' si misura la perdita di accuratezza quando ogni feature viene mescolata casualmente: questo metodo è più affidabile, ma più lento.
rf_imp <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
importance = 'impurity'
)
# Sorted importance scores
imp <- sort(rf_imp$variable.importance, decreasing = TRUE)
print(imp)
# Quick plot
barplot(imp, las = 2, col = 'steelblue',
main = 'Random Forest Variable Importance')Previsioni con ranger
Utilizzi predict(rf, data = test) per generare le previsioni. Il risultato è una lista; acceda alle previsioni con $predictions. Nella classificazione, per impostazione predefinita le previsioni sono livelli di un factor.
set.seed(1)
idx <- sample(nrow(MASS::Boston), 400)
train <- MASS::Boston[idx, ]
test <- MASS::Boston[-idx, ]
rf <- ranger(medv ~ ., data = train, num.trees = 500)
pred <- predict(rf, data = test)
test_rmse <- sqrt(mean((pred$predictions - test$medv)^2))
cat('Test RMSE:', round(test_rmse, 3))Concetto di matrice di confusione
Nella classificazione, una matrice di confusione mette in relazione tramite una tabella incrociata le classi effettive e quelle previste. Tra le metriche principali derivate vi sono accuratezza, precisione (TP / (TP + FP)), recall (TP / (TP + FN)) e punteggio F1. ranger fornisce direttamente la matrice di confusione OOB.
rf_cl <- ranger(
Species ~ ., data = iris,
num.trees = 500,
mtry = 2
)
# OOB confusion matrix
print(rf_cl$confusion.matrix)
# OOB error rate
cat('OOB Error Rate:', rf_cl$prediction.error)
# Manual accuracy on OOB predictions
# (1 - error rate)
cat('OOB Accuracy:', 1 - rf_cl$prediction.error)Ottimizzazione di mtry e num.trees
Un numero maggiore di alberi riduce sempre la varianza, fino a quando i benefici diventano marginali intorno a 300-500 alberi. Il parametro mtry ha un valore ottimale. Un semplice ciclo di ottimizzazione valuta l'errore OOB su una griglia di valori di mtry per trovare il valore ottimale senza ricorrere alla cross-validation.
mtry_vals <- c(2, 4, 6, 8, 10)
oob_errors <- sapply(mtry_vals, function(m) {
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 300, mtry = m
)
rf$prediction.error
})
best_mtry <- mtry_vals[which.min(oob_errors)]
cat('Best mtry:', best_mtry)
plot(mtry_vals, sqrt(oob_errors), type = 'b',
xlab = 'mtry', ylab = 'OOB RMSE')ranger per la classificazione
Per la classificazione, imposti probability = TRUE per ottenere le probabilità delle classi invece delle etichette rigide. Questo è necessario per calcolare la curva ROC e ottenere stime di probabilità calibrate, oltre a corrispondere al formato di output previsto dalle metriche di yardstick.
# Ensure the target is a factor
iris$Species <- as.factor(iris$Species)
rf_prob <- ranger(
Species ~ ., data = iris,
num.trees = 300,
probability = TRUE # output class probabilities
)
# Predictions are a matrix of probabilities
pred_prob <- predict(rf_prob, data = iris[1:5, ])
print(pred_prob$predictions)Parallelismo in ranger
ranger è progettato per garantire velocità e parallelismo. Imposti num.threads per utilizzare tutti i core della CPU disponibili. Questo può produrre notevoli accelerazioni rispetto al pacchetto randomForest precedente, soprattutto per dataset di grandi dimensioni con molti alberi.
# Use all available cores
rf_fast <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 1000,
mtry = 4,
num.threads = parallel::detectCores()
)
cat('Trees:', rf_fast$num.trees)
cat('Threads used:', rf_fast$num.threads)
cat('OOB RMSE:', sqrt(rf_fast$prediction.error))ranger tramite tidymodels
Può utilizzare ranger tramite l'interfaccia tidymodels, che offre una sintassi coerente e si integra con workflow, cross-validation e ottimizzazione. Specifichi il motore come 'ranger' e passi gli argomenti specifici del motore con set_engine().
library(parsnip)
library(workflows)
rf_spec <- rand_forest(
mtry = tune(),
trees = 500,
min_n = tune()
) |>
set_engine('ranger', importance = 'impurity') |>
set_mode('regression')
wf <- workflow() |>
add_recipe(rec) |>
add_model(rf_spec)
print(wf)Interpretazione dell'output di ranger
Il modello ranger stampato mostra: numero di alberi, variabile target, numero di feature utilizzate, errore di previsione OOB e R-quadro (per la regressione). Controlli sempre l'errore OOB come rapida verifica di plausibilità: se è estremamente basso su un dataset di grandi dimensioni, sospetti una fuga di dati.
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500, mtry = 4,
importance = 'impurity'
)
# Key output fields
cat('OOB MSE: ', rf$prediction.error, '\n')
cat('OOB RMSE: ', sqrt(rf$prediction.error), '\n')
cat('R-squared: ', rf$r.squared, '\n')
cat('Num trees: ', rf$num.trees, '\n')
cat('Num features: ', rf$num.independent.variables, '\n')Verifica rapida
In una random forest costruita con ranger, che cosa stima l'errore OOB (out-of-bag)?
Riepilogo delle random forest
Concetti chiave delle Random Forest con ranger:
- Le random forest combinano molti alberi costruiti su campioni bootstrap, con selezione casuale delle feature a ogni split.
mtry: sqrt(p) per la classificazione, p/3 per la regressione; ottimizzi questo parametro.- L'errore OOB fornisce una stima di validazione gratuita e quasi non distorta.
importance = 'impurity'o'permutation'fornisce i punteggi di importanza delle variabili.- Imposti
probability = TRUEper ottenere le probabilità delle classi nella classificazione. - ranger è altamente parallelizzato; utilizzi
num.threadsper i dataset di grandi dimensioni. - Si integri con tidymodels tramite
rand_forest() |> set_engine('ranger').
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = 4,
importance = 'impurity',
num.threads = parallel::detectCores()
)
cat('OOB RMSE:', sqrt(rf$prediction.error))
cat('R2:', rf$r.squared)
print(sort(rf$variable.importance, decreasing = TRUE))Domande Frequenti
La lezione «Random forest con ranger» è gratuita?
Sì — il testo completo di «Random forest con ranger» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.
Cosa imparerò in «Random forest con ranger»?
Addestri modelli random forest, ottimizzi mtry e ntrees e valuti l'errore OOB Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare R Academy?
Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Random forest con ranger»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione R Academy?
Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Alberi decisionali: la base degli ensemble
- Random forest con ranger
- Gradient boosting con xgboost
- Importanza delle feature e interpretazione dei modelli