我第一次使用nnet,使用网络上的基本示例进行播放,但无法使用虚拟玩具数据集来显示其输出。使用正常分布的2个变量简单区分两个类(信号和背景)。
以下代码可以在R(版本3.0)中复制和粘贴:
library(nnet)
## Signal
xs = rnorm( mean=0, sd=1, n=10000)
ys = rnorm( mean=1, sd=1, n=10000)
typs = rep( x=1, n=10000 )
sig = data.frame( typs, xs, ys )
colnames(sig) = c("z","x","y")
sig_train = sig[c(1:5000),]
sig_test = sig[c(5001:10000),]
## Background
xb = rnorm( mean=1, sd=1, n=10000)
yb = rnorm( mean=0, sd=1, n=10000)
typb = rep( x=-1, n=10000 )
bkg = data.frame( typb, xb, yb )
colnames(bkg) = c("z","x","y")
bkg_train = bkg[c(1:5000),]
bkg_test = bkg[c(5001:10000),]
## Training
trainData = rbind( sig_train, bkg_train )
nnRes = nnet( z ~ ., trainData, size = 2, rang = 0.5, maxit = 100)
print(nnRes)
## Testing
sigNNPred = predict(nnRes, sig_test )
bkgNNPred = predict(nnRes, bkg_test )
当看到sigNNPred时我只有零!
所以要么我的NN的配置不合适,要么我看错了。
欢迎任何提示。
提前致谢,
济
答案 0 :(得分:2)
对目标值存在误解(在您的情况下,列'z')。如果要进行分类,则必须将目标列转换为因子,或者必须使用0/1而不是-1/1。否则,-1值远远超出激活函数的可能范围(除非使用linout = TRUE,这对分类没有意义)。
我尝试使用z作为一个因素的代码,并且正如Fernando先前所建议的那样,当调用predict时,类型='class'现在很好地工作,尽管你的两个类重叠太多以至于不能提供合适的分类精度。 / p>
干杯,UBod