使用 R 规范化数据

发布日期:2026-06-25 05:40:06   来源 : 杭州电子商务研究院    浏览量 :11
杭州电子商务研究院 发布日期:2026-06-25 05:40:06  
11

介绍

将普通的机器学习模型转变为好的机器学习模型的一种方法是通过数据标准化的统计技术。如果我们不对数据进行标准化,机器学习算法将受使用更大规模的变量的支配,从而对模型性能产生不利影响。因此,对数据进行标准化势在必行。

在本指南中,您将学习使用流行的统计编程语言 R 执行此任务的各种方法。

让我们首先查看本指南中将使用的数据。

数据

在本指南中,我们将使用一个虚构的贷款申请人数据集,其中包含 578 个观测值和 6 个变量,如下所述:

  1. 家属:申请人家属人数

  2. 收入:申请人的年收入(美元)

  3. Loan_amount:提交申请的贷款金额(美元)

  4. Term_months:贷款期限(以月为单位)

  5. Approval_status:贷款申请是否被批准(“1”)或未获批准(“0”)

  6. 年龄:申请人的年龄(岁)

让我们首先加载所需的库和数据。

      library(plyr)
library(readr)
library(ggplot2)
library(GGally)
library(dplyr)
library(mlbench)
 
dat <- read_csv("data_n.csv")
glimpse(dat)
    

输出:

      Observations: 578
Variables: 6
$ Dependents  	<int> 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 0, ...
$ Income      	<int> 183700, 192300, 222400, 240000, 213300, 263600, 256800...
$ Loan_amount 	<int> 18600, 19500, 22300, 26000, 26600, 28000, 28000, 30000...
$ Term_months 	<int> 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 204,...
$ approval_status <int> 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, ...
$ Age         	<int> 40, 63, 42, 30, 43, 46, 46, 68, 48, 72, 54, 54, 29, 70...
    

上面的输出显示数据集有六个整数变量(标记为“int”)。但是,变量“approval_status”是一个分类目标变量,不会被规范化。

我们已准备好执行最常见的数据规范化步骤。首先,使用summary()命令查看变量的摘要。

      summary(dat)
    

输出:

      Dependents     	Income     	Loan_amount   	Term_months  
 Min.   :0.0000   Min.   : 173200   Min.   :  18600   Min.   : 36.0 
 1st Qu.:0.0000   1st Qu.: 389550   1st Qu.:  61500   1st Qu.:384.0 
 Median :0.0000   Median : 513050   Median :  76500   Median :384.0 
 Mean   :0.7561   Mean   : 715589   Mean   : 333702   Mean   :365.5 
 3rd Qu.:1.0000   3rd Qu.: 774800   3rd Qu.: 136250   3rd Qu.:384.0 
 Max.   :6.0000   Max.   :8444900   Max.   :7780000   Max.   :504.0 
 
approval_status   	Age      
 Min.   :0.0000   Min.   :22.00 
 1st Qu.:0.0000   1st Qu.:37.00 
 Median :1.0000   Median :51.00 
 Mean   :0.6955   Mean   :49.71 
 3rd Qu.:1.0000   3rd Qu.:61.75 
 Max.   :1.0000   Max.   :76.00
    

上面的输出证实了数值变量具有不同的单位和尺度,例如,“年龄”以年为单位,“收入”以美元为单位。这些差异可能会对模型产生过度影响,因此我们需要缩放或转换它们。

我们将使用“R”中的caret包,这是一个功能强大的包,它使用 *** preProcess*** 函数执行不同类型的数据规范化步骤,如后续章节中所述。

标准化

标准化是一种所有特征以零为中心且具有大致单位方差的技术。

下面的第一行代码加载“caret”包,第二行预处理数据。第三行执行标准化,第四行命令打印标准化变量的摘要。

      library(caret)
 
preproc1 <- preProcess(dat[,c(1:4,6)], method=c("center", "scale"))
 
norm1 <- predict(preproc1, dat[,c(1:4,6)])
 
summary(norm1)
    

输出:

      Dependents      	Income      	Loan_amount   	Term_months 	
 Min.   :-0.7338   Min.   :-0.75854   Min.   :-0.4281   Min.   :-5.3744 
 1st Qu.:-0.7338   1st Qu.:-0.45597   1st Qu.:-0.3698   1st Qu.: 0.3021 
 Median :-0.7338   Median :-0.28325   Median :-0.3494   Median : 0.3021 
 Mean   : 0.0000   Mean   : 0.00000   Mean   : 0.0000   Mean   : 0.0000 
 3rd Qu.: 0.2367   3rd Qu.: 0.08281   3rd Qu.:-0.2683   3rd Qu.: 0.3021 
 Max.   : 5.0893   Max.   :10.80959   Max.   :10.1169   Max.   : 2.2595 
  	Age      	
 Min.   :-1.90719 
 1st Qu.:-0.87496 
 Median : 0.08846 
 Mean   : 0.00000 
 3rd Qu.: 0.82823 
 Max.   : 1.80885
    

输出显示所有数值变量都已标准化,平均值为零。

使用scale函数可以获得相同的结果,如下所示。

      dat_scaled <- as.data.frame(scale(dat[,c(1:4,6)]))
summary(dat_scaled$Income)
    

输出:

      Min.  1st Qu.   Median 	Mean  3rd Qu. 	Max.
-0.75854 -0.45597 -0.28325  0.00000  0.08281 10.80959
    

最小-最大缩放

在这种方法中,数据被缩放到固定范围——通常为 0 到 1。其影响是,我们最终会得到较小的标准差,这可以抑制异常值的影响。我们遵循与上述相同的步骤,唯一的变化是“方法”参数,其中规范化方法现在设置为“范围”。

      preproc2 <- preProcess(dat[,c(1:4,6)], method=c("range"))
 
norm2 <- predict(preproc2, dat[,c(1:4,6)])
 
summary(norm2)
    

输出:

      Dependents     	Income     	Loan_amount    	Term_months	
 Min.   :0.0000   Min.   :0.00000   Min.   :0.000000   Min.   :0.0000 
 1st Qu.:0.0000   1st Qu.:0.02616   1st Qu.:0.005527   1st Qu.:0.7436 
 Median :0.0000   Median :0.04109   Median :0.007460   Median :0.7436 
 Mean   :0.1260   Mean   :0.06557   Mean   :0.040599   Mean   :0.7040 
 3rd Qu.:0.1667   3rd Qu.:0.07273   3rd Qu.:0.015158   3rd Qu.:0.7436 
 Max.   :1.0000   Max.   :1.00000   Max.   :1.000000   Max.   :1.0000 
  	Age       
 Min.   :0.0000 
 1st Qu.:0.2778 
 Median :0.5370 
 Mean   :0.5132 
 3rd Qu.:0.7361 
 Max.   :1.0000
    

上面的输出显示所有值都已缩放到 0 到 1 之间。

对数转换

许多机器学习算法要求变量服从正态分布。然而,在现实世界中,数据往往存在偏差,不服从正态分布。解决这个问题的一种方法是对变量进行对数变换。

下面的第一行代码打印了“收入”变量的摘要。输出显示申请人的平均收入和中位收入分别为 715,589 美元和 513,050 美元。

第二条命令执行对数变换,第三行打印变换后变量的摘要。输出显示新的变换后变量的平均值和中位数相似。

      summary(dat$Income)
 
logincome = log(dat$Income)
 
summary(logincome)
    

输出:

      Min. 1st Qu.  Median	Mean 3rd Qu.	Max.
 173200  389550  513050  715589  774800 8444900
 
 
  Min. 1st Qu.  Median	Mean 3rd Qu.	Max.
  12.06   12.87   13.15   13.26   13.56   15.95
    

结论

在本指南中,您学习了使用 R 中强大的“caret”包的最常用数据规范化技术。这些规范化技术将帮助您处理不同单位和尺度的数值变量,从而提高机器学习算法的性能。要了解有关使用 R 进行数据科学的更多信息,请参阅以下指南:

  1. 使用 R 的描述性统计解释数据
  2. 使用 R 统计模型解释数据
  3. 使用 R 进行时间序列预测
  4. 假设检验 - 用统计模型解释数据
  5. 使用 R 对文本数据进行机器学习
  6. 使用 R 中的词云对文本数据进行可视化
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据