3

私のデータセットが100 x 3カテゴリ変数で満たされた行列であるとします。応答変数でバイナリ分類を行いたいと思います。次のコードでデータセットを作成しましょう。

set.seed(2013)
y <- as.factor(round(runif(n=100,min=0,max=1),0))
var1 <- rep(c("red","blue","yellow","green"),each=25)
var2 <- rep(c("shortest","short","tall","tallest"),25)
df <- data.frame(y,var1,var2)

データは次のようになります。

> head(df)
  y var1     var2
1 0  red shortest
2 1  red    short
3 1  red     tall
4 1  red  tallest
5 0  red shortest
6 1  red    short

このデータに対して、2 つの異なるアプローチでランダム フォレストとアダブーストを実行しようとしました。最初のアプローチは、データをそのまま使用することです。

> library(randomForest)
> randomForest(y~var1+var2,data=df,ntrees=500)

Call:
 randomForest(formula = y ~ var1 + var2, data = df, ntrees = 500) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 1

        OOB estimate of  error rate: 44%
Confusion matrix:
   0  1 class.error
0 29 22   0.4313725
1 22 27   0.4489796

----------------------------------------------------
> library(ada)
> ada(y~var1+var2,data=df)

Call:
ada(y ~ var1 + var2, data = df)

Loss: exponential Method: discrete   Iteration: 50 

Final Confusion Matrix for Data:
          Final Prediction
True value  0  1
         0 34 17
         1 16 33

Train Error: 0.33 

Out-Of-Bag Error:  0.33  iteration= 11 

Additional Estimates of number of iterations:

train.err1 train.kap1 
        10         16 

2 番目のアプローチは、データセットをワイド フォーマットに変換し、各カテゴリを変数として扱うことです。これを行っている理由は、実際のデータセットには var1 と var2 に 500 以上の要素があり、その結果、ツリー パーティショニングは常に 500 のカテゴリを 2 つの分割に分割するためです。そうすることで多くの情報が失われます。データを変換するには:

id <- 1:100
library(reshape2)
tmp1 <- dcast(melt(cbind(id,df),id.vars=c("id","y")),id+y~var1,fun.aggregate=length)
tmp2 <- dcast(melt(cbind(id,df),id.vars=c("id","y")),id+y~var2,fun.aggregate=length)
df2 <- merge(tmp1,tmp2,by=c("id","y"))

新しいデータは次のようになります。

> head(df2)
   id y blue green red yellow short shortest tall tallest
1   1 0    0     0   2      0     0        2    0       0
2  10 1    0     0   2      0     2        0    0       0
3 100 0    0     2   0      0     0        0    0       2
4  11 0    0     0   2      0     0        0    2       0
5  12 0    0     0   2      0     0        0    0       2
6  13 1    0     0   2      0     0        2    0       0

この新しいデータセットにランダム フォレストとアダブーストを適用します。

> library(randomForest)
> randomForest(y~blue+green+red+yellow+short+shortest+tall+tallest,data=df2,ntrees=500)

Call:
 randomForest(formula = y ~ blue + green + red + yellow + short +      shortest + tall + tallest, data = df2, ntrees = 500) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 39%
Confusion matrix:
   0  1 class.error
0 32 19   0.3725490
1 20 29   0.4081633

----------------------------------------------------
> library(ada)
> ada(y~blue+green+red+yellow+short+shortest+tall+tallest,data=df2)
Call:
ada(y ~ blue + green + red + yellow + short + shortest + tall + 
tallest, data = df2)

Loss: exponential Method: discrete   Iteration: 50 

Final Confusion Matrix for Data:
          Final Prediction
True value  0  1
         0 36 15
         1 20 29

Train Error: 0.35 

Out-Of-Bag Error:  0.33  iteration= 26 

Additional Estimates of number of iterations:

train.err1 train.kap1 
         5         10 

2 つのアプローチの結果は異なります。と の各変数にレベルを追加すると、違いがより明確にvar1なりvar2ます。私の質問は、まったく同じデータを使用しているのに、結果が異なるのはなぜですか? 両方のアプローチの結果をどのように解釈すべきでしょうか? どちらがより信頼できますか?

4

1 に答える 1

2

これら 2 つのモデルは同じように見えますが、基本的に互いに異なります。2 つのモデル定式化のどちらを正しく選択するかは、実際の観測の特性によって異なります。これらの文字が排他的である場合 (つまり、各観測値が単一の色と高さである場合)、モデルの最初の定式化が適切に使用されます。ただし、観察結果が青と緑の両方である場合、またはその他の色の組み合わせである場合は、2 番目の定式化を使用できます。元のデータを見ると、最初のデータが最も適切であるように思われます (つまり、どのように観測に複数の高さがあるのでしょうか??)。

また、なぜ df2 の論理変数列を 0/1 ではなく 0 と 2 としてコーディングしたのですか? データが因子または数値としてどのようにコード化されているかに応じて、それが適合に影響を与えるかどうかはわかりません。

于 2013-04-03T21:19:20.080 に答える