在R中对预测结果进行反规范化

3

我不确定我是否正确地去规范化数据。我有一个输出变量和多个输入变量。我使用RSNNS包对它们进行规范化。假设x是一个输入矩阵(N x M),其中每个N行都是一个具有M特征的对象。而y是一个向量(N),其对应的答案。

nx <- normalizeData(x, type='0_1')

接下来,一些数据用于建立模型,另一些数据用于预测。假设pred.ny是预测值。这些值已经被标准化。

pred.y <- denormalizeData(pred.ny, getNormParameters(nx))

这是否正确?它如何工作?对于一个输入,通过使用先前用于归一化的最小值和最大值是清晰的。但是,如果每个输入都使用自己的最小值和最大值进行单独的归一化,它如何工作呢?

更新 这里有一个玩具示例,其中“0_1”看起来比“norm”更好。“norm”会产生巨大的训练误差,并且几乎是恒定的预测。

x <- runif(1020, 1, 5000)
y <- sqrt(x)
nx <- normalizeData(x, type='0_1')
ny <- normalizeData(y, type='0_1')
model <- mlp(nx[1:1000], ny[1:1000], size = 1)
plotIterativeError(model)
npy <- predict(model, matrix(nx[1001:1020], ncol=1))
py <- denormalizeData(npy, getNormParameters(ny))
print(cbind(y[1001:1020], py))

我不太明白。你难道不是使用由特征和输出组成的训练集来训练你的神经网络吗?但是你只在获取预测值的上下文中提到了 y,而没有在训练的上下文中提到。我期望前 r 行的 x 和前 r 行的 y 会被用于训练,而剩余的 N-r 则用于预测。 - TooTone
是的,你说得对。我正在使用输入和输出变量训练神经网络。如果不清楚,我很抱歉。我已经修复了变量名称。 - luckyi
看起来我明白了解决我的问题的方法。我应该使用y来进行数据反归一化。我认为这是一个好的解决方案。pred.y <- denormalizeData(pred.ny, getNormParameters(ny)) - luckyi
很高兴我的评论对你有帮助。当时我没看到你的评论,因为我正忙着写答案:请看一下,尽管看起来你已经在那里了! - TooTone
再看一遍,一个微妙的要点是我认为你应该使用训练中使用的“y”值来进行反规范化。在我的意见中,也可以通过使用训练中使用的规范化参数来规范化你所预测的“X”值。 - TooTone
显示剩余2条评论
1个回答

3
这里有两件事情需要注意:
  1. 训练模型,即设置神经网络中的内部系数。您使用输入和输出来完成此操作。
  2. 使用模型,即使用固定的内部系数进行预测。
对于第一部分,您决定对数据进行归一化处理。因此,神经网络使用的是归一化数据。您已经训练好了神经网络:
  • 在输入上使用fX(X)而不是 X 进行训练,在此 fX 是您用于将原始输入矩阵转换为归一化输入的变换函数。
  • 在输出上使用fy(y)而不是 y 进行训练,在此 fy 是您应用于输出向量以获得归一化输出的变换函数。
就您的原始输入和输出而言,您训练好的机器现在看起来像这样:
  • 应用归一化函数 fX 到输入,以获取归一化输入 fX(X)。
  • 使用归一化输入运行神经网络以生成归一化输出 fy(y)。
  • 将归一化输出 fy(y) 应用反归一化函数 fy-1,以获取 y。
请注意,fX(X) 和 fy,因此 fy-1,均在训练集上定义。
因此,您可能会在 R 中编写以下内容以获取训练数据并对其进行归一化处理(前100行)。
tx <- x[1:100,]
ntx <- normalizeData(tx, type='0_1')
ty <- y[1:100]
nty <- normalizeData(ty, type='0_1')

还有一些类似的方法可以对预测结果进行去规范化处理

pred.y <- denormalizeData(pred.ny, getNormParameters(nty))
                                                       # nty (or ny) not nx here

我有些担忧的是,在进行预测时,我更喜欢使用与训练时相同的变换fX来对所用特征进行归一化。但是查看RSNNS文档时发现,似乎没有提供这种功能(不过自己编写功能也很容易)。可以考虑使用整个X矩阵(包括训练数据)来归一化预测特征。(我也可以看到,使用RSNNS提供的默认归一化为z-score可能比你使用的“0_1”选择更好。)

谢谢你的回答。 你可能想说 pred.y <- denormalizeData(pred.ny, getNormParameters(nty)),或者我有什么遗漏吗? 关于归一化,是的,为了归一化预测特征,我使用整个X矩阵。我不太明白为什么,但“0_1”归一化更好。如果我使用其他方法,得到的几乎是恒定的答案。请看我的更新消息。 - luckyi
@luckyi 谢谢,我在你的评论之前编辑了答案,将 ny 替换为 nty。也许你看到的是我的原始答案,而我预料到了你的评论?我们似乎总是搞混了! :) - TooTone

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