実際、部分依存プロットで何を表示できるか理解できたと思っていましたが、非常に単純な仮説例を使用すると、かなり困惑しました。コードの次のチャンクに私は、3つの独立変数(生成、B、C)と1つの従属変数(Y付き)Cと密接な直線関係を示すYをしながら、そしてbは無相関であるY。Rパッケージを使用して、ブーストされた回帰ツリーで回帰分析を行います。gbm
a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
par(mfrow = c(2,2))
plot(gbm.gaus, i.var = 1)
plot(gbm.gaus, i.var = 2)
plot(gbm.gaus, i.var = 3)
驚くことではありませんが、変数aとbについて、部分依存プロットはaの平均の周りに水平線を生成します。私が困惑させているのは、変数cのプロットです。範囲c <40およびc > 60の水平線が表示され、y軸はyの平均に近い値に制限されます。以来、及びbはとは全く無関係であり、Y(従ってそこモデルにおける変数の重要度が0である)、私は期待Cをその値の非常に制限された範囲に対して、そのシグモイド形状の代わりにその範囲全体に沿って部分的な依存性を示します。Friedman(2001)「Greedy関数近似:勾配ブースティングマシン」およびHastie et al。(2011)「統計的学習の要素」。しかし、私の数学スキルは、その中のすべての方程式と式を理解するには低すぎます。したがって、私の質問:変数cの部分依存プロットの形状を決定するものは何ですか?(非数学者が理解できる言葉で説明してください!)
2014年4月17日に追加:
応答を待っている間、R-packageを使用した分析に同じサンプルデータを使用しましたrandomForest
。randomForestの部分依存プロットは、gbmプロットから予想したものにはるかに似ています。説明変数aとbの部分依存は、ランダムに50前後で変化しますが、説明変数cは、その範囲全体(およびほぼyの全範囲)。gbm
およびの部分依存プロットのこれらの異なる形状の理由は何randomForest
でしょうか?
ここで、プロットを比較する修正されたコード:
a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
library(randomForest)
rf.model <- randomForest(y ~ a + b + c, data = Data)
x11(height = 8, width = 5)
par(mfrow = c(3,2))
par(oma = c(1,1,4,1))
plot(gbm.gaus, i.var = 1)
partialPlot(rf.model, Data[,2:4], x.var = "a")
plot(gbm.gaus, i.var = 2)
partialPlot(rf.model, Data[,2:4], x.var = "b")
plot(gbm.gaus, i.var = 3)
partialPlot(rf.model, Data[,2:4], x.var = "c")
title(main = "Boosted regression tree", outer = TRUE, adj = 0.15)
title(main = "Random forest", outer = TRUE, adj = 0.85)