Случайная лесная регрессия не предсказывает выше, чем данные обучения

12

Я заметил, что при построении моделей регрессии случайных лесов, по крайней мере, в R, прогнозируемое значение никогда не превышает максимальное значение целевой переменной, видимое в данных обучения. В качестве примера см. Код ниже. Я строю регрессионную модель для прогнозирования mpgна основе mtcarsданных. Я строю модели OLS и случайных лесов и использую их для прогнозирования mpgгипотетического автомобиля, который должен иметь очень хорошую экономию топлива. Как mpgи ожидалось, OLS прогнозирует высокий уровень , а случайный лес - нет. Я заметил это и в более сложных моделях. Почему это?

> library(datasets)
> library(randomForest)
> 
> data(mtcars)
> max(mtcars$mpg)
[1] 33.9
> 
> set.seed(2)
> fit1 <- lm(mpg~., data=mtcars) #OLS fit
> fit2 <- randomForest(mpg~., data=mtcars) #random forest fit
> 
> #Hypothetical car that should have very high mpg
> hypCar <- data.frame(cyl=4, disp=50, hp=40, drat=5.5, wt=1, qsec=24, vs=1, am=1, gear=4, carb=1)
> 
> predict(fit1, hypCar) #OLS predicts higher mpg than max(mtcars$mpg)
      1 
37.2441 
> predict(fit2, hypCar) #RF does not predict higher mpg than max(mtcars$mpg)
       1 
30.78899 
Гаурав Бансал
источник
Часто ли люди называют линейные регрессии МНК? Я всегда думал об OLS как о методе.
Хао Е
1
Я полагаю, что OLS является методом линейной регрессии по умолчанию, по крайней мере, в R.
Gaurav Bansal
Для случайных деревьев / лесов прогнозы представляют собой среднее значение обучающих данных в соответствующем узле. Таким образом, он не может быть больше, чем значения в данных обучения.
Джейсон
1
Я согласен, но на него ответили как минимум еще три пользователя.
HelloWorld

Ответы:

12

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

Экстраполяция со случайным лесом и линейной регрессией

tuomastik
источник
16

В случайный лес нет способа экстраполировать, как это делает OLS. Причина проста: предсказания из случайного леса осуществляются путем усреднения результатов, полученных на нескольких деревьях. Сами деревья выводят среднее значение отсчетов в каждом терминальном узле, листья. Результат не может быть вне диапазона обучающих данных, потому что среднее всегда находится в диапазоне его составляющих.

Другими словами, невозможно, чтобы среднее значение было больше (или ниже), чем для каждой выборки, а регрессии случайных лесов основаны на усреднении.

поджигатель
источник
11

Деревья решений / Random Forrest не могут экстраполировать за пределы данных обучения. И хотя OLS может это сделать, к таким прогнозам следует относиться с осторожностью; поскольку выявленная картина не может продолжаться за пределами наблюдаемого диапазона.

B.Frost
источник