神经网络预测对所有预测返回相同的值

14
我是一个有用的助手,可以为您翻译文本。
我正在尝试使用neuralnet包构建神经网络,但遇到了一些问题。我已经成功地使用了nnet包,但是在neuralnet包上没有成功。我已经阅读了整个文档包,但找不到解决方案,或者可能我无法发现它。
我正在使用的训练命令是:
nn<-neuralnet(V15 ~ V1 + V2 + V3 + V4 + V5 + V6 + V7 + V8 + V9 + V10 + V11 + V12 + V13 + V14,data=test.matrix,lifesign="full",lifesign.step=100,hidden=8) 

并且用于预测

result<- compute(nn,data.matrix)$net.result

训练时间比nnet训练时间长得多。我尝试使用与nnet相同的算法(反向传播而不是弹性反向传播),但没有改变激活函数(和linear.output=F)以及几乎所有其他参数,结果并没有改善。预测值都相同。我不明白为什么nnet适用于我,而neuralnet却不适用。
我真的需要一些帮助,我的对神经网络和R的理解可能是原因,但找不到原因。
我的数据集来自UCI。我想将神经网络用于二元分类。数据样本如下:
25,Private,226802,11th,7,Never-married,Machine-op-inspct,Own-child,Black,Male,0,0,40,United-States,<=50K.
38,Private,89814,HS-grad,9,Married-civ-spouse,Farming-fishing,Husband,White,Male,0,0,50,United-States,<=50K.
28,Local-gov,336951,Assoc-acdm,12,Married-civ-spouse,Protective-serv,Husband,White,Male,0,0,40,United-States,>50K.
44,Private,160323,Some-college,10,Married-civ-spouse,Machine-op-inspct,Husband,Black,Male,7688,0,40,United-States,>50K.
18,?,103497,Some-college,10,Never-married,NA,Own-child,White,Female,0,0,30,United-States,<=50K.
34,Private,198693,10th,6,Never-married,Other-service,Not-in-family,White,Male,0,0,30,United-States,<=50K.
29,?,227026,HS-grad,9,Never-married,?,Unmarried,Black,Male,0,0,40,United-States,<=50K.
63,Self-emp-not-inc,104626,Prof-school,15,Married-civ-spouse,Prof-specialty,Husband,White,Male,3103,0,32,United-States,>50K.
24,Private,369667,Some-college,10,Never-married,Other-service,Unmarried,White,Female,0,0,40,United-States,<=50K.
55,Private,104996,7th-8th,4,Married-civ-spouse,Craft-repair,Husband,White,Male,0,0,10,United-States,<=50K.
65,Private,184454,HS-grad,9,Married-civ-spouse,Machine-op-inspct,Husband,White,Male,6418,0,40,United-States,>50K.
36,Federal-gov,212465,Bachelors,13,Married-civ-spouse,Adm-clerical,Husband,White,Male,0,0,40,United-States,<=50K.
26,Private,82091,HS-grad,9,Never-married,Adm-clerical,Not-in-family,White,Female,0,0,39,United-States,<=50K.

将因素转换为数字值后,转化为矩阵:

V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11 V12 V13 V14 V15
39  7   77516   10  13  5   1   2   5   2   2174    0   40  39  0
50  6   83311   10  13  3   4   1   5   2   0   0   13  39  0
38  4   215646  12  9   1   6   2   5   2   0   0   40  39  0
53  4   234721  2   7   3   6   1   3   2   0   0   40  39  0
28  4   338409  10  13  3   10  6   3   1   0   0   40  5   0
37  4   284582  13  14  3   4   6   5   1   0   0   40  39  0
49  4   160187  7   5   4   8   2   3   1   0   0   16  23  0
52  6   209642  12  9   3   4   1   5   2   0   0   45  39  1
31  4   45781   13  14  5   10  2   5   1   14084   0   50  39  1
42  4   159449  10  13  3   4   1   5   2   5178    0   40  39  1
37  4   280464  16  10  3   4   1   3   2   0   0   80  39  1
30  7   141297  10  13  3   10  1   2   2   0   0   40  19  1
23  4   122272  10  13  5   1   4   5   1   0   0   30  39  0

预测值摘要:

      V1           
 Min.   :0.2446871  
 1st Qu.:0.2446871  
 Median :0.2446871  
 Mean   :0.2451587  
 3rd Qu.:0.2446871  
 Max.   :1.0000000  

Wilcoxon-Mann-Whitney检验的值(曲线下面积)表明预测性能与随机相当。
performance(predneural,"auc")@y.values
[1] 0.5013319126
4个回答

28
考虑神经网络出现奇怪结果的第一个原因是归一化。您的数据必须进行归一化,否则训练会导致偏斜的NN,它将产生相同的结果,这是常见症状。
查看您的数据集,存在>>1的值,这意味着NN本质上将它们全部处理为相同的值。原因是传统使用的响应函数在围绕0的某个范围之外(几乎)是恒定的。
在将数据馈送到神经网络之前,请始终对其进行归一化。

1
我想补充一下,这是非常正确的答案。我曾经遇到过同样的问题,但我的数据只被归一化到了 1。因此,我的大部分值都在 0.9 - 1 的范围内。我感觉这不太对。解决方案:将数据归一化到 0-1 或接近于 0 的一些数字,如果你必须避免 0 数字,但 0-1 更好 :) - Grzegorz Krug
完美的答案,我的值在5000到15000之间,通过归一化它们(value/10000),神经网络能够计算它。但我不得不将我的stepmax值更改为1e7。希望这可以帮助。 - Fabi0

6
与@sashkello的答案类似,我以前遇到过类似的问题,当我的数据没有正确规范化时就会出现这种情况。一旦我对数据进行了规范化,一切都运行得很正常。
最近,我再次面临这个问题,在调试后,我发现神经网络给出相同输出的另一个原因可能是你的神经网络具有权重衰减项,例如在RSNNS包中,请确保您的衰减项不要太大,以至于所有权重都基本上变成0。
我在R中使用caret包。最初,我使用的衰减超参数为0.01。当我查看诊断信息时,我发现RMSE正在为每个折叠(交叉验证)计算,但R平方始终为NA。在这种情况下,所有预测结果都是相同的值。
一旦我将衰减降低到更低的值(1E-5及以下),我获得了预期的结果。
希望这可以帮到你。

0

如果有人遇到同样的问题,我通过在定义神经网络时使用参数rep来解决它。如果您不设置这个参数,似乎网络的训练只会进行一次,这导致网络返回一个相同值的向量(或者非常相似的值,例如0.99872和0.97891)。

我认为问题也可能出现在err.fct参数的默认值上,对于二元分类,我将其设置为ce

以下是产生正常结果的代码:

library(neuralnet)

model <- neuralnet(formula = allow ~ .,
                   data = podaci_train,
                   linear.output = FALSE, 
                   err.fct = "ce",
                   hidden = 4,
                   rep = 3)

predictions <- compute(model, subset(podaci_test, select = -c(allow)))
predictions <- predictions$net.result
max(predictions)
min(predictions)

这是输出结果(最大概率 - 94.57%,最小概率 - 0.01%):

[1] 0.9456731
[1] 0.0009583263

rep 的使用会导致在 RStudio 绘图时出现一些奇怪的行为,因为不同训练迭代中存在多个模型。因此,如果您不想因过多绘图而使环境崩溃,请使用额外的参数:

plot(model, rep = 'best')

0
我在这里添加这个,是为了任何可能遇到跟我一样问题的人。
如果上述任何方法都没有奏效,并且您正在使用自定义训练循环的TensorFlow,请确保像以下这样设置training=True
predictions = model(inputs, training=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接