9

私はニューラル ネットワークが初めてで、nnet パッケージを使用した分類について質問があります。

数値変数とカテゴリ変数が混在するデータがあります。nnet と次のような関数呼び出しを使用して、勝敗を予測したかったのです。

nnet(WL~., data=training, size=10) 

しかし、これは、変数の数値バージョンのみを含むデータフレームを使用する場合とは異なる結果をもたらします(つまり、すべての因子を数値に変換します(予測WLを除く))。

誰かがここで何が起こっているのか説明できますか? nnet は変数を異なって解釈していると思いますが、何が起こっているのか理解したいと思います。データなしで問題を再現するのは難しいと思いますが、nnetを使用してニューラルネットワークがどのように適合されるかについての高レベルの説明を見ているだけです。私はどこにもこれを見つけることができません。どうもありがとう。

str(training)
'data.frame':   1346 obs. of  9 variables:
 $ WL                   : Factor w/ 2 levels "win","lose": 2 2 1 1 NA 1 1 2 2 2 ...
 $ team.rank            : int  17 19 19 18 17 16 15 14 14 16 ...
 $ opponent.rank        : int  14 12 36 16 12 30 11 38 27 31 ...
 $ HA                   : Factor w/ 2 levels "A","H": 1 1 2 2 2 2 2 1 1 2 ...
 $ comp.stage           : Factor w/ 3 levels "final","KO","league": 3 3 3 3 3 3 3 3 3 3 ...
 $ days.since.last.match: num  132 9 5 7 14 7 7 7 14 7 ...
 $ days.to.next.match   : num  9 5 7 14 7 9 7 9 7 8 ...
 $ comp.last.match      : Factor w/ 5 levels "Anglo-Welsh Cup",..: 5 5 5 5 5 5 3 5 3 5 ...
 $ comp.next.match      : Factor w/ 4 levels "Anglo-Welsh Cup",..: 4 4 4 4 4 3 4 3 4 3 ...

str(training.nnet)
'data.frame':   1346 obs. of  9 variables:
 $ WL                   : Factor w/ 2 levels "win","lose": 2 2 1 1 NA 1 1 2 2 2 ...
 $ team.rank            : int  17 19 19 18 17 16 15 14 14 16 ...
 $ opponent.rank        : int  14 12 36 16 12 30 11 38 27 31 ...
 $ HA                   : num  1 1 2 2 2 2 2 1 1 2 ...
 $ comp.stage           : num  3 3 3 3 3 3 3 3 3 3 ...
 $ days.since.last.match: num  132 9 5 7 14 7 7 7 14 7 ...
 $ days.to.next.match   : num  9 5 7 14 7 9 7 9 7 8 ...
 $ comp.last.match      : num  5 5 5 5 5 5 3 5 3 5 ...
 $ comp.next.match      : num  4 4 4 4 4 3 4 3 4 3 ...
4

1 に答える 1

13

探している違いは、非常に小さな例で説明できます。

fit.factors <- nnet(y ~ x, data.frame(y=c('W', 'L', 'W'), x=c('1', '2' , '3')), size=1)
fit.factors
# a 2-1-1 network with 5 weights
# inputs: x2 x3 
# output(s): y 
# options were - entropy fitting 

fit.numeric <- nnet(y ~ x, data.frame(y=c('W', 'L', 'W'), x=c(1, 2, 3)), size=1)
fit.numeric
# a 1-1-1 network with 4 weights
# inputs: x 
# output(s): y 
# options were - entropy fitting 

R でモデルをフィッティングしている間、因子変数は実際にはいくつかの指標/ダミー変数に分割されます

したがって、因子変数は実際には、、のx = c('1', '2', '3')3 つの変数に分割され、そのうちの 1 つが値を保持し、他の変数が値を保持します。さらに、因子は網羅的であるため、 、 、 のうちの 1 つ (および 1 つだけ) は 1でなければなりません。したがって、変数、、は から独立していません。したがって、最初の変数を削除して、との値のみをモデルに保持し、レベルがと の両方であると結論付けることができます。x1x2x310{1, 2, 3}x1x2x3x1x2x3x1 + x2 + x3 = 1x1x2x31x2 == 0x2 == 0

nnetそれが;の出力に表示されます。がx因子である場合、実際にはニューラル ネットワークへのlength(levels(x)) - 1 入力xがあり、 が数値である場合、ニューラル ネットワークへの入力は である 1 つだけですx

ほとんどの R 回帰関数 ( nnetrandomForestglmgbmなど) は、因子レベルからダミー変数へのこのマッピングを内部的に行うため、ユーザーとして意識する必要はありません。


これで、データセットを で使用することfactorsと、データセットnumbersfactors. に変換すると、次のnumbersようになります。

  1. 各レベルの固有のプロパティを失い、それらの違いを量子化します。
  2. レベル間の順序付けの強制

これにより、モデルが少し単純になります (各レベルに変数が必要ないため、変数が少なくなりますdummy) が、多くの場合、これは正しいことではありません。

于 2013-11-16T12:18:35.450 に答える