Як вже було сказано в попередніх відповідях, випадковий ліс для дерев регресії / регресії не дає очікуваних прогнозів для точок даних, що виходять за межі діапазону даних про навчання, оскільки вони не можуть екстраполювати (добре). Дерево регресії складається з ієрархії вузлів, де кожен вузол визначає тест, який слід здійснити на значення атрибута, а кожен вузол листа (терміналу) визначає правило для обчислення прогнозованого виходу. У вашому випадку тестування спостереження протікає через дерева до листяних вузлів, вказуючи, наприклад, "якщо x> 335, то y = 15", які потім усереднюються випадковим лісом.
Ось сценарій R, який візуалізує ситуацію як з випадковим лісом, так і з лінійною регресією. У випадковому випадку лісу прогнози є постійними для тестування точок даних, які або нижче найнижчого значення х навчальних даних, або вище найвищого значення навчальних даних.
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()