ランダムフォレストの回帰がトレーニングデータよりも高いと予測しない


12

少なくともでR、ランダムフォレスト回帰モデルを構築するとき、予測値がトレーニングデータにあるターゲット変数の最大値を決して超えないことに気づきました。例として、以下のコードを参照してください。データにmpg基づいて予測する回帰モデルを構築していmtcarsます。私はOLSとランダムフォレストモデルを構築し、それらを使用しmpgて、非常に優れた燃費が必要な仮想車を予測します。OLSは予想mpgどおり高いを予測しますが、ランダムフォレストは予測しません。もっと複雑なモデルでもこれに気づきました。どうしてこれなの?

> 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と呼ぶのは一般的ですか?私は常にOLSを方法として考えてきました。
Hao Ye

1
私は、少なくともR.で、OLSは、線形回帰のデフォルトの方法であると考えている
のGaurav Bansalは

ランダムなツリー/フォレストの場合、予測は対応するノードのトレーニングデータの平均です。したがって、トレーニングデータの値より大きくすることはできません。
ジェイソン

1
同意しますが、少なくとも3人のユーザーから回答を得ています。
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()

ランダムフォレストと線形回帰による外挿


16

OLSのようにランダムフォレストに外挿する方法はありません。理由は単純です。ランダムフォレストからの予測は、いくつかのツリーで得られた結果を平均することによって行われます。ツリー自体は、各末端ノードであるリーフのサンプルの平均値を出力します。平均は常にその構成要素の範囲内にあるため、結果がトレーニングデータの範囲外になることはありません。

つまり、平均をすべてのサンプルより大きく(または低く)することは不可能であり、ランダムフォレストの回帰は平均化に基づいています。


11

Decision Trees / Random Forrestはトレーニングデータの外を推定できません。そして、OLSはこれを行うことができますが、そのような予測は注意して見る必要があります。識別されたパターンが観測範囲外に続くことはないためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.