微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反转特征缩放

如何解决反转特征缩放

在我的 dataset 中,我有一个二进制 Target(0 或 1)变量和 8 个特征:ncharrtcTmean、{{ 1}}、week_dayhourntagsnlinksnex一个因子,而其他的是数字。我构建了一个决策树分类器,但我的问题涉及特征缩放:

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)]) Tmean=-0.057 是两个分裂点。如何恢复这两个特征的原始值,即ntags=2执行重新缩放操作之前由变量假定的值。

解决方法

如果数据用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。