preProcess(x, method = c("center", "scale"),
thresh = 0.95, pcaComp = NULL, na.remove = TRUE, k = 5,
knnSummary = mean, outcome = NULL, fudge = 0.2, numUnique = 3,
verbose = FALSE, freqCut = 95/5, uniqueCut = 10, cutoff = 0.9, ...) predict(object, newdata, ...)
x: 为一个矩阵或数据框,对于非数值型变量将被忽略
ppMethods <- c("BoxCox", "YeoJohnson", "expoTrans", "invHyperbolicSine",
"center", "scale", "range",
"knnImpute", "bagImpute", "medianImpute",
"pca", "ica",
"spatialSign",
"ignore", "keep",
"remove",
"zv", "nzv", "conditionalX",
"corr")
thresh:如果使用主成分分析(PCA)方法,该参数指定累计方差至少达到0.95
pcaComp:如果使用主成分分析(PCA)方法,该参数可指定保留的主成分个数,该参数的优先级高于thresh
na.remove:默认剔除缺失值数据
k:如果使用k-近邻方法填补缺失值的话,可以指定具体的k值,默认为5
knnSummary:使用k个近邻的均值替代缺失值
outcome:指定数据集的输出变量,当使用BOX-COX变换数据时,该参数需要指定输出变量
fudge:指定BOX-COX变换的lambda值波动范围
numUnique:指定多少个唯一值需要因变量y估计BOX-COX转换
verbose:指定是否需要输出详细的结果
object:为preProcess对象
newdata:指定需要处理的新数据集
library(caret)
library(dplyr)
head(scale(iris[,1:4]))
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] -0.8976739 1.01560199 -1.335752 -1.311052
## [2,] -1.1392005 -0.13153881 -1.335752 -1.311052
## [3,] -1.3807271 0.32731751 -1.392399 -1.311052
## [4,] -1.5014904 0.09788935 -1.279104 -1.311052
## [5,] -1.0184372 1.24503015 -1.335752 -1.311052
## [6,] -0.5353840 1.93331463 -1.165809 -1.048667
stand_scale <- preProcess(iris) #采用(x-mu)/std的标准化方法,与scale()函数效果一样
head(predict(stand_scale ,iris[,1:4]))
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 -0.8976739 1.01560199 -1.335752 -1.311052
## 2 -1.1392005 -0.13153881 -1.335752 -1.311052
## 3 -1.3807271 0.32731751 -1.392399 -1.311052
## 4 -1.5014904 0.09788935 -1.279104 -1.311052
## 5 -1.0184372 1.24503015 -1.335752 -1.311052
## 6 -0.5353840 1.93331463 -1.165809 -1.048667
all(scale(iris[,1:4])==predict(stand_scale ,iris[,1:4])) #中间存在误差,但是大多数以及相等了
## [1] FALSE
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
iris_max=as.data.frame(lapply(iris[1:4],normalize))
head(iris_max)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 0.22222222 0.6250000 0.06779661 0.04166667
## 2 0.16666667 0.4166667 0.06779661 0.04166667
## 3 0.11111111 0.5000000 0.05084746 0.04166667
## 4 0.08333333 0.4583333 0.08474576 0.04166667
## 5 0.19444444 0.6666667 0.06779661 0.04166667
## 6 0.30555556 0.7916667 0.11864407 0.12500000
stand_range <- preProcess(iris[1:4],method = "range")
iris_max_prePro=predict(stand_range ,iris[1:4])
head(iris_max_prePro)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 0.22222222 0.6250000 0.06779661 0.04166667
## 2 0.16666667 0.4166667 0.06779661 0.04166667
## 3 0.11111111 0.5000000 0.05084746 0.04166667
## 4 0.08333333 0.4583333 0.08474576 0.04166667
## 5 0.19444444 0.6666667 0.06779661 0.04166667
## 6 0.30555556 0.7916667 0.11864407 0.12500000
all(iris_max==iris_max_prePro)# 正常,和我们预期的一样,两个数据相等
## [1] TRUE
比如: 我们经常对train数据进行标准化,并且用train数据的参数去标准化test数据,R中没有内置的函数。
还有:有些模型和数据 存在量纲差异,需要标准化后建模,并预测,预测出来的值是标准化后的数据,此时需要把预测的数据还原成真实数据,此时就需要原始数据的标准化参数了
stand_scale <- preProcess(iris) #采用(x-mu)/std的标准化方法,与scale()函数效果一样
iris_scale=predict(stand_scale,iris[,1:4])
iris_new <- t(apply(iris_scale,1,function(x){x*stand_scale$std+stand_scale$mean}))
iris_new %>% head(.,10)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
## [7,] 4.6 3.4 1.4 0.3
## [8,] 5.0 3.4 1.5 0.2
## [9,] 4.4 2.9 1.4 0.2
## [10,] 4.9 3.1 1.5 0.1
head(iris,10)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
stand_range <- preProcess(iris[1:4],method = "range")
iris_max_prePro=predict(stand_range ,iris[1:4])
t(apply(iris_max_prePro,1,function(x){x*(stand_range$ranges[2,]-stand_range$ranges[1,])+stand_range$ranges[1,] })) %>% head(.,10)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
## [7,] 4.6 3.4 1.4 0.3
## [8,] 5.0 3.4 1.5 0.2
## [9,] 4.4 2.9 1.4 0.2
## [10,] 4.9 3.1 1.5 0.1
head(iris,10)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
unscale(vals, norm.data, col.ids)
vals : 要还原标准化的数值型矩阵,或者数值型数据框
norm.data : 以及标准化后的数据,必须是用scale()函数标准化后的数据
col.ids : 那些列可以不用标准化(默认全部列都有进行)
# 我把iris数据集分为7:3
library(caret)
library(dplyr)
library(DMwR)
## 载入需要的程辑包:grid
library(e1071)
#############################################################
########## 标准化数据
#
data(algae)
algae[,4:12] %>% head() # 可以发现数据存在量纲的差异,我们要预测a1(因变量) ,其他为自变量
## mxPH mnO2 Cl NO3 NH4 oPO4 PO4 Chla a1
## 1 8.00 9.8 60.800 6.238 578.000 105.000 170.000 50.0 0.0
## 2 8.35 8.0 57.750 1.288 370.000 428.750 558.750 1.3 1.4
## 3 8.10 11.4 40.020 5.330 346.667 125.667 187.057 15.6 3.3
## 4 8.07 4.8 77.364 2.302 98.182 61.182 138.700 1.4 3.1
## 5 8.06 9.0 55.350 10.416 233.700 58.222 97.580 10.5 9.2
## 6 8.25 13.1 65.750 9.248 430.000 18.250 56.667 28.4 15.1
normData <- scale(algae[,4:12]) # 把train数据进行标准化
t <- svm(a1 ~ .,normData[1:100,] %>% as.data.frame() ) #决策树模型
normPs <- predict(t,as.data.frame(normData[101:nrow(normData),])) # 可以发现预测的数据不是最终的数据,需要进行标准化还原
normPs %>% head() # 预测值 ,预测数据,都在0--1范围
## 1 2 3 4 5 6
## -0.4688077 -0.5577023 -0.5956463 -0.7180639 -0.4260693 -0.2741933
algae[101:nrow(normData),"a1"] %>% head()# 真实值
## [1] 16.5 7.0 58.7 8.7 17.0 12.3
unscale(normPs,normData) %>% head()#于是还原预测数据
## [,1]
## 1 7.731243
## 2 7.678057
## 3 7.655355
## 4 7.582112
## 5 7.756814
## 6 7.847682