2016-10-18 17 views
0

私は現在、randomForestモデルで作業しています。私の設定では、高いノードサイズの値がクロス検証を使用して優れた設定であることを認識しています。R randomForestのノードサイズに対する副作用?

しかし、私は奇妙な何かを実現しました。 nodesize = nrow(データ)について

library(randomForest) 
library(data.table) 

set.seed(1) 

n = 10 

sigma = 0.4 

X = runif(n) 
Y = runif(n) 

Z = X^2+X*Y+Y+sigma*rnorm(n) 

Data = data.table(X,Y,Z) 

model = randomForest(formula = as.formula('Z ~ X + Y'),data = Data,mtry =  1,tree= 500,nodesize = n+4,do.trace = TRUE) 

pred = predict(model,Data) 
print(pred) 
1.041549 1.036075 1.266310 1.324197 1.308377 1.480041 1.691081 1.752463 1.203856 1.306943 

+5

library(randomForest) 
library(data.table) 

set.seed(1) 

n = 10 

sigma = 0.4 

X = runif(n) 
Y = runif(n) 

Z = X^2+X*Y+Y+sigma*rnorm(n) 

Data = data.table(X,Y,Z) 

model = randomForest(formula = as.formula('Z ~ X + Y'),data = Data,mtry =  1,tree= 500,nodesize = n+5,do.trace = TRUE) 

pred = predict(model,Data) 
print(pred) 
1.330427 1.330427 1.330427 1.330427 1.330427 1.330427 1.330427 1.330427 1.330427 1.330427 

:nodesize = nrow(データ)+4について

:ここ

コードのreproduicible片でありますノードサイズ= n + 5からの任意の観測について同じである。

これはn(n = 20000も)の任意の値の場合です。

私にとって、nodesizeは、分割が実行されるためにノード内のレコードの最小数です。つまり、レコードがn個ある場合は、n + 4回の観測をサンプリングしてツリーを成長させるということです。したがって、nodesize> n + 4の場合、分割は実行されず、ツリーはグローバルな手段を返します。そのため、同じ予測がすべての観測に起因するのはこのためです。それは意味がありますか?元のデータセットから抽出されるサンプルの数を示すパラメータはありますか?事前に

おかげ

+3

Nodesizeは、ノードをさらに分割するのに必要なサイズではなく、端末ノードの最小サイズです。 nodesizeが MorganBall

答えて

0

@Morganはnodesizeが何をするかについての誤解があったことを右です。これは、任意の端末ノードの最小サイズです。しかし、まだ、randomForestの動作は予期しないようです(バグ?)。 n <= nodesize <= n+5の場合は実際にブランチを作成しますが、それはあなたが見つけたものです。

nodesizeが10(サンプルのサイズ)の場合、分割があってはいけませんが、randomForestはいくつかの観測を分割します。また、nodesizeが11:14のうちの1つである場合(ここでは示されていない)ことを行います。

n = 10 
sigma = 0.4 
set.seed(100) 
X = runif(n) 
set.seed(200) 
Y = runif(n) 

set.seed(1) 
Z = X^2+X*Y+Y+sigma*rnorm(n) 

Data = data.frame(X,Y,Z) 

# 
# mtry = p, replace = F and sampsize = n to eliminate randomness 
# 
model = randomForest(formula = Z ~ X + Y, data = Data, 
        mtry = 2, ntree = 50, nodesize = 10, replace = F, sampsize = n) 

grid <- expand.grid(X = seq(from = min(Data$X), to = max(Data$X), length.out = 100), 
        Y = seq(from = min(Data$Y), to = max(Data$Y), length.out = 100)) 
grid$grid_preds <- predict(model, grid) 
ggplot(grid, aes(x = X, y = Y)) + geom_point(aes(color = grid_preds)) + 
    geom_point(data = Data, aes(x = X, y = Y, size = 4), color = "blue") + 
    theme(legend.position = "none") 

plot1

あなたがn + 5以上randomForestnodesizeを設定した場合、予想通り、もはや任意の分割を行いません。

比較として

plot2

model = randomForest(formula = Z ~ X + Y, data = Data, 
        mtry = 2, ntree = 50, nodesize = 15, replace = F, sampsize = n) 

grid <- expand.grid(X = seq(from = min(Data$X), to = max(Data$X), length.out = 100), 
        Y = seq(from = min(Data$Y), to = max(Data$Y), length.out = 100)) 
grid$grid_preds <- predict(model, grid) 
ggplot(grid, aes(x = X, y = Y, color = grid_preds)) + geom_point() 
rangerが予想される動作を示しており、 min.node.size >= n場合は任意の分割をしようとしません:ところで

library(ranger) 
rang = ranger(Z ~ X + Y, data = Data, write.forest = T, 
       replace = F, sample.fraction = 1, 
       mtry = 2, num.trees = 50, min.node.size = 10) 

grid$grid_preds <- predict(rang, grid)$prediction 
ggplot(grid, aes(x = X, y = Y, color = grid_preds)) + geom_point() 

plot3

を、randomForestn+5ルールは私が何が起こっているのか、あまりにも思ったんだけど10以外のnのために保持していますそこに。