r - 使用NNET进行分类

标签 r nnet

我是神经网络新手,对使用 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') 实际上被分为三个变量:x1, x2x3,其中一个保存值1,而其他保存值0。此外,由于因子 {1, 2, 3} 是详尽无遗的,因此 x1x2 中的一个(且仅有一个) x3 必须是 1。因此,变量 x1x2x3 不是独立的,因为 x1 + x2 + x3 = 1。因此,我们可以删除第一个变量 x1 并仅保留模型中的 x2x3 值,并得出级别为 1 的结论 如果 x2 == 0x2 == 0

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

大多数 R 回归函数(nnetrandomForestglmgbm 等)都会执行此映射从因子级别到内部虚拟变量,并且用户不需要意识到这一点。

<小时/>

现在应该清楚使用带有因素的数据集和用数字替换因素的数据集之间有什么区别。如果您将其转换为数字,那么您将:

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

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

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

相关文章:

python - Python Theano 中的二进制输出神经网络

r - 使用插入符号指定交叉验证折叠

r - 是否可以使用比使用因子时更小的数据集?

r - R 中 if-else 中的逻辑运算符

R pROC 精度

r - 使用nnet时出错

r - 将 directlabels 稍微向左移动

python - 逻辑向量作为 Python 中的索引?

r - 与回归函数相比,nnet 的多项式汇总函数速度极慢

r - 插入符号神经网络错误 : "missing values in resampled performance measures"