1

gbm モデルに合わせてキャレットを使用しています。を呼び出すとtrainedGBM$finalModel$fit、正しいように見える出力が得られます。

しかし、 を呼び出すとpredict(trainedGBM$finalModel, origData, type="response")、非常に異なる結果がpredict(trainedGBM$finalModel, type="response")得られ、origData がアタッチされている場合でも、さらに異なる結果が得られます。私の考えでは、これらの呼び出しは同じ出力を生成するはずです。誰かが問題を特定するのを手伝ってくれますか?

library(caret)
library(gbm)

attach(origData)
gbmGrid <- expand.grid(.n.trees = c(2000), 
                       .interaction.depth = c(14:20), 
                       .shrinkage = c(0.005))
trainedGBM <- train(y ~ ., method = "gbm", distribution = "gaussian", 
                    data = origData, tuneGrid = gbmGrid, 
                    trControl = trainControl(method = "repeatedcv", number = 10, 
                                             repeats = 3, verboseIter = FALSE, 
                                             returnResamp = "all"))
ntrees <- gbm.perf(trainedGBM$finalModel, method="OOB")
data.frame(y, 
           finalModelFit = trainedGBM$finalModel$fit, 
           predictDataSpec = predict(trainedGBM$finalModel, origData, type="response", n.trees=ntrees), 
           predictNoDataSpec = predict(trainedGBM$finalModel, type="response", n.trees=ntrees))

上記のコードは、次の部分的な結果をもたらします。

   y finalModelFit predictDataSpec predictNoDataSpec
9000     6138.8920        2387.182          2645.993
5000     3850.8817        2767.990          2467.157
3000     3533.1183        2753.551          2044.578
2500     1362.9802        2672.484          1972.361
1500     5080.2112        2449.185          2000.568
 750     2284.8188        2728.829          2063.829
1500     2672.0146        2359.566          2344.451
5000     3340.5828        2435.137          2093.939
   0     1303.9898        2377.770          2041.871
 500      879.9798        2691.886          2034.307
3000     2928.4573        2327.627          1908.876
4

1 に答える 1

7

に基づいてgbmGrid、相互作用の深さのみが 14 から 20 の間で変化し、収縮と木の数はそれぞれ 0.005 と 2000 に固定されます。はTrainedGBM、現在の状態で最適なレベルの相互作用のみを見つけるように設計されています。次に、最適な相互作用のレベルが 14 から 20 の間であるとすると、 OOB基準に基づく最適なツリーの数はいくつになるかをntrees計算します。gbm.perf予測はモデル内のツリーの数に依存するため、trainedGBM に基づく予測は を使用しntrees = 2000、に基づく予測はその関数から推定されgbm.perfた最適な数を使用 ntreesします。trainedGBM$finalModel$fitこれにより、と の違いが説明されますpredict(trainedGBM$finalModel, type="response", n.trees=ntrees)

回帰モデルではなく分類として gbm を使用したアイリス データ セットに基づく例を示すには

library(caret)
library(gbm)

set.seed(42)

gbmGrid <- expand.grid(.n.trees = 100, 
                   .interaction.depth = 1:4, 
                   .shrinkage = 0.05)


trainedGBM <- train(Species ~ ., method = "gbm", distribution='multinomial',
                data = iris, tuneGrid = gbmGrid, 
                trControl = trainControl(method = "repeatedcv", number = 10, 
                                         repeats = 3, verboseIter = FALSE, 
                                         returnResamp = "all"))
print(trainedGBM)        

与える

# Resampling results across tuning parameters:

#  interaction.depth  Accuracy  Kappa  Accuracy SD  Kappa SD
#   1                  0.947     0.92   0.0407       0.061   
#   2                  0.947     0.92   0.0407       0.061   
#   3                  0.944     0.917  0.0432       0.0648  
#   4                  0.944     0.917  0.0395       0.0592  

# Tuning parameter 'n.trees' was held constant at a value of 100
# Tuning parameter 'shrinkage' was held constant at a value of 0.05
# Accuracy was used to select the optimal model using  the largest value.
# The final values used for the model were interaction.depth = 1, n.trees = 100
# and shrinkage = 0.05.     

最適な相互作用の深さを条件として最適な木の数を見つける:

ntrees <-  gbm.perf(trainedGBM$finalModel, method="OOB")
# Giving ntrees = 50

木の数と相互作用の深さを変えてモデルをトレーニングすると、次のようになります。

gbmGrid2 <- expand.grid(.n.trees = 1:100, 
                   .interaction.depth = 1:4, 
                   .shrinkage = 0.05)

trainedGBM2 <- train(Species ~ ., method = "gbm", 
                data = iris, tuneGrid = gbmGrid2, 
                trControl = trainControl(method = "repeatedcv", number = 10, 
                                         repeats = 3, verboseIter = FALSE, 
                                         returnResamp = "all"))

print(trainedGBM2) 

# Tuning parameter 'shrinkage' was held constant at a value of 0.05
# Accuracy was used to select the optimal model using  the largest value.
# The final values used for the model were interaction.depth = 2, n.trees = 39
# and shrinkage = 0.05. 

木の数と相互作用の深さの両方を変化させた場合の最適な木の数は、 で計算された値にかなり近いことに注意してくださいgbm.perf

于 2013-07-14T02:39:27.603 に答える