【问题标题】:Using NNET for classification使用 NNET 进行分类
【发布时间】:2018-12-05 04:27:45
【问题描述】:

我是神经网络的新手,我有一个关于使用 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 ...

【问题讨论】:

    标签: r nnet


    【解决方案1】:

    您正在寻找的差异可以用一个非常小的例子来解释:

    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 中的一个(并且只有一个)必须是一个。因此,变量x1x2x3 不是独立的,因为x1 + x2 + x3 = 1。因此,我们可以删除第一个变量x1 并在模型中只保留x2x3 的值,如果x2 == 0x2 == 0 都存在,则得出水平为1

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

    大多数 R 回归函数(nnetrandomForestglmgbm 等)在内部执行从因子级别到虚拟变量的映射,并且不需要将其作为一个用户。


    现在应该清楚使用带有factors 的数据集和带有numbers 的数据集替换factors 之间的区别。如果您转换为numbers,那么您是:

    1. 丢失每个级别的独特属性并量化它们之间的差异。
    2. 在级别之间强制排序

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

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2011-12-06
      • 1970-01-01
      • 2016-12-01
      • 2013-08-27
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多