我正在寻找一个将训练集和测试集作为参数的函数,最小-最大缩放/归一化并返回训练集,并使用最小和范围的相同值来最小-最大缩放/归一化并返回测试集。
到目前为止,这是我想出的功能:
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()共享相同的函数签名。
关于第二个问题,您可以使用该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/