Python中的数据预处理入门教程

157 阅读10分钟

Python中的数据预处理入门

数据预处理是机器学习的第一步,在这一步中,我们将从各种来源获得的原始数据转化为可用的格式,以实现准确的机器学习模型。在这篇文章中,我们将介绍数据预处理阶段涉及的所有步骤。

前提条件

要继续学习本教程,你需要具备以下条件。

  1. 有Python编程的知识。
  2. [Google Colab]。

将我们的驱动器安装到Google Colab

在这篇文章中,我们将在Google Colab上进行数据预处理实验。因此,我们需要确保我们的Google Drive可以从Google Colab中访问。

由于我们已经成功下载了我们的数据,现在让我们通过google.drive.com把它上传到Google Drive。我们的数据被上传到Google Drive。它被保存在根目录下。

为了使用这些数据,我们需要让Google Colab访问Google Drive。因此,让我们在Google Colab中输入并运行下面的代码。

from google.colab import drive
drive.mount("/content/drive/")

在执行我们的代码时,它会引导我们进入谷歌认证阶段。

点击Google Colab界面上的URL链接,继续允许权限,直到我们到达验证码阶段。

我们将获得的授权代码复制并粘贴到Colab界面上的方框中,然后点击Ctrl + Enter。完成这一步骤后,就可以访问Drive中的文件了。接下来,让我们继续导入所需的库。

为了导入这些库,让我们输入并运行下面的代码。

第1步:导入库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

第2步:导入数据集

让我们输入并运行下面的代码。

Dataset = pd.read_csv("/content/drive/MyDrive/Dataset.csv")

# importing an array of features
x = Dataset.iloc[:, :-1].values 
# importing an array of dependent variable
y = Dataset.iloc[:, -1].values

我们指定了两个变量,x 为特征,y 为因变量。在代码中声明的特征集Dataset.iloc[:, :-1] ,包括我们数据集的所有行和列,除了最后一列。同样,因变量y 包括所有的行,但只有最后一列,正如代码Dataset.iloc[:, -1].values 中所声明的。

让我们通过执行代码来看看我们的数据。

print(x) # returns an array of features

输出

[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 nan]
 ['France' 35.0 58000.0]
 ['Spain' nan 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]
print(y) # viewing an array of the dependent variable.

输出

['No ' 'Yes' 'No ' 'No ' 'Yes' 'Yes' 'No ' 'Yes' 'No ' 'Yes']

我们的数据以特征数组x和因变量y 的形式被成功导入。

第3步:处理缺失的数据

缺失数据是通过调查收集的数据所面临的一个常见问题。当一个数据集在观察中没有某个特征的值时,就会出现这个问题。

有很多原因导致数据集中的数据可能缺失。例如,通过调查收集的数据可能由于参与者没有回答某些问题、不知道正确的回答或不愿意回答而导致数据缺失。也可能是由于数据输入过程中的错误而导致数据缺失。

大多数机器学习模型要求数据在每个观察中都有所有特征的值。在这样的模型中,缺失的数据可能会导致参数估计的偏差,也会影响到机器学习模型的准确性。

因此,我们最终可能会得出关于数据的错误结论。因此,缺失数据对机器学习模型是有害的,需要适当的处理。

我们有几种技术来处理缺失的数据。它们包括。

删除有缺失值的观察值

这种技术在有少量缺失值的大数据集上效果很好。例如,从一个有数百个观测值的数据集中删除一行,不会影响数据集的信息质量。然而,这种技术并不适合报告许多缺失值的数据集。从一个数据集中删除许多行会导致信息的丢失。

为了确保没有丢失关键信息的风险,我们需要使用更合适的技术。下面的技术涉及缺失数据的估算。归因是指用一个估计值来替换缺失的数据。

平均法

在这种技术下,我们用该变量的平均值来替换缺失的数值。这种技术的优点是它保留了平均值和样本量。然而,这种技术有一些严重的缺点。

平均值归纳法低估了标准误差,而且它没有保留变量之间的相关性。变量之间的关系是分析的一个重要方面,因为研究的总目标是为了更好地了解它。

因此,除非数据是完全随机缺失的(缺失的数据与数据集中的缺失数据和观察值都完全无关),否则平均归因法并不是缺失数据的合适解决方案。

热甲板归因法

在这种技术中,我们用从样本中所有观测值中随机选择的、在其他变量上有类似值的值来替换观测值的缺失。

因此,这种技术确保了替代值只是从实际值可能落下的可能区间中选择的,而且是随机选择的,而不是确定的,这是正确标准误差的一个重要方面。

冷面归因法

在这种技术中,我们使用从其他具有类似观察值的变量中选择的数值来替换缺失的数据。这种技术与热甲板法的不同之处在于,替代值的选择过程是不随机的。

回归归纳法

回归归因法包括在有缺失数据的特征上拟合一个回归模型,然后用这个回归模型的预测值来替代这个特征中的缺失值。这种技术保留了特征之间的关系,这使得它比简单的归因技术(如平均值和模式归因)具有明显的优势。

回归归因法有两类。

确定性回归归因法

确定性回归归因法用回归模型预测的准确值来归因缺失数据。这种技术不考虑回归线周围的随机变化。由于推算出的数值是准确的,因此特征和因变量之间的相关性被高估了。

随机回归归因法

在随机回归归因法中,我们在预测值中加入一个随机变化(误差项),因此,更恰当地再现了XY 的相关性。

现在我们知道了处理缺失值的技术,让我们在我们的数据集中处理这个问题。我们注意到,我们的特征集(x)在AgeSalary 列中有nan 的值。

在我们对数据实施机器学习模型之前,我们需要处理这个问题。由于我们的数据集很小,我们无法消除报告缺失值的行。因此,在我们的案例中,我们将使用平均归因技术。

下面的代码解决了我们数据集中存在的这个问题。

# Importing the class called SimpleImputer from impute model in sklearn
from sklearn.impute import SimpleImputer
# To replace the missing value we create below object of SimpleImputer class
imputa = SimpleImputer(missing_values = np.nan, strategy = 'mean')
''' Using the fit method, we apply the `imputa` object on the matrix of our feature x.
The `fit()` method identifies the missing values and computes the mean of such feature a missing value is present.
'''
imputa.fit(x[:, 1:3])
# Repalcing the missing value using transform method
x[:, 1:3] = imputa.transform(x[:, 1:3])

执行该代码后,我们得到一个缺失值被替换的特征矩阵。

print(x)

输出

[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 63777.77777777778]
 ['France' 35.0 58000.0]
 ['Spain' 38.77777777777778 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

AgeSalary 列的缺失值被替换为各自的列平均值,即38.7777777777777863777.77777777778 ,分别。

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

在编码过程中,我们将文本数据转化为数字数据。编码分类数据涉及到将属于类别的数据改为数字数据。

我们的数据集的CountryPurchased 列包含属于类别的数据。由于机器学习模型是基于数学方程的,而数学方程只接受数字输入,因此计算特征和因变量之间的相关性是很有挑战性的。为了确保这种情况不会发生,我们需要将数据集中的字符串条目转换成数字。

对于我们的数据集,我们应将法国编码为0,西班牙编码为1,德国编码为2。然而,我们未来的机器学习模型将法国的0、西班牙的1和德国的2之间的数字顺序解释为重要,但事实并非如此。为了确保这种误解不会发生,我们使用了一热编码。

一热编码将我们的分类Country 列转换为三列。它为每个国家创建一个独特的二进制矢量,这样国家类别之间就没有数字顺序。

让我们通过执行下面的代码来看看一热编码如何使我们实现这一目标。

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder= 'passthrough')
x = np.array(ct.fit_transform(x))
# executing the cell we obtain:
print(x)

输出

[[1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [0.0 1.0 0.0 30.0 54000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 35.0 58000.0]
 [0.0 0.0 1.0 38.77777777777778 52000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 37.0 67000.0]]

从输出结果来看,Country 列已经转化为3列,每一行只代表一个编码列,其中,法国被编码为向量[1.0 0.0 0.0],西班牙被编码为向量[0.0 0.0 1.0],而德国被编码为向量[0.0 1.0 0.0],它们都是唯一的。

为了编码我们的依赖变量y ,让我们运行下面的代码。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
print(y)

输出

[0 1 0 0 1 1 0 1 0 1]

我们的因变量被成功编码为0和1。

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

在机器学习中,我们将数据集分成训练集和测试集。训练集是数据集的一部分,我们用它来实现模型。另一方面,测试集是我们用来评估模型性能的那部分数据集。

在模型实现的过程中,测试集被认为是未知的。

我们需要将我们的数据集分成四个子集:x_trainx_testy_train ,和y_test 。让我们看一下实现这一目标的代码。

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2,random_state= 1)

输出

让我们打印一下执行下面代码时的输出。

print(x_train)
[[0.0 0.0 1.0 38.77777777777778 52000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 35.0 58000.0]]
print(x_test)
[[0.0 1.0 0.0 30.0 54000.0]
 [1.0 0.0 0.0 37.0 67000.0]]
print(y_train)
print(y_test)
[0 1]

我们的数据集被成功分割。我们的特征集被分为8个观察值,用于x_train ,2个观察值用于x_test ,这对应于(因为我们设置了我们的种子,随机=1)因变量y 的相同拆分。

选择是随机进行的,在任何一次执行中,都有可能获得除上述输出之外的不同子集。

第6步:特征缩放

在大多数情况下,我们将与那些特征不在同一尺度上的数据集一起工作。一些特征往往有巨大的价值,而另一些特征的价值则很小。

假设我们在这种数据集上实现我们的机器学习模型。在这种情况下,具有巨大价值的特征会支配那些具有小价值的特征,而机器学习模型会把那些具有小价值的特征当作不存在(它们对数据的影响没有被考虑)。为了确保不出现这种情况,我们需要在相同的范围内缩放我们的特征,即在-3和3的区间内。

因此,我们将只把AgeSalary 列的x_trainx_test 缩放到这个区间内。下面的代码使我们能够实现这一目标。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
# we only aply the feature scaling on the features other than dummy variables.
x_train[:, 3:] = sc.fit_transform(x_train[:, 3:])
x_test[:, 3:] = sc.fit_transform(x_test[:, 3:])

输出

print(x_train)
[[0.0 0.0 1.0 -0.19159184384578545 -1.0781259408412425]
 [0.0 1.0 0.0 -0.014117293757057777 -0.07013167641635372]
 [1.0 0.0 0.0 0.566708506533324 0.633562432710455]
 [0.0 0.0 1.0 -0.30453019390224867 -0.30786617274297867]
 [0.0 0.0 1.0 -1.9018011447007988 -1.420463615551582]
 [1.0 0.0 0.0 1.1475343068237058 1.232653363453549]
 [0.0 1.0 0.0 1.4379472069688968 1.5749910381638885]
 [1.0 0.0 0.0 -0.7401495441200351 -0.5646194287757332]]
print(x_test)
[[0.0 1.0 0.0 -1.0 -1.0]
 [1.0 0.0 0.0 1.0 1.0]]

请注意,在x_trainx_test 中,我们只缩放了AgeSalary 列,而不是虚拟变量。这是因为对虚拟变量进行缩放可能会干扰它们的预期解释,即使它们落在所需的范围内。

结论

到此为止,我们已经完全准备好了我们的数据,现在已经准备好将其输入各种机器学习模型。在这一点上,我们的数据没有任何不规则的地方,而且模型对数据集有分析意义。我希望你觉得这很有帮助。