使用 R 规范化数据
介绍
将普通的机器学习模型转变为好的机器学习模型的一种方法是通过数据标准化的统计技术。如果我们不对数据进行标准化,机器学习算法将受使用更大规模的变量的支配,从而对模型性能产生不利影响。因此,对数据进行标准化势在必行。
在本指南中,您将学习使用流行的统计编程语言 R 执行此任务的各种方法。
让我们首先查看本指南中将使用的数据。
数据
在本指南中,我们将使用一个虚构的贷款申请人数据集,其中包含 578 个观测值和 6 个变量,如下所述:
家属:申请人家属人数
收入:申请人的年收入(美元)
Loan_amount:提交申请的贷款金额(美元)
Term_months:贷款期限(以月为单位)
Approval_status:贷款申请是否被批准(“1”)或未获批准(“0”)
年龄:申请人的年龄(岁)
让我们首先加载所需的库和数据。
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 进行数据科学的更多信息,请参阅以下指南:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~