📜  如何规范化和标准化 R 中的数据?

📅  最后修改于: 2022-05-13 01:55:19.215000             🧑  作者: Mango

如何规范化和标准化 R 中的数据?

在本文中,我们将研究在 R 编程语言中缩放数据、最小最大归一化、Z 分数标准化和对数转换的各种技术。

加载所需的包和数据集:

让我们安装并加载所需的包。并创建一个数据框作为示例数据集。

R
# load packages and data
install.packages("caret")
library(caret)
 
# creating a dataset
data = data.frame(var1=c(120, 345, 145, 122, 596, 285, 211),
                  var2=c(10, 15, 45, 22, 53, 28, 12),
                  var3=c(-34, 0.05, 0.15, 0.12, -6, 0.85, 0.11))
 
data


R
# import the library
library(caret)
 
# creating the dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# summary of data
summary(data)


R
# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# custom function to implement min max scaling
minMax <- function(x) {
  (x - min(x)) / (max(x) - min(x))
}
 
#normalise data using custom function
normalisedMydata <- as.data.frame(lapply(data, minMax))
head(normalisedMydata)


R
# checking summary after normalization
summary(normalisedMydata)


R
# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# preprocess the data
preproc <- preProcess(mydata, method=c("range"))
 
# perform normalization
norm <- predict(preproc, mydata)
head(norm)


R
# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# log transform on var2 column of data
logTransformed = log(mydata$var2)
logTransformed


R
# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# standardize the data using scale() function
standardizedData <- as.data.frame(scale(data))
head(standardizedData)


R
# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# using caret lib to preprocess data
preproc1 <- preProcess(data, method=c("center", "scale"))
 
# standardize the preprocessed data
norm1 <- predict(preproc1,data)
head(norm1)


输出

数据摘要:

让我们在缩放数据之前检查一下数据的摘要。正如我们从输出中看到的那样,每个变量/特征都有不同的值范围(可以从最小值和最大值推断出来),因此需要缩放以使值在固定范围内。

R

# import the library
library(caret)
 
# creating the dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# summary of data
summary(data)


输出

正常化:

方法 1:Min-Max 归一化

该技术将值重新调整到 0 和 1 之间的范围内。此外,数据最终具有较小的标准偏差,这可以抑制异常值的影响。

示例:让我们编写一个自定义函数来实现 Min-Max Normalization。

最小-最大归一化

这是最小-最大归一化的公式。让我们使用这个公式并创建一个自定义的用户定义函数minMax,它一次接收一个值并计算缩放值,使其介于 0 和 1 之间。这里 new_max(A) 为 1,new_min(A) 为 0当我们尝试按比例缩小/放大[0,1]范围内的值时。

这有助于很好地处理异常值并整体抑制它们。

R

# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# custom function to implement min max scaling
minMax <- function(x) {
  (x - min(x)) / (max(x) - min(x))
}
 
#normalise data using custom function
normalisedMydata <- as.data.frame(lapply(data, minMax))
head(normalisedMydata)


输出

现在让我们使用数据摘要检查 4 列的值是否在 0 和 1 之间重新调整(最小值和最大值分别为 0 和 1)。

R

# checking summary after normalization
summary(normalisedMydata)

输出

示例:使用内置函数和 caret 包执行 Min-Max 标准化

这里的方法 preProcess() 采用一个值为“range”的元组来实现 min-max 缩放,并将此预处理数据发送到 predict()函数,以使用 min-max 缩放方法获得最终的归一化数据。

句法:

论据:

  • x - 矩阵或数据框
  • 方法 - 指定处理类型的字符向量
  • na.remove – true/false 指定删除缺失值

R

# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# preprocess the data
preproc <- preProcess(mydata, method=c("range"))
 
# perform normalization
norm <- predict(preproc, mydata)
head(norm)


输出

这种技术倾向于将重新缩放的数据集中在平均值周围,但它不能很好地处理异常值。因此,为了解决这个问题,我们寻求标准化。

方法二:对数转换

并非所有现实生活中的数据都遵循高斯分布,也不会减少偏斜。所以可以使用对数转换技术来解决这个问题。

示例:使用 log()函数

让我们记录转换数据中的特定列 var2 并查看它的摘要。

句法:

log(x, base = exp(1))

论据:

  • x – 数字或复数向量
  • 基数——正数或复数

Log( )函数接收数据的数值向量或复数向量,并进行对数转换。

R

# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# log transform on var2 column of data
logTransformed = log(mydata$var2)
logTransformed

输出

日志转换

标准化:

标准化是一种技术,其中所有特征的均值都在零附近,并且具有大致单位方差(均值 = 0 和标准差 = 1)。并确保异常值的权重高于其他值。

示例:使用标准比例()函数

函数:

scale(x, center = TRUE, scale = TRUE)

论据:

  • x - 一个数字矩阵(如对象)
  • center – 长度等于 x 的列数的逻辑值或类似数字的向量
  • scale – 一个逻辑值或长度等于 x 的列数的类似数字的向量

scale( )函数(R 中 caret 包的一部分)接收一个矩阵或数据框对象并缩放数据点,使均值和标准差分别为 0 和 1。

R

# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# standardize the data using scale() function
standardizedData <- as.data.frame(scale(data))
head(standardizedData)


输出

示例:使用插入符号库中的内置函数对数据进行预处理然后标准化。

这里的方法 preProcess( ) 将采用值“center”和“scale”的元组来实现标准化。该预处理数据被发送到 predict() 以标准化数据,使得均值为 0,标准差为 1。

R

# import the library
library(caret)
 
# dataset
data = data.frame(var1 = c(120,345,145,122,596,285,211),
           var2 = c(10,15,45,22,53,28,12),
           var3 = c(-34,0.05,0.15,0.12,-6,0.85,0.11))
 
# using caret lib to preprocess data
preproc1 <- preProcess(data, method=c("center", "scale"))
 
# standardize the preprocessed data
norm1 <- predict(preproc1,data)
head(norm1)


输出