Como já foi mencionado nas respostas anteriores, a floresta aleatória para árvores de regressão / regressão não produz previsões esperadas para pontos de dados além do escopo do intervalo de dados de treinamento porque eles não podem extrapolar (bem). Uma árvore de regressão consiste em uma hierarquia de nós, em que cada nó especifica um teste a ser executado em um valor de atributo e cada nó folha (terminal) especifica uma regra para calcular uma saída prevista. No seu caso, a observação de teste flui através das árvores para os nós das folhas indicando, por exemplo, "se x> 335, então y = 15", que são então calculados pela floresta aleatória.
Aqui está um script R que visualiza a situação com floresta aleatória e regressão linear. No caso de floresta aleatória, as previsões são constantes para testar pontos de dados que estão abaixo do valor x mais baixo dos dados de treinamento ou acima do valor x mais alto dos dados de treinamento.
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()