【问题标题】:Using neural networks neuralnet in R to predict factor values在 R 中使用神经网络神经网络来预测因子值
【发布时间】:2017-06-24 16:12:25
【问题描述】:

我正在使用neuralnet 包,使用多个输入来预测输出。

原来我的输出是一个因子变量,看到了错误:

Error in neurons[[i]] %*% weights[[i]] : 
  requires numeric/complex matrix/vector arguments

当我将输出转换为numeric 变量时,错误消失了。有没有办法用因子输出神经网络?

【问题讨论】:

  • 在不了解您的数据集的情况下,我建议您可以尝试将这些因素编码为单独的“指标”变量。例如,如果一个变量是 Win/Loss/Draw 因素,那么您可以将其编码为 3 个单独的变量(Win/Loss/Draw),其中每个变量的值是 0 或 1,以指示哪个是正确的选择。注意 - 如果您在 R 中拟合诸如 GLM 之类的模型,这就是“幕后”发生的事情,但是,在神经网络中,您需要更明确地说明您想要做什么。

标签: r neural-network


【解决方案1】:

我修改了在this site 找到的代码,它使用带有神经网络包的鸢尾花数据集从形态数据中预测鸢尾花种类。

如果没有可重现的示例,我不确定这是否适用于您的情况。这里的关键是将阶乘响应水平转换为它自己的二元变量。预测与 R 中的其他模型略有不同 - 您选择得分最高的因子水平。

示例代码:

library(neuralnet)

# Make training and validation data
set.seed(1)
train <- sample(nrow(iris), nrow(iris)*0.5)
valid <- seq(nrow(iris))[-train]
iristrain <- iris[train,]
irisvalid <- iris[valid,]

# Binarize the categorical output
iristrain <- cbind(iristrain, iristrain$Species == 'setosa')
iristrain <- cbind(iristrain, iristrain$Species == 'versicolor')
iristrain <- cbind(iristrain, iristrain$Species == 'virginica')
names(iristrain)[6:8] <- c('setosa', 'versicolor', 'virginica')

# Fit model
nn <- neuralnet(
  setosa+versicolor+virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
  data=iristrain, 
  hidden=c(3)
)
plot(nn)

# Predict
comp <- compute(nn, irisvalid[-5])
pred.weights <- comp$net.result
idx <- apply(pred.weights, 1, which.max)
pred <- c('setosa', 'versicolor', 'virginica')[idx]
table(pred, irisvalid$Species)

#pred         setosa versicolor virginica
#  setosa         23          0         0
#  versicolor      1         21         7
#  virginica       0          1        22

【讨论】:

  • 它看起来很有希望,我会尝试让你知道。非常感谢。
【解决方案2】:

这可能会引发警告:

nn <- neuralnet(
  setosa+versicolor+virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
  data=iristrain, 
  hidden=c(3)
)

所以替换为:

nn <- neuralnet(
  setosa+versicolor+virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
  data=iristrain, hidden = 3,lifesign = "full")

如果这不起作用:

comp <- compute(nn, irisvalid[-5])

然后使用

comp <- neuralnet::compute(nn, irisvalid[,1:4])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2017-12-12
    • 1970-01-01
    • 2018-11-01
    • 2017-12-02
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多