【问题标题】:Denormalize values after prediction in R在 R 中预测后对值进行非规范化
【发布时间】:2013-08-10 01:11:08
【问题描述】:

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

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

之后,一些数据用于制作模型,一些用于预测。假设pred.ny 是预测值。这些值是标准化的。

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

这是正确的吗?它是如何工作的?很明显,一个输入可以使用以前用于标准化的最小值和最大值。但是,如果每个输入都使用自己的最小值和最大值分别进行归一化,它会如何工作呢?

更新 这是一个玩具示例,其中“0_1”看起来比“规范”更好。 '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,而不是在训练的上下文中。我希望x 的第一行ry 的第一行r 将用于训练。其余部分,N-r 用于预测。
  • 是的,你是对的。我正在使用输入和输出变量训练神经网络。抱歉,如果不清楚。我对变量名称做了一些修正。
  • 看来我明白我的问题的解决方案了。我应该将 y 用于非规范化数据。我想这是一个很好的解决方案。 pred.y &lt;- denormalizeData(pred.ny, getNormParameters(ny))
  • 很高兴我的评论对您有所帮助。我当时正忙着写答案,所以没有看到您的评论:请看一下,尽管您似乎已经在那儿了!
  • 再看一遍,一个微妙的点是我认为您应该使用您用于培训y 的值进行非规范化。我认为可能在训练中使用用于X 的归一化参数对您预测的X 值进行归一化会更好。

标签: r denormalization


【解决方案1】:

这里发生了两件事:

  1. 训练您的模型,即在神经网络中设置内部系数。为此,您需要同时使用输入和输出。
  2. 使用模型,即使用固定内部系数获得预测。

对于第 1 部分,您已决定对数据进行规范化。所以神经网络对标准化数据起作用。所以你已经训练了神经网络

  • 在输入 fX(X) 而不是 X 上,其中 fX 是您用于原始输入矩阵的变换生成标准化的输入。
  • 在输出 fy(y) 而不是 y 上,其中 fy 是您应用于输出向量的变换得到标准化的输出。

就您的原始输入和输出而言,您经过训练的机器现在看起来像这样:

  • 对输入应用归一化函数 fX 以获得归一化的输入 fX(X)。
  • 使用归一化输入运行神经网络以生成归一化输出 fy(y)。
  • 将反规范化函数 fy-1 应用于归一化输出 fy(y) 以获得 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 documentation 这个工具并没有' 似乎不存在(但是,自己编写会很容易)。使用整个 X 矩阵(即包括训练数据)对预测特征进行归一化可能是可以的。 (我还可以看到,使用 RSNNS 提供的默认 z 分数归一化可能比您使用的“0_1”选项更好。)

【讨论】:

  • 感谢您的回答。你可能想说pred.y &lt;- denormalizeData(pred.ny, getNormParameters(nty)) 或者我错过了什么?关于标准化,是的,为了标准化我使用整个 X 矩阵的预测特征。我真的不明白为什么,但“0_1”规范化更好。如果我使用另一个我得到几乎恒定的答案。请看我的更新消息。
  • @luckyi 谢谢,我在您的评论之前编辑了答案,将ny 替换为nty。也许您正在查看我的原始答案,并且我期待您的评论?我们似乎不断地让我们的电线交叉! :)
猜你喜欢
  • 2015-11-26
  • 2023-03-29
  • 2013-03-08
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2016-11-12
  • 2010-11-16
相关资源
最近更新 更多