首页 > 解决方案 > 反转特征缩放

问题描述

在我的dataset我有一个二进制Target(0 或 1)变量和 8 个特征:ncharrtcTmeanweek_dayhourntags和. 是一个因素,而其他因素是数字。我建立了一个决策树分类器,但我的问题涉及特征缩放:nlinksnexweek_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)])

模型返回它Tmean=-0.057并且ntags=2是两个分裂点。我怎样才能恢复这两个特征的原始值,即由scale().

标签: rfeature-scaling

解决方案


如果数据用 缩放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 但其输出的类是"matrix",而不是原始的"data.frame"。这是scale's 输出的结果。

B <- as.data.frame(matrix(A, ncol = 5))
s2 <- scale(B)
B2 <- as.data.frame(unscale(s2))
all.equal(B, B2)
#[1] TRUE

但是,使用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

推荐阅读