Как уже упоминалось в предыдущих ответах, случайный лес для деревьев регрессии / регрессии не дает ожидаемых прогнозов для точек данных, выходящих за рамки диапазона обучающих данных, поскольку они не могут экстраполировать (хорошо). Дерево регрессии состоит из иерархии узлов, где каждый узел задает тест, который необходимо выполнить для значения атрибута, а каждый конечный (конечный) узел задает правило для расчета прогнозируемого результата. В вашем случае тестовое наблюдение проходит через деревья к конечным узлам с указанием, например, «если x> 335, то y = 15», которые затем усредняются по случайному лесу.
Вот скрипт R, визуализирующий ситуацию как со случайным лесом, так и с линейной регрессией. В случае случайного леса прогнозы являются постоянными для тестирования точек данных, которые либо ниже самого низкого значения x обучающих данных, либо выше самого высокого значения x обучающих данных.
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()