R中的数据预处理教程

162 阅读5分钟

R中的数据预处理

数据预处理是机器学习的初始阶段,在这个阶段,数据被准备用于机器学习模型。这一部分很关键,需要正确和系统地进行。否则,我们最终建立的模型将无法准确地实现其目的。

在这篇文章中,我们将学习数据预处理阶段涉及的所有步骤。

前提条件

要跟上这篇文章,读者应该具备以下条件。

  1. 在你的电脑上安装了[RStudio]。
  2. 安装了软件包("caTools")。遵循[此]链接以获得安装说明。

第1步:导入数据集

在我们开始准备数据之前,首先我们需要从这里下载数据并将其加载到RStudio IDE中。

以下是实现这一目的的方法。

Dataset = read_csv('data.csv')

这段代码导入我们以CSV格式存储的数据。

我们可以使用'view()'函数看一下我们的数据。

view(Dataset)

执行后,我们得到的数据集如下。

输出

replaced Dataset

我们的数据集有四列和十个观察值,它显示了来自三个不同国家的不同年龄和薪水的顾客对购买某种产品的反应。

第2步:处理缺失的数据

从数据集中,年龄和薪水这两栏报告了缺失的数据。在实施我们的机器学习模型之前,这个问题需要解决,否则会给我们的机器学习模型带来严重的问题。因此,我们有责任确保使用最合适的技术将这些缺失数据从我们的数据集中消除掉。

下面是我们可以用来处理缺失数据的两种技术。

  1. 删除报告缺失数据的观察。

这种技术适用于处理大的数据集和很少的缺失值,也就是说,从一个有几千个观测值的数据集中删除一行,不会影响数据的质量。当数据集报告了许多缺失值时,使用这种技术就会非常危险。从数据集中删除许多行会导致数据中包含的关键信息的丢失。

为了确保这种情况不会发生,我们利用一种对数据质量没有伤害的适当技术。

  1. 用数据缺失的特征的平均值替换缺失的数据。

这种技术是迄今为止处理缺失值的最好方法。许多统计学家使用这种技术而不是第一种技术。

现在我们知道了用于处理缺失数据的技术,让我们从我们的数据中解决这个问题。在我们的案例中,我们将使用第二种技术。

首先,我们用年龄列的平均值来替换该列中的缺失数据。

下面的代码就执行了这样的任务。

Dataset$Age = ifelse(is.na(Dataset$Age),
                     ave(Dataset$Age, FUN = function (x)mean(x, na.rm = TRUE)),
                     Dataset$Age)

上面的代码到底是干什么的?

Dataset$Age:简单地从我们的数据集中提取年龄列。

在Age列中,我们只是从我们的数据集中取了这个数据,我们需要替换掉缺失的数据,同时保留不缺失的数据。

这个目标是通过使用if-else语句来实现的。

我们的ifelse 语句是取三个参数。

  • 第一个参数是如果条件为真。
  • 第二个参数是如果条件为真,我们输入的值。
  • 第三个参数是如果条件为假,我们将采取的行动。

我们的条件是is.na(Dataset$Age) 。这将告诉我们Dataset$Age中的一个值是否丢失。它返回一个逻辑输出:如果一个值缺失,则为YES;如果一个值没有缺失,则为NO。第二个参数,即'ave()'函数,可以找到年龄列的平均值。

因为这一列报告的是NA值,我们需要在计算平均值时排除空数据,否则我们将得到NA的平均值。

这就是我们在mean函数中传递na.rm = TRUE 的原因,以声明在计算向量Age的平均值时,那些值应该被使用,那些值应该被排除。

第三个条件是,如果数据集的Age列中的值没有丢失,将返回的值。

执行该代码,我们得到。

replaced Age_NA value

我们的数据集中Age列中的缺失值已经成功地被同一列的平均值所取代。

我们通过执行下面的代码对工资列进行同样的处理。

Dataset$Salary = ifelse(is.na(Dataset$Salary),
                 ave(Dataset$Salary, FUN = function (x)mean(x, na.rm = TRUE)),
                 Dataset$Salary)

replaced NA_value of the Salary column

薪资列中的缺失值被成功地替换为同一列的平均值。

第3步:对分类数据进行编码

编码是指将文本数据转换为数字数据。对分类数据进行编码只是意味着我们要将属于类别的数据转化为数字数据。

在我们的数据集中,国家列是分类数据,有三个级别,即法国、西班牙和德国。购买的列也是分类数据,有两个类别,即YES和NO。

我们在数据集上建立的机器模型是基于数学方程的,在这些方程中只取数字。

在方程中保留分类变量的文本会给机器学习模型带来一些麻烦,这就是为什么我们要对这些变量进行编码。为了将分类变量转化为数字,我们使用factor() 函数。

让我们从国家列的编码开始。

Dataset$Country = factor(Dataset$Country, 
                      levels = c('France','Spain','Germany'), 
                      labels = c(1.0, 2.0 , 3.0 ))

执行上面的代码,我们得到。

输出

Encoded Country_names

我们的国家名称被成功地替换为数字。

我们对购买的列做同样的事情。

Dataset$Purchased = factor(Dataset$Purchased,
                           levels = c('No', 'Yes'),
                           labels = c(0, 1))
Dataset$Purchased[is.na(Dataset$Purchased)] <- 0
as.factor(Dataset$Purchased)

使用view() 函数,我们得到。

Encoded Purchased column

我们的购买列被成功编码为0,s和1,s。

第4步:将数据集分割成训练集和测试集

在机器学习中,我们把数据分成两部分。

  • 训练集。我们在上面实现我们的机器学习模型的那部分数据。
  • 测试集。我们评估机器学习模型性能的那部分数据。

我们将这些数据分开的原因是为了确保我们的机器学习模型不会过度学习它所训练的数据的关联性。如果我们让它在数据上学习了太多的东西,那么当在一个具有不同相关性的新数据集上测试时,它可能会表现得很差。

因此,每当我们建立一个机器学习模型时,我们的想法是在训练集上实现它,在测试集上评估它。我们期望训练集和测试集的性能是不同的,如果是这样的话,模型可以适应新的数据集。

使用我们的数据集,让我们把它分成训练集和测试集。

首先,我们首先加载所需的库。

library(caTools)# required library for data splition
set.seed(123)
split = sample.split(Dataset$Purchased, SplitRatio = 0.8)# returns true if observation goes to the Training set and false if observation goes to the test set.

#Creating the training set and test set separately
training_set = subset(Dataset, split == TRUE)
test_set = subset(Dataset, split == FALSE)
training_set
test_set

执行我们的代码就可以得到。

训练

training_set

从结果中可以看出,8个观察值,即我们的数据集观察值的0.8,被分成了训练集。

测试集

test_set

从输出结果中可以看出,有两个观测值进入了测试集。

第5步:特征缩放

在大多数数据集中,特征也被称为输入,不在同一尺度上,这是一个常见的情况。许多机器学习模型是基于欧几里得距离的。

碰巧的是,在计算欧几里得距离时,大单位的特征会支配小单位的特征,就好像那些小单位的特征不存在一样。

为了确保这种情况不会发生,我们需要对我们的特征进行编码,使它们都落在-3和3之间。我们可以用几种方法来缩放我们的特征。其中最常用的是标准化和规范化技术。

归一化技术用于数据是正态分布的情况下,而标准化技术对正态分布和非正态分布的数据都有效。

这两种技术的公式如下所示。

scaling formula

现在,让我们分别对我们的数据集的训练集和测试集进行缩放。

以下是我们实现这一目标的方法。

training_set[, 2:3] = scale(training_set[, 2:3])
test_set[, 2:3] = scale(test_set[, 2:3])
training_set
test_set

执行我们的代码,我们得到。

训练集

scale(training_set)

测试集

scale(test_set)

我们的训练集和测试集被成功地缩放了。

注意,在我们的代码中,我们指定了要缩放的列。

如果我们没有这样做,R会向我们显示一个错误。

比如说。

training_set = scale(training_set)# returns an error

原因是我们的编码列没有被当作数字条目。

结语

这就是我们数据预处理之旅的结束。我们的数据现在已经准备好了,可以给机器学习模型,有效地预测未来的结果。我希望你能享受到每一步的成果。