如何规范化和标准化 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 缩放方法获得最终的归一化数据。
句法:
preProcess(x, method = c(“center”, “scale”), … na.remove = TRUE )
论据:
- 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)
输出: