【R语言】数据标准化处理

1、标准化——数据处理


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, ...)  

  1. x: 为一个矩阵或数据框,对于非数值型变量将被忽略  

  2. method: 指定数据标准化的方法,默认为“center”和“scale”。(必须同时使用这两个,若选一个只能对应中心化或均值化)
  • 其中center表示预测变量值减去均值;scale表示预测变量值除以标准差,故默认标准化方法就是(x-mu)/std(x−mu)/std。
  • 如果使用range方法,则数据标准为[0,1]的范围,即(x-min)/(max-min)(x−min)/(max−min)。
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:指定需要处理的新数据集

2. iris实例 ————scale(均值方差标准化)

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

3. iris实例————max-min(标准化)

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

4. 还原标准化数据—–salce(均值-方差标准化)

比如: 我们经常对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

5. 还原标准化数据—–max-min

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

6. 还原标准化数据—DMwR::unscale()函数

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

你可能感兴趣的:(统计检验及R语言)