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