Comme cela a déjà été mentionné dans les réponses précédentes, la forêt aléatoire pour les arbres de régression / régression ne produit pas de prédictions attendues pour les points de données au-delà de la portée de la plage de données de formation car ils ne peuvent pas (bien) extrapoler. Un arbre de régression se compose d'une hiérarchie de nœuds, où chaque nœud spécifie un test à effectuer sur une valeur d'attribut et chaque nœud feuille (terminal) spécifie une règle pour calculer une sortie prédite. Dans votre cas, l'observation des tests circule à travers les arbres jusqu'aux nœuds foliaires indiquant, par exemple, "si x> 335, alors y = 15", qui sont ensuite moyennés par forêt aléatoire.
Voici un script R visualisant la situation avec une forêt aléatoire et une régression linéaire. Dans le cas d'une forêt aléatoire, les prédictions sont constantes pour tester des points de données qui sont soit inférieurs à la valeur x des données d'entraînement les plus faibles, soit supérieurs à la valeur x des données d'entraînement les plus élevées.
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()