【问题标题】:Invert feature scaling反转特征缩放
【发布时间】:2021-06-22 02:42:41
【问题描述】:

在我的dataset 中,我有一个二进制Target(0 或1)变量和8 个特征:ncharrtcTmeanweek_dayhourntagsnlinksnexweek_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.057ntags=2 是两个分裂点。如何恢复这两个特征的原始值,即scale()进行缩放操作之前变量假定的值。

【问题讨论】:

    标签: r feature-scaling


    【解决方案1】:

    如果使用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 的输出结果。

    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
    

    【讨论】:

    • 谢谢!但似乎该功能并未影响我的数据框。值没有改变。
    • @Mark 你把结果分配回df了吗?
    • 是的,training_settest_set 是数据框。但是,问题可能是attr(training_set, "scaled:center") 返回NULL。我无法解释为什么。
    • @Mark 在您发布的代码中,training_set 未缩放。因此,没有理由设置 "scaled:*" 属性。
    • 很抱歉,我忘了包括特征缩放部分。
    猜你喜欢
    • 2020-05-31
    • 2020-04-21
    • 2020-09-24
    • 2019-03-21
    • 1970-01-01
    • 2019-10-10
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多