R语言 如何对数据进行标准化和规范化

R语言 如何对数据进行标准化和规范化

在这篇文章中,我们将研究在R编程语言中对数据进行标准化、最小-最大标准化、Z-分数标准化和对数转换的各种技术。

加载所需的软件包和数据集

让我们安装并加载所需的软件包。同时创建一个数据帧作为样本数据集。

# 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语言中对数据进行标准化和规范化?

归一化

方法1:最小-最大归一化

这种技术将数值重新划分为0和1之间的范围。同时,数据最终具有较小的标准偏差,这可以抑制异常值的影响。

示例 :让我们写一个自定义函数来实现最小-最大归一化。

如何在R语言中对数据进行标准化和规范化?

最小-最大归一化

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

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

# 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语言中对数据进行标准化和规范化?

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

# checking summary after normalization
summary(normalisedMydata)

输出:

如何在R语言中对数据进行标准化和规范化?

例子: 使用内置函数和caret包来执行最小-最大归一化

在这里,preProcess( )方法取一个值为 “range “的元组来实现最小-最大缩放,这个预处理过的数据被发送到predict( )函数,使用最小-最大缩放方法得到最终的规范化数据。

语法

preProcess(x, method = c(“center”, “scale”), … na.remove = TRUE )

参数

  • x – 一个矩阵或数据框
  • method – 一个字符向量,指定处理的类型
  • na.remove – true/false,用于指定去除缺失的值
# 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语言中对数据进行标准化和规范化?

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

方法2:对数转换

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

例子 :使用log( )函数

让我们对数据中的某一列var2进行对数转换并查看它的摘要。

语法

log(x, base = exp(1))

参数

  • x – 一个数字或复数向量
  • base- 一个正数或复数

Log( )函数接收数字向量或复数向量的数据并执行对数转换。

# 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语言中对数据进行标准化和规范化?

对数转换

标准化

标准化是一种技术,在这种技术中,所有的特征都有一个在零左右的平均值,并且有大致的单位方差(平均值=0,标准差=1)。而且还能确保异常值比其他值得到更多的权重。

例子 :使用Standard scale( )函数

函数

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

参数

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

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

# 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语言中对数据进行标准化和规范化?

例子 :使用caret库中的一个内置函数对数据进行预处理,然后进行标准化。

在这里,preProcess( )方法将接受一个带有 “中心 “和 “尺度 “值的元组来实现标准化。这个预处理过的数据被发送到predict( ),以实现数据的标准化,使其平均值为0,标准差为1。

# 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语言中对数据进行标准化和规范化?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程