我是神经网络的新手,我对使用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 ...

最佳答案

您所寻找的差异可以通过一个非常小的示例来解释:

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中拟合模型时,因子变量实际上是split out into several indicator/dummy variables

因此,因子变量x = c('1', '2', '3')实际上分为三个变量:x1x2x3,其中一个变量持有1值,而其他变量持有0值。此外,由于{1, 2, 3}因素是穷举性的,因此x1x2x3中的一个(只有一个)必须为1。因此,自x1以来,变量x2x3x1 + x2 + x3 = 1不独立。因此,我们可以删除第一个变量x1,并在模型中仅保留x2x3的值,并得出结论:如果同时1x2 == 0,则级别为x2 == 0

那就是你在nnet的输出中看到的;当x是一个因素时,实际上是向神经网络输入了length(levels(x)) - 1,如果x是一个数字,则只有一个输入到神经网络是x

大多数R回归函数(nnetrandomForestglmgbm等)在内部从因子级到虚拟变量进行此映射,并且用户不需要知道它。

现在应该很清楚,使用带有factors的数据集和带有numbers的数据集替换factors的区别是什么?如果您转换为numbers,那么您是:
  • 失去每个级别的独特属性并量化它们之间的差异。
  • 强制执行
  • 级别之间的排序

    这确实导致了一个稍微简单的模型(变量较少,因为我们不需要每个级别的dummy变量),但通常不是正确的做法。

    关于r - 使用NNET进行分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20017966/

    10-09 08:55