用于训练和测试数据的r中的最小最大缩放/归一化

Jas*_*hah 2 r

我正在寻找一个将训练集和测试集作为参数的函数,最小-最大缩放/归一化并返回训练集,并使用最小和范围的相同值来最小-最大缩放/归一化并返回测试集。

到目前为止,这是我想出的功能:

min_max_scaling <- function(train, test){

  min_vals <- sapply(train, min)
  range1 <- sapply(train, function(x) diff(range(x)))

  # scale the training data

  train_scaled <- data.frame(matrix(nrow = nrow(train), ncol = ncol(train)))

  for(i in seq_len(ncol(train))){
    column <- (train[,i] - min_vals[i])/range1[i]
    train_scaled[i] <- column
  }

  colnames(train_scaled) <- colnames(train)

  # scale the testing data using the min and range of the train data

  test_scaled <- data.frame(matrix(nrow = nrow(test), ncol = ncol(test)))

  for(i in seq_len(ncol(test))){
    column <- (test[,i] - min_vals[i])/range1[i]
    test_scaled[i] <- column
  }

  colnames(test_scaled) <- colnames(test)

  return(list(train = train_scaled, test = test_scaled))
}
Run Code Online (Sandbox Code Playgroud)

最小最大缩放比例的定义类似于之前在SO上提出的问题- 使用最小和最大值对两列数据进行规范化

我的问题是:
1.是否可以向量化for函数中的两个循环?例如,使用sapply()
2。是否有任何软件包可以让我们执行我们在此打算做的事情?

小智 17

这是最小-最大归一化的代码。有关公式以及执行特征缩放的其他方法,请参阅此Wikipedia 页面

normalize <- function(x, na.rm = TRUE) {
    return((x- min(x)) /(max(x)-min(x)))
}
Run Code Online (Sandbox Code Playgroud)

要获取向量,请使用apply代替lapply

normalize <- function(x, na.rm = TRUE) {
    return((x- min(x)) /(max(x)-min(x)))
}
Run Code Online (Sandbox Code Playgroud)

更新以解决Holger的建议。

如果您想将其他参数传递给min()and max(),例如,na.rm,那么您可以使用:

as.data.frame(apply(df$name, normalize))
Run Code Online (Sandbox Code Playgroud)

请记住,无论您通过min()省略号传递给什么,...您也隐式传递给max(). 在这种情况下,这不应该是因为这两个大的问题min(),并max()共享相同的函数签名。

  • 如果它可以公开 min 和 max 用来处理 NA 的 na.rm 参数,我会更想要这个答案 (2认同)

Joh*_*han 6

关于第二个问题,您可以使用该caret软件包:

library(caret)

train = data.frame(a = 1:3, b = 10:12)
test = data.frame(a = 1:6, b = 7:12)

pp = preProcess(train, method = "range")


predict(pp, train)

#     a   b
# 1 0.0 0.0
# 2 0.5 0.5
# 3 1.0 1.0

predict(pp, test)

#     a    b
# 1 0.0 -1.5
# 2 0.5 -1.0
# 3 1.0 -0.5
# 4 1.5  0.0
# 5 2.0  0.5
# 6 2.5  1.0
Run Code Online (Sandbox Code Playgroud)

该软件包还定义了其他转换方法,请参见:http : //machinelearningmastery.com/pre-process-your-dataset-in-r/