首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NNET进行分类

使用NNET进行分类
EN

Stack Overflow用户
提问于 2013-11-16 19:39:32
回答 1查看 13K关注 0票数 9

我是神经网络的新手,我有一个关于nnet包分类的问题。

我有一个混合了数字和类别变量的数据。我想通过使用nnet和一个函数调用来进行输赢预测

代码语言:javascript
复制
nnet(WL~., data=training, size=10) 

但是,如果我使用的数据帧只包含变量的数字版本(即将所有因子转换为数字(我的预测WL除外)),则会得到不同的结果。

有人能给我解释一下这里发生了什么吗?我猜nnet正在以不同的方式解释变量,但我想了解发生了什么。我知道在没有任何数据的情况下很难重现这个问题,但我只是在看一个关于神经网络如何使用nnet进行拟合的高级解释。我到处都找不到这个。非常感谢。

代码语言:javascript
复制
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

代码语言:javascript
复制
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 ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-16 20:18:35

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

代码语言:javascript
复制
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中的一个(且只有一个)必须是一个。因此,自x1 + x2 + x3 = 1以来,变量x1x2x3并不是独立的。因此,我们可以在模型中删除第一个变量x1,只保留x2x3的值,并得出结论:如果x2 == 0x2 == 0都存在,则级别为1

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

大多数R回归函数(nnetrandomForestglmgbm等)在内部完成从因子级别到虚拟变量的映射,用户不需要知道这一点。

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

丢失每个级别的唯一属性,并量化级别之间的差异them.

  • Enforcing

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20017966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档