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