Losowa regresja lasu nieprzewidywalna na podstawie danych treningowych

12

Zauważyłem, że przy budowaniu modeli regresji losowej lasu, przynajmniej w R, przewidywana wartość nigdy nie przekracza maksymalnej wartości zmiennej docelowej widocznej w danych treningowych. Jako przykład zobacz poniższy kod. Buduję model regresji do przewidywania mpgna podstawie mtcarsdanych. Buduję OLS i losowe modele leśne i używam ich do przewidywania mpghipotetycznego samochodu, który powinien mieć bardzo dobre zużycie paliwa. OLS przewiduje wysoki mpg, zgodnie z oczekiwaniami, ale losowy las nie. Zauważyłem to również w bardziej złożonych modelach. Dlaczego to?

> 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 
Gaurav Bansal
źródło
Czy często zdarza się, że ludzie nazywają regresje liniowe OLS? Zawsze myślałem o OLS jako metodzie.
Hao Ye,
1
Uważam, że OLS jest domyślną metodą regresji liniowej, przynajmniej w R.
Gaurav Bansal
Dla losowych drzew / lasów prognozy są średnią danych treningowych w odpowiednim węźle. Dlatego nie może być większy niż wartości w danych treningowych.
Jason
1
Zgadzam się, ale na co najmniej trzech innych użytkowników odpowiedziało.
HelloWorld,

Odpowiedzi:

12

Jak wspomniano już w poprzednich odpowiedziach, losowy las dla drzew regresji / regresji nie generuje oczekiwanych prognoz dla punktów danych poza zakresem danych treningowych, ponieważ nie mogą one ekstrapolować (dobrze). Drzewo regresji składa się z hierarchii węzłów, gdzie każdy węzeł określa test, który ma zostać przeprowadzony na wartości atrybutu, a każdy liść (terminal) węzła określa regułę obliczania przewidywanego wyniku. W twoim przypadku obserwacja testowa przepływa przez drzewa do węzłów liści stwierdzając np. „Jeśli x> 335, to y = 15”, które są następnie uśredniane przez losowy las.

Oto skrypt R wizualizujący sytuację z losową regresją leśną i liniową. W przypadku losowego lasu prognozy są stałe dla testowania punktów danych, które są albo poniżej najniższej wartości x danych treningowych, albo powyżej najwyższej wartości treningowej wartości 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()

Ekstrapolacja za pomocą losowej regresji leśnej i liniowej

tuomastik
źródło
16

Losowy las nie ma możliwości ekstrapolacji tak, jak robi to OLS. Powód jest prosty: prognozy z Losowego lasu dokonuje się poprzez uśrednienie wyników uzyskanych w kilku drzewach. Same drzewa generują średnią wartość próbek w każdym węźle końcowym, liściach. Wynik nie może znajdować się poza zakresem danych treningowych, ponieważ średnia jest zawsze w zakresie jego składników.

Innymi słowy, niemożliwe jest, aby średnia była większa (lub niższa) niż każda próbka, a regresje losowych lasów oparte są na uśrednieniu.

Firebug
źródło
11

Drzewa decyzyjne / Random Forrest nie mogą dokonywać ekstrapolacji poza danymi treningowymi. I chociaż OLS może to zrobić, na takie prognozy należy spojrzeć ostrożnie; ponieważ zidentyfikowany wzór może nie kontynuować poza obserwowany zakres.

B.Frost
źródło