La regresión forestal aleatoria no predice más que los datos de entrenamiento

12

Me di cuenta de que al construir modelos de regresión forestal aleatorios, al menos en R, el valor predicho nunca excede el valor máximo de la variable objetivo que se ve en los datos de entrenamiento. Como ejemplo, vea el código a continuación. Estoy construyendo un modelo de regresión para predecir en mpgfunción de los mtcarsdatos. Construyo OLS y modelos forestales aleatorios, y los uso para predecir mpgun automóvil hipotético que debería tener muy buena economía de combustible. El OLS predice un nivel alto mpg, como se esperaba, pero el bosque aleatorio no. También he notado esto en modelos más complejos. ¿Por qué es esto?

> 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 
Gaurav Bansal
fuente
¿Es común que las personas se refieran a las regresiones lineales como OLS? Siempre he pensado en OLS como un método.
Hao Ye
1
Creo que OLS es el método predeterminado de regresión lineal, al menos en R.
Gaurav Bansal
Para árboles / bosques aleatorios, las predicciones son el promedio de los datos de entrenamiento en el nodo correspondiente. Por lo tanto, no puede ser mayor que los valores en los datos de entrenamiento.
Jason
1
Estoy de acuerdo, pero ha sido respondido por al menos otros tres usuarios.
HolaMundo

Respuestas:

12

Como ya se mencionó en respuestas anteriores, el bosque aleatorio para árboles de regresión / regresión no produce predicciones esperadas para puntos de datos más allá del alcance del rango de datos de capacitación porque no pueden extrapolar (bueno). Un árbol de regresión consiste en una jerarquía de nodos, donde cada nodo especifica una prueba para llevar a cabo en un valor de atributo y cada nodo hoja (terminal) especifica una regla para calcular una salida pronosticada. En su caso, la observación de prueba fluye a través de los árboles hasta los nodos de las hojas, indicando, por ejemplo, "si x> 335, entonces y = 15", que luego se promedian por bosque aleatorio.

Aquí hay un script R que visualiza la situación con bosque aleatorio y regresión lineal. En el caso de un bosque aleatorio, las predicciones son constantes para los puntos de datos de prueba que están por debajo del valor x de datos de entrenamiento más bajo o por encima del valor x de datos de entrenamiento más alto.

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()

Extrapolando con bosque aleatorio y regresión lineal

tuomastik
fuente
16

No hay forma de que un bosque aleatorio se extrapole como lo hace un OLS. La razón es simple: las predicciones de un bosque aleatorio se realizan promediando los resultados obtenidos en varios árboles. Los propios árboles generan el valor medio de las muestras en cada nodo terminal, las hojas. Es imposible que el resultado esté fuera del rango de los datos de entrenamiento, porque el promedio siempre está dentro del rango de sus componentes.

En otras palabras, es imposible que un promedio sea mayor (o menor) que cada muestra, y las regresiones de los bosques aleatorios se basan en el promedio.

Firebug
fuente
11

Los árboles de decisión / Forrest aleatorio no pueden extrapolar fuera de los datos de entrenamiento. Y aunque OLS puede hacer esto, tales predicciones deben considerarse con precaución; ya que el patrón identificado puede no continuar fuera del rango observado.

B. escarcha
fuente