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, ...)
-
x: 爲一個矩陣或數據框,對於非數值型變量將被忽略
- 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