La regressione casuale delle foreste non prevede valori superiori ai dati di allenamento


12

Ho notato che quando si creano modelli di regressione della foresta casuali, almeno in R, il valore previsto non supera mai il valore massimo della variabile target visualizzata nei dati di allenamento. Ad esempio, vedi il codice qui sotto. Sto costruendo un modello di regressione da prevedere in mpgbase ai mtcarsdati. Costruisco modelli OLS e forestali casuali e li utilizzo per prevedere mpgun'auto ipotetica che dovrebbe avere un ottimo risparmio di carburante. L'OLS prevede un picco mpg, come previsto, ma la foresta casuale no. L'ho notato anche in modelli più complessi. Perchè è questo?

> library(datasets)
> library(randomForest)
> 
> data(mtcars)
> max(mtcars$mpg)
[1] 33.9
> 
> set.seed(2)
> fit1 <- lm(mpg~., data=mtcars) #OLS fit
> fit2 <- randomForest(mpg~., data=mtcars) #random forest fit
> 
> #Hypothetical car that should have very high mpg
> hypCar <- data.frame(cyl=4, disp=50, hp=40, drat=5.5, wt=1, qsec=24, vs=1, am=1, gear=4, carb=1)
> 
> predict(fit1, hypCar) #OLS predicts higher mpg than max(mtcars$mpg)
      1 
37.2441 
> predict(fit2, hypCar) #RF does not predict higher mpg than max(mtcars$mpg)
       1 
30.78899 

È comune che le persone si riferiscano alle regressioni lineari come OLS? Ho sempre pensato all'OLS come a un metodo.
Hao Ye,

1
Credo che OLS sia il metodo predefinito di regressione lineare, almeno in R.
Gaurav Bansal,

Per alberi / foreste casuali, le previsioni sono la media dei dati di addestramento nel nodo corrispondente. Quindi non può essere più grande dei valori nei dati di allenamento.
Jason,

1
Sono d'accordo, ma è stato risposto da almeno altri tre utenti.
HelloWorld,

Risposte:


12

Come è già stato menzionato nelle risposte precedenti, la foresta casuale per gli alberi di regressione / regressione non produce previsioni previste per i punti dati al di fuori dell'ambito dell'intervallo di dati di addestramento perché non possono estrapolare (bene). Un albero di regressione è costituito da una gerarchia di nodi, in cui ciascun nodo specifica un test da eseguire su un valore di attributo e ciascun nodo foglia (terminale) specifica una regola per calcolare un output previsto. Nel tuo caso l'osservazione del test scorre attraverso gli alberi verso i nodi fogliari indicando, ad esempio, "se x> 335, quindi y = 15", che vengono quindi mediati da una foresta casuale.

Ecco uno script R che visualizza la situazione con sia la foresta casuale che la regressione lineare. Nel caso della foresta casuale, le previsioni sono costanti per testare i punti dati che sono al di sotto del valore x dei dati di allenamento più basso o al di sopra del valore x dei dati di allenamento più alti.

library(datasets)
library(randomForest)
library(ggplot2)
library(ggthemes)

# Import mtcars (Motor Trend Car Road Tests) dataset
data(mtcars)

# Define training data
train_data = data.frame(
    x = mtcars$hp,  # Gross horsepower
    y = mtcars$qsec)  # 1/4 mile time

# Train random forest model for regression
random_forest <- randomForest(x = matrix(train_data$x),
                              y = matrix(train_data$y), ntree = 20)
# Train linear regression model using ordinary least squares (OLS) estimator
linear_regr <- lm(y ~ x, train_data)

# Create testing data
test_data = data.frame(x = seq(0, 400))

# Predict targets for testing data points
test_data$y_predicted_rf <- predict(random_forest, matrix(test_data$x)) 
test_data$y_predicted_linreg <- predict(linear_regr, test_data)

# Visualize
ggplot2::ggplot() + 
    # Training data points
    ggplot2::geom_point(data = train_data, size = 2,
                        ggplot2::aes(x = x, y = y, color = "Training data")) +
    # Random forest predictions
    ggplot2::geom_line(data = test_data, size = 2, alpha = 0.7,
                       ggplot2::aes(x = x, y = y_predicted_rf,
                                    color = "Predicted with random forest")) +
    # Linear regression predictions
    ggplot2::geom_line(data = test_data, size = 2, alpha = 0.7,
                       ggplot2::aes(x = x, y = y_predicted_linreg,
                                    color = "Predicted with linear regression")) +
    # Hide legend title, change legend location and add axis labels
    ggplot2::theme(legend.title = element_blank(),
                   legend.position = "bottom") + labs(y = "1/4 mile time",
                                                      x = "Gross horsepower") +
    ggthemes::scale_colour_colorblind()

Estrapolando con foresta casuale e regressione lineare


16

Non c'è modo di estrapolare una foresta casuale come fa un OLS. Il motivo è semplice: le previsioni da una foresta casuale vengono fatte attraverso la media dei risultati ottenuti in diversi alberi. Gli alberi stessi producono il valore medio dei campioni in ciascun nodo terminale, le foglie. È impossibile che il risultato sia al di fuori dell'intervallo dei dati di addestramento, poiché la media è sempre all'interno dell'intervallo dei suoi componenti.

In altre parole, è impossibile che una media sia maggiore (o inferiore) di ogni campione e le regressioni delle foreste casuali si basano sulla media.


11

Gli alberi decisionali / Forrest casuale non possono estrapolare al di fuori dei dati di allenamento. E sebbene OLS possa farlo, tali previsioni dovrebbero essere esaminate con cautela; poiché il modello identificato potrebbe non continuare al di fuori dell'intervallo osservato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.