反转特征缩放
Invert feature scaling
在我的 dataset
中,我有一个二进制 Target
(0 或 1)变量和 8 个特征:nchar
、rtc
、Tmean
、 week_day
、hour
、ntags
、nlinks
和 nex
。 week_day
是一个因素,而其他是数字。我构建了一个决策树分类器,但我的问题涉及特征缩放:
library(caTools)
set.seed(123)
split = sample.split(dataset$Target, SplitRatio = 0.75)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)
# Feature Scaling
training_set[-c(2,4)] = scale(training_set[-c(2,4)])
test_set[-c(2,4)] = scale(test_set[-c(2,4)])
模型returns,Tmean=-0.057
和ntags=2
是两个分裂点。如何恢复这两个特征的原始值,即在 scale()
.
执行的重新缩放操作之前由变量假定的值
如果数据是用scale
缩放的,下面的函数unscale
可能有助于解决问题。
由于浮点精度,原始向量和未缩放的向量是 all.equal
但不是 identical
。
unscale <- function(x){
xbar <- attr(x, "scaled:center")
se <- attr(x, "scaled:scale")
if(is.null(xbar) & is.null(se)){
x
} else {
y <- t(se * t(x) + xbar)
attr(y, "scaled:center") <- NULL
attr(y, "scaled:scale") <- NULL
y
}
}
set.seed(2020)
A <- matrix(rnorm(120, sd = 16), ncol = 5)
s <- scale(A)
identical(A, unscale(s)) #FALSE
zeros <- as.vector(A - unscale(s))
all.equal(zeros, rep(0, 120))
#[1] TRUE
该函数也适用于 data.frames,但其输出的 class 是 "matrix"
,而不是原来的 "data.frame"
。这是scale
的输出结果。
B <- as.data.frame(matrix(A, ncol = 5))
s2 <- scale(B)
B2 <- as.data.frame(unscale(s2))
all.equal(B, B2)
#[1] TRUE
但是 scaling/unscaling 具有 dim
属性的对象(例如 data.frame)的正确方法是逐个向量。例如,这可以通过 lapply
循环来完成。
s3 <- B
s3[] <- lapply(B, scale)
B3 <- s3
B3[] <- lapply(s3, unscale)
all(B - B3 < .Machine$double.eps^0.5)
#[1] TRUE
在我的 dataset
中,我有一个二进制 Target
(0 或 1)变量和 8 个特征:nchar
、rtc
、Tmean
、 week_day
、hour
、ntags
、nlinks
和 nex
。 week_day
是一个因素,而其他是数字。我构建了一个决策树分类器,但我的问题涉及特征缩放:
library(caTools)
set.seed(123)
split = sample.split(dataset$Target, SplitRatio = 0.75)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)
# Feature Scaling
training_set[-c(2,4)] = scale(training_set[-c(2,4)])
test_set[-c(2,4)] = scale(test_set[-c(2,4)])
模型returns,Tmean=-0.057
和ntags=2
是两个分裂点。如何恢复这两个特征的原始值,即在 scale()
.
如果数据是用scale
缩放的,下面的函数unscale
可能有助于解决问题。
由于浮点精度,原始向量和未缩放的向量是 all.equal
但不是 identical
。
unscale <- function(x){
xbar <- attr(x, "scaled:center")
se <- attr(x, "scaled:scale")
if(is.null(xbar) & is.null(se)){
x
} else {
y <- t(se * t(x) + xbar)
attr(y, "scaled:center") <- NULL
attr(y, "scaled:scale") <- NULL
y
}
}
set.seed(2020)
A <- matrix(rnorm(120, sd = 16), ncol = 5)
s <- scale(A)
identical(A, unscale(s)) #FALSE
zeros <- as.vector(A - unscale(s))
all.equal(zeros, rep(0, 120))
#[1] TRUE
该函数也适用于 data.frames,但其输出的 class 是 "matrix"
,而不是原来的 "data.frame"
。这是scale
的输出结果。
B <- as.data.frame(matrix(A, ncol = 5))
s2 <- scale(B)
B2 <- as.data.frame(unscale(s2))
all.equal(B, B2)
#[1] TRUE
但是 scaling/unscaling 具有 dim
属性的对象(例如 data.frame)的正确方法是逐个向量。例如,这可以通过 lapply
循环来完成。
s3 <- B
s3[] <- lapply(B, scale)
B3 <- s3
B3[] <- lapply(s3, unscale)
all(B - B3 < .Machine$double.eps^0.5)
#[1] TRUE