使用NNET进行分类

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 ...

vs

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 ...
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')实际上被分成三个变量:x1x2x3,其中一个变量的值为1,而其他变量的值为0。 而且,由于因子{1,2,3}是完全穷尽的,x1x2x3中的一个(且仅一个)必须为一。 因此,变量x1x2x3不是独立的,因为x1 + x2 + x3 = 1。所以我们可以删除第一个变量x1,在模型中只保留x2x3的值,并得出结论,如果x2 == 0并且x2 == 0,则水平为1
这是在nnet的输出中看到的;当x是一个因子时,实际上神经网络有length(levels(x)) - 1输入,而如果x是一个数字,那么神经网络只有一个输入,即x。大多数R回归函数(nnetrandomForestglmgbm等)会在内部执行从因子级别到虚拟变量的映射,用户不需要知道此过程。
现在应该清楚了,使用带有 factors 的数据集和使用将 factors 替换为 numbers 的数据集之间的区别。 如果您将转换为 numbers,那么您会做到以下几点:
  1. 失去每个级别的独特属性并量化它们之间的差异。
  2. 强制在级别之间进行排序
这确实会导致模型略微简单(由于我们不需要为每个级别使用 dummy 变量而变量更少),但通常不是正确的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接