如何缩放神经网络预测

时间:2019-11-26 01:03:31

标签: r dataframe neural-network scale

我缩放了数据,并在训练集上运行了神经网络模型,结果显示很好,因此我在新数据上进行了尝试。但是我的输出仍然按比例缩小,我可以取消缩放比例吗?我使用了整个数据库(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()很有趣,但是却遇到了从未听说过的错误。

1 个答案:

答案 0 :(得分:2)

无论使用哪种缩放方法,首先要做的就是保留以前用于缩放数据的缩放因子。如果我没记错的话,它们来自您训练数据的所有列。比例因子的标准属性是每列的平均值和标准偏差。 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.2使用data.1缩放因子:

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

数据的缩放版本。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()函数来执行该过程。

到数据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')
}))

到数据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