【问题标题】:How to unscale Neural Network Predictions如何对神经网络预测进行缩放
【发布时间】:2020-03-21 08:39:40
【问题描述】:

我扩展了我的数据并在训练集上运行了神经网络模型,结果很好,所以我在新数据上进行了尝试。但是我的输出仍然按比例缩小,我可以取消比例吗?我使用我的整个数据库 (totalann_dbase_z) 进行训练,预测集是具有相同变量 (week12_dbase) 的全新数据框,但尚未包含任何目标变量数据,因为游戏尚未开始。

week12_train <- totalann_dbase_z[1:162, ] 
week12_test <- week12_dbase_z[1:14, ] 
week12_model <- neuralnet(ï..Total.Pts ~ ., data = week12_train)  
week12_model_results <- compute(week12_model, week12_test[1:31]) 
print(week12_model_results$net.result)

[,1] 
1  -0.3159784 
2   0.9800863 
3  -0.5324439 
4   0.9407832 
5  -0.5324439 
6   0.8970504 
7  -0.5290323 
8  -0.5324439 
9  -0.5324439 
10 -0.5324439 
11 -0.5324439 
12 -0.5324438 
13  0.9800683 
14  0.9800864

有任何简洁的方法来取消缩放该向量/列吗?也许创建一个函数?还是已经有 unscale() 命令?我为了好玩而尝试了 unscale(),但遇到了它从未听说过的错误。

【问题讨论】:

  • 您显示的不是有效的 R 代码。如果您使用了scale 函数,请注意原始均值和标准差已作为属性保留。乘以标准差并加上平均值将取消预测。
  • 我是 R 新手,所以“无效”是什么意思?我假设“无效”意味着我收到错误。

标签: r dataframe neural-network scale


【解决方案1】:

无论您使用哪种取消缩放方法,您要做的第一件事就是保留您之前用于缩放数据的缩放因子。如果我没记错的话,这些来自训练数据中的所有列。比例因子的标准属性是每列的平均值和标准差。 scale() 函数将自动按列缩放数字矩阵或数据框。它将每列的平均值和标准差作为其属性中的比例因子。两列数据框的缩放过程示例如下。

data.1 <- data.frame(c1 = rnorm(10), c2 = rnorm(10, 5, 2))

数据是

(data.1)

##            c1           c2
## 1   0.3772471 -0.009461602
## 2   0.4699993  6.437574717
## 3   0.7436121  2.491381059
## 4  -0.6511270  5.087134339
## 5  -1.0583016  6.618780052
## 6   1.4937440  6.102453550
## 7   0.3884317  4.856061369
## 8   0.4208206  5.548549865
## 9  -2.2471531  5.277538678
## 10 -0.2600908  7.497727819

缩放版本是

data.1.scaled <- scale(data.1)
(data.1.scaled)
##               c1          c2
##  [1,]  0.3860826 -2.26312966
##  [2,]  0.4735246  0.65482868
##  [3,]  0.7314726 -1.13123675
##  [4,] -0.5834152  0.04361314
##  [5,] -0.9672784  0.73684305
##  [6,]  1.4386581  0.50315129
##  [7,]  0.3966269 -0.06097155
##  [8,]  0.4271614  0.25245193
##  [9,] -2.0880661  0.12979102
## [10,] -0.2147666  1.13465886
## attr(,"scaled:center")
##          c1          c2 
## -0.03228177  4.99077398 
## attr(,"scaled:scale")
##       c1       c2 
## 1.060729 2.209434

属性scaled:center 是每列的平均值,scaled:scale 是标准差。我们可以将这些属性用作其他数据的缩放因子。

data.2 <- data.frame(c1 = rnorm(5, 5, 2), c2 = rnorm(5, 10,3))

第二条数据:

(data.2)
##         c1       c2
## 1 3.383793 9.790161
## 2 4.942863 8.953490
## 3 6.142607 9.301666
## 4 9.194484 8.823053
## 5 5.442842 7.044456

使用data.1缩放因子缩放的data.2:

data.2.scaled <- scale(data.2, center = attr(data.1.scaled, 'scaled:center'), scale = attr(data.1.scaled, 'scaled:scale'))

data.2 的缩放版本:

(data.2.scaled)
##            c1       c2
## [1,] 3.220498 2.172225
## [2,] 4.690309 1.793544
## [3,] 5.821365 1.951129
## [4,] 8.698517 1.734507
## [5,] 5.161664 0.929506
## attr(,"scaled:center")
##          c1          c2 
## -0.03228177  4.99077398 
## attr(,"scaled:scale")
##       c1       c2 
## 1.060729 2.209434

请注意,属性显示在与数据列长度相同的向量变量中。它还可以用于对缩放的数据进行缩放。我们可以使用apply()t() 函数来执行该过程。

到data.1:

data.1.unscaled <- t(apply(data.1.scaled, 1, function(input) {
  (input * attr(data.1.scaled, 'scaled:scale')) +
    attr(data.1.scaled, 'scaled:center')
}))

到data.2:

data.2.unscaled <- t(apply(data.2.scaled, 1, function(input) {
  (input * attr(data.1.scaled, 'scaled:scale')) +
    attr(data.1.scaled, 'scaled:center')
}))

现在让我们检查未缩放的数据和原始数据,它们必须相同。

cbind(data.1, data.1.unscaled)
##            c1           c2         c1           c2
## 1   0.3772471 -0.009461602  0.3772471 -0.009461602
## 2   0.4699993  6.437574717  0.4699993  6.437574717
## 3   0.7436121  2.491381059  0.7436121  2.491381059
## 4  -0.6511270  5.087134339 -0.6511270  5.087134339
## 5  -1.0583016  6.618780052 -1.0583016  6.618780052
## 6   1.4937440  6.102453550  1.4937440  6.102453550
## 7   0.3884317  4.856061369  0.3884317  4.856061369
## 8   0.4208206  5.548549865  0.4208206  5.548549865
## 9  -2.2471531  5.277538678 -2.2471531  5.277538678
## 10 -0.2600908  7.497727819 -0.2600908  7.497727819


cbind(data.2, data.2.unscaled)
##         c1       c2       c1       c2
## 1 3.383793 9.790161 3.383793 9.790161
## 2 4.942863 8.953490 4.942863 8.953490
## 3 6.142607 9.301666 6.142607 9.301666
## 4 9.194484 8.823053 9.194484 8.823053
## 5 5.442842 7.044456 5.442842 7.044456

如果您有一个缩放值(我从两个数据框的第 2 列采样)并希望使用某个缩放因子(例如第 2 列)对其进行未缩放,

set.seed(1)
one.column.scaled <- data.frame(x = sample(c(data.1.scaled[,2], data.2.scaled[,2]), 5))
(one.column.scaled)
##             x
## 1  0.12979102
## 2  0.04361314
## 3 -0.06097155
## 4 -2.26312966
## 5  0.65482868

那么您可以在不调用apply()t() 函数的情况下执行缩放过程。

one.column.unscaled <- (one.column.scaled * attr(data.1.scaled, 'scaled:scale')[2]) + 
  attr(data.1.scaled, 'scaled:center')[2]

(one.column.unscaled)
##              x
## 1  5.277538678
## 2  5.087134339
## 3  4.856061369
## 4 -0.009461602
## 5  6.437574717

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 2020-02-23
    • 2013-01-17
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2017-12-02
    • 2020-08-10
    • 2018-08-11
    相关资源
    最近更新 更多