【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章