2017-03-04 7 views
2

皆、私はforループで最良のパラメータを検索しようとしています。しかし、結果は本当に私を混乱させる。パラメータ "mtry"が同じであるため、次のコードで同じ結果が得られるはずです。forループで最高のランダムフォレストパラメータを検索する

 gender Partner tenure Churn 
3521  Male  No 0.992313 Yes 
2525.1 Male  No 4.276666 No 
567  Male  Yes 2.708050 No 
8381 Female  No 4.202127 Yes 
6258 Female  No 0.000000 Yes 
6569  Male  Yes 2.079442 No 
27410 Female  No 1.550804 Yes 
6429 Female  No 1.791759 Yes 
412 Female  Yes 3.828641 No 
4655 Female  Yes 3.737670 No 

RFModel = randomForest(Churn ~ ., 
        data = ggg, 
        ntree = 30, 
        mtry = 2, 
        importance = TRUE, 
        replace = FALSE) 
print(RFModel$confusion) 

    No Yes class.error 
No 4 1   0.2 
Yes 1 4   0.2 

for(i in c(2)){ 
    RFModel = randomForest(Churn ~ ., 
        data = Trainingds, 
        ntree = 30, 
        mtry = i, 
        importance = TRUE, 
        replace = FALSE) 
    print(RFModel$confusion) 
} 

    No Yes class.error 
No 3 2   0.4 
Yes 2 3   0.4 

  1. CODE1とCODE2は、同じ出力を提供する必要があります。
+0

ランダム 'randomForest'の結果ではないですか? –

答えて

2

ランダム性がアルゴリズムに組み込まれているため、毎回少しずつ異なる結果が得られます。各ツリーを構築するために、アルゴリズムはデータフレームを再サンプリングし、ランダムにmtry列を選択して、再サンプリングされたデータフレームからツリーを構築する。同じパラメータ(例えば、mtry、ntree)で構築されたモデルが毎回同じ結果を返すようにするには、ランダムシードを設定する必要があります。

たとえば、randomForestを10回実行して、実行ごとの平均二乗誤差の平均値を確認します。平均MSEが毎回異なることに注意してください:

library(randomForest) 

replicate(10, mean(randomForest(mpg ~ ., data=mtcars)$mse)) 
[1] 5.998530 6.307782 5.791657 6.125588 5.868717 5.845616 5.427208 6.112762 5.777624 6.150021 

あなたは上記のコードを実行した場合、あなたは上記の値と異なっている別の10の値を取得します。

同じパラメータ(たとえば、mtryおよびntree)で実行された結果を再現できるようにするには、ランダムなシードを設定します。たとえば:

set.seed(5) 
mean(randomForest(mpg ~ ., data=mtcars)$mse) 
[1] 6.017737 

は、あなたが同じシード値を使用した場合と同じ結果を得るが、それ以外は異なる結果でしょう。より大きな値のntreeを使用すると、モデル実行間のばらつきは軽減されますが、排除されるわけではありません。

更新:私が提供したデータサンプルでコードを実行すると、毎回同じ結果が得られるとは限りません。交換することなくサンプリングされたデータフレームをもたらすreplace=TRUE、ツリーを構築するために選択した列が毎回異なることができると:

> randomForest(Churn ~ ., 
+    data = ggg, 
+    ntree = 30, 
+    mtry = 2, 
+    importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Churn ~ ., data = ggg, ntree = 30, mtry = 2,  importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 30% 
Confusion matrix: 
    No Yes class.error 
No 3 2   0.4 
Yes 1 4   0.2 
> randomForest(Churn ~ ., 
+    data = ggg, 
+    ntree = 30, 
+    mtry = 2, 
+    importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Churn ~ ., data = ggg, ntree = 30, mtry = 2,  importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 20% 
Confusion matrix: 
    No Yes class.error 
No 4 1   0.2 
Yes 1 4   0.2 
> randomForest(Churn ~ ., 
+    data = ggg, 
+    ntree = 30, 
+    mtry = 2, 
+    importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Churn ~ ., data = ggg, ntree = 30, mtry = 2,  importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 30% 
Confusion matrix: 
    No Yes class.error 
No 3 2   0.4 
Yes 1 4   0.2 

ここビルトインirisデータフレームと結果の同様のセットは、次のとおりです。

> randomForest(Species ~ ., data=iris, ntree=30, mtry=2, importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Species ~ ., data = iris, ntree = 30,  mtry = 2, importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 3.33% 
Confusion matrix: 
      setosa versicolor virginica class.error 
setosa   50   0   0  0.00 
versicolor  0   47   3  0.06 
virginica  0   2  48  0.04 
> randomForest(Species ~ ., data=iris, ntree=30, mtry=2, importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Species ~ ., data = iris, ntree = 30,  mtry = 2, importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 4.67% 
Confusion matrix: 
      setosa versicolor virginica class.error 
setosa   50   0   0  0.00 
versicolor  0   47   3  0.06 
virginica  0   4  46  0.08 
> randomForest(Species ~ ., data=iris, ntree=30, mtry=2, importance = TRUE, 
+    replace = FALSE) 

Call: 
randomForest(formula = Species ~ ., data = iris, ntree = 30,  mtry = 2, importance = TRUE, replace = FALSE) 
       Type of random forest: classification 
        Number of trees: 30 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 6% 
Confusion matrix: 
      setosa versicolor virginica class.error 
setosa   50   0   0  0.00 
versicolor  0   47   3  0.06 
virginica  0   6  44  0.12 

また、各モデルの実行によって生成されたツリーを見ることもできます。これらのツリーは一般的には異なります。たとえば、次のコードを3回実行して、結果をオブジェクトm1,m2およびm3に格納するとします。

randomForest(Churn ~ ., 
      data = ggg, 
      ntree = 30, 
      mtry = 2, 
      importance = TRUE, 
      replace = FALSE) 

ここでは、モデルオブジェクトの最初の4つのツリーを見ていきます。出力はリストです。モデルの実行ごとに最初のツリーが異なることがわかります。 2番目のツリーは、最初の2つのモデルの実行では同じですが、3番目のモデルでは異なります。

check.trees = lapply(1:4, function(i) { 
    lapply(list(m1=m1,m2=m2,m3=m3), function(model) getTree(model, i, labelVar=TRUE)) 
    }) 

check.trees 
[[1]] 
[[1]]$m1 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner 1.000000  1  <NA> 
2    4    5 gender 1.000000  1  <NA> 
3    0    0  <NA> 0.000000  -1   No 
4    0    0  <NA> 0.000000  -1  Yes 
5    6    7 tenure 2.634489  1  <NA> 
6    0    0  <NA> 0.000000  -1  Yes 
7    0    0  <NA> 0.000000  -1   No 

[[1]]$m2 
    left daughter right daughter split var split point status prediction 
1    2    3 gender 1.000000  1  <NA> 
2    0    0  <NA> 0.000000  -1  Yes 
3    4    5 tenure 1.850182  1  <NA> 
4    0    0  <NA> 0.000000  -1  Yes 
5    0    0  <NA> 0.000000  -1   No 

[[1]]$m3 
    left daughter right daughter split var split point status prediction 
1    2    3 tenure 2.249904  1  <NA> 
2    0    0  <NA> 0.000000  -1  Yes 
3    0    0  <NA> 0.000000  -1   No 


[[2]] 
[[2]]$m1 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    0    0  <NA>   0  -1  Yes 
3    0    0  <NA>   0  -1   No 

[[2]]$m2 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    0    0  <NA>   0  -1  Yes 
3    0    0  <NA>   0  -1   No 

[[2]]$m3 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    4    5 gender   1  1  <NA> 
3    0    0  <NA>   0  -1   No 
4    0    0  <NA>   0  -1  Yes 
5    0    0  <NA>   0  -1   No 


[[3]] 
[[3]]$m1 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    4    5 gender   1  1  <NA> 
3    0    0  <NA>   0  -1   No 
4    0    0  <NA>   0  -1  Yes 
5    0    0  <NA>   0  -1  Yes 

[[3]]$m2 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    0    0  <NA>   0  -1  Yes 
3    0    0  <NA>   0  -1   No 

[[3]]$m3 
    left daughter right daughter split var split point status prediction 
1    2    3 tenure 2.129427  1  <NA> 
2    0    0  <NA> 0.000000  -1  Yes 
3    0    0  <NA> 0.000000  -1   No 


[[4]] 
[[4]]$m1 
    left daughter right daughter split var split point status prediction 
1    2    3 tenure 1.535877  1  <NA> 
2    0    0  <NA> 0.000000  -1  Yes 
3    4    5 tenure 4.015384  1  <NA> 
4    0    0  <NA> 0.000000  -1   No 
5    6    7 tenure 4.239396  1  <NA> 
6    0    0  <NA> 0.000000  -1  Yes 
7    0    0  <NA> 0.000000  -1   No 

[[4]]$m2 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    0    0  <NA>   0  -1  Yes 
3    0    0  <NA>   0  -1   No 

[[4]]$m3 
    left daughter right daughter split var split point status prediction 
1    2    3 Partner   1  1  <NA> 
2    0    0  <NA>   0  -1  Yes 
3    0    0  <NA>   0  -1   No 
+0

しかし、最初のコードを10回実行すると、同じ混乱行列が得られます。 – Frasher

+0

コードに対応したサンプルデータを提供し、問題の再現を行ってください。 'dput'を使ってデータサンプルを提供してください。 – eipi10

+0

あなたはまったく正しいです。私は本当にあなたの応答に感謝します。コード1の最初の行にset.seed()を追加し、コード2にforループを追加すると、同じ結果が得られます。ありがとうございます。 – Frasher

関連する問題