机器学习中的数据预处理

数据预处理是准备原始数据并使其适用于机器学习模型的过程。这是创建机器学习模型的第一步,也是至关重要的一步。

在创建机器学习项目时,我们并不总是遇到干净且格式化的数据。并且在对数据进行任何操作时,必须对其进行清理并以格式化的方式放置。因此,为此,我们使用数据预处理任务。

为什么需要数据预处理?

真实世界的数据通常包含噪声、缺失值,并且可能是无法直接用于机器学习模型的无法使用的格式。数据预处理是清理数据并使其适用于机器学习模型所需的任务,这也提高了机器学习模型的准确性和效率。

它包括以下步骤:

  • 获取数据集

  • 导入库

  • 导入数据集

  • 查找缺失数据

  • 编码分类数据

  • 将数据集拆分为训练集和测试集

  • 特征缩放


1)获取数据集

要创建机器学习模型,我们需要的第一件事是数据集,因为机器学习模型完全适用于数据。针对特定问题以正确格式收集的数据称为数据集

数据集可能有不同的格式用于不同的目的,例如,如果我们想创建一个用于商业目的的机器学习模型,那么数据集将与肝脏患者所需的数据集不同。所以每个数据集都不同于另一个数据集。为了在我们的代码中使用数据集,我们通常将其放入一个 CSV文件中。但是,有时,我们可能还需要使用 HTML 或 xlsx 文件。

什么是 CSV 文件?

CSV 代表“逗号分隔值”文件;它是一种文件格式,允许我们保存表格数据,例如电子表格。它对于庞大的数据集很有用,并且可以在程序中使用这些数据集。

这里我们将使用一个demo数据集进行数据预处理,实践中,可以从这里下载,“ https://www.superdatascience.com/pages/machine-learning。对于实际问题,我们可以在线下载数据集来自各种来源,例如https://www.kaggle.com/uciml/datasetshttps://archive.ics.uci.edu/ml/index.php等。

我们还可以通过使用 Python 的各种 API 收集数据来创建我们的数据集,并将该数据放入 .csv 文件中。

2) 导入库

为了使用 Python 进行数据预处理,我们需要导入一些预定义的 Python 库。这些库用于执行一些特定的工作。我们将使用三个特定的库进行数据预处理,它们是:

Numpy: Numpy Python 库用于在代码中包含任何类型的数学运算。它是 Python 中科学计算的基础包。它还支持添加大型多维数组和矩阵。因此,在 Python 中,我们可以将其导入为:

例子 (Example)

import numpy as nm

这里我们使用了nm,它是 Numpy 的简称,在整个程序中都会用到。

Matplotlib:第二个库是matplotlib,它是一个 Python 2D 绘图库,有了这个库,我们需要导入一个子库pyplot。该库用于在 Python 中为代码绘制任何类型的图表。它将被导入如下:

例子 (Example)

import matplotlib.pyplot as mpt

这里我们使用 mpt 作为这个库的简称。

Pandas:最后一个库是 Pandas 库,它是最著名的 Python 库之一,用于导入和管理数据集。它是一个开源的数据操作和分析库。它将被导入如下:

在这里,我们使用 pd 作为这个库的简称。考虑下图:

机器学习中的数据预处理

3) 导入数据集

现在我们需要导入我们为机器学习项目收集的数据集。但是在导入数据集之前,我们需要将当前目录设置为工作目录。要在 Spyder IDE 中设置工作目录,我们需要按照以下步骤操作:

  1. 将 Python 文件保存在包含数据集的目录中。

  2. 转到 Spyder IDE 中的文件资源管理器选项,然后选择所需的目录。

  3. 单击 F5 按钮或运行选项以执行文件。

注意:我们可以将任何目录设置为工作目录,但它必须包含所需的数据集。

在这里,在下图中,我们可以看到 Python 文件以及所需的数据集。现在,当前文件夹被设置为工作目录。

机器学习中的数据预处理

read_csv() 函数:

现在要导入数据集,我们将使用 pandas 库的 read_csv() 函数,用于读取一个 文件文件并对其执行各种操作。使用此函数,我们可以在本地读取 csv 文件以及通过 URL。

我们可以使用 read_csv 函数,如下所示:

例子 (Example)

data_set= pd.read_csv('Dataset.csv')

这里,data_set是存储数据集的变量名,在函数内部,我们传递了数据集的名称。一旦我们执行了上面的代码行,它就会成功地在我们的代码中导入数据集。我们还可以通过单击部分变量资源管理器,然后双击data_set来检查导入的数据集。考虑下图:

机器学习中的数据预处理

如上图所示,索引从 0 开始,这是 Python 中的默认索引。我们还可以通过单击格式选项来更改数据集的格式。

提取因变量和自变量:

在机器学习中,从数据集中区分特征矩阵(自变量)和因变量是很重要的。在我们的数据集中,有三个自变量Country、AgeSalary,一个是因变量Purchased

提取自变量:

为了提取自变量,我们将使用Pandas 库的iloc[]方法。它用于从数据集中提取所需的行和列。

例子 (Example)

x= data_set.iloc[:,:-1].values

在上面的代码中,第一个冒号(:) 用于获取所有行,第二个冒号(:) 用于所有列。这里我们使用了 :-1,因为我们不想取最后一列,因为它包含因变量。因此,通过这样做,我们将获得特征矩阵。

通过执行上面的代码,我们将得到如下输出:

例子 (Example)

[['India' 38.0 68000.0]  
 ['France' 43.0 45000.0]  
 ['Germany' 30.0 54000.0]  
 ['France' 48.0 65000.0]  
 ['Germany' 40.0 nan]  
 ['India' 35.0 58000.0]  
 ['Germany' nan 53000.0]  
 ['France' 49.0 79000.0]  
 ['India' 50.0 88000.0]  
 ['France' 37.0 77000.0]]

正如我们在上面的输出中看到的,只有三个变量。

提取因变量:

为了提取因变量,我们将再次使用 Pandas .iloc[] 方法。

例子 (Example)

y =  data_set .iloc[:,3].values

在这里,我们只采用了最后一列的所有行。它将给出因变量数组。

通过执行上面的代码,我们将得到如下输出:

输出:

array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'], dtype=object)

注意:如果您使用 Python 语言进行机器学习,则提取是必需的,但对于 R 语言则不是必需的。

4) 处理缺失数据:

数据预处理的下一步是处理数据集中的缺失数据。如果我们的数据集包含一些缺失的数据,那么它可能会给我们的机器学习模型带来巨大的问题。因此,有必要处理数据集中存在的缺失值。

处理缺失数据的方法:

处理缺失数据主要有两种方式,分别是:

通过删除特定行:第一种方式通常用于处理空值。这样,我们只需删除包含空值的特定行或列。但是这种方式效率不高,删除数据可能会导致信息丢失,从而无法提供准确的输出。

通过计算均值:通过这种方式,我们将计算包含任何缺失值的列或行的均值,并将其放在缺失值的位置。此策略对于具有数字数据(例如年龄、薪水、年份等)的特征很有用。在这里,我们将使用这种方法。

为了处理缺失值,我们将在代码中使用Scikit-learn库,其中包含用于构建机器学习模型的各种库。这里我们将使用sklearn.preprocessing库的Imputer类。下面是它的代码:

例子 (Example)

#handling missing data (Replacing missing data with the mean value)  
from sklearn.preprocessing import Imputer  
imputer= Imputer(missing_values ='NaN', strategy='mean', axis = 0)  
#Fitting imputer object to the independent variables x.   
imputerimputer= imputer.fit(x[:, 1:3])  
#Replacing missing data with the calculated mean value  
x[:, 1:3]= imputer.transform(x[:, 1:3])

输出:


array([['India', 38.0, 68000.0],

       ['France', 43.0, 45000.0],

       ['Germany', 30.0, 54000.0],

       ['France', 48.0, 65000.0],

       ['Germany', 40.0, 65222.22222222222],

       ['India', 35.0, 58000.0],

       ['Germany', 41.111111111111114, 53000.0],

       ['France', 49.0, 79000.0],

       ['India', 50.0, 88000.0],

       ['France', 37.0, 77000.0]], dtype=object

正如我们在上面的输出中看到的那样,缺失值已被替换为其余列值的均值。

5)编码分类数据:

分类数据是具有某些类别的数据,例如在我们的数据集中;有两个分类变量CountryPurchased

由于机器学习模型完全适用于数学和数字,但如果我们的数据集有一个分类变量,那么在构建模型时可能会产生麻烦。所以有必要将这些分类变量编码成数字。

对于国家变量:

首先,我们将国家变量转换为分类数据。为此,我们将使用预处理库中的LabelEncoder()类。

例子 (Example)

#Catgorical data  
#for Country Variable  
from sklearn.preprocessing import LabelEncoder  
label_encoder_x= LabelEncoder()  
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])

输出:


Out[15]: 

  array([[2, 38.0, 68000.0],

            [0, 43.0, 45000.0],

         [1, 30.0, 54000.0],

         [0, 48.0, 65000.0],

         [1, 40.0, 65222.22222222222],

         [2, 35.0, 58000.0],

         [1, 41.111111111111114, 53000.0],

         [0, 49.0, 79000.0],

         [2, 50.0, 88000.0],

        [0, 37.0, 77000.0]], dtype=object)

解释:

在上面的代码中,我们导入了sklearn 库的LabelEncoder类。此类已成功将变量编码为数字。

但是在我们的例子中,有三个国家变量,正如我们在上面的输出中看到的,这些变量被编码为 0、1 和 2。通过这些值,机器学习模型可能会假设这些之间存在某种相关性会产生错误输出的变量。所以为了消除这个问题,我们将使用虚拟编码

虚拟变量:

虚拟变量是那些值为 0 或 1 的变量。1 值表示该变量在特定列中的存在,其余变量变为 0。使用虚拟编码,我们将拥有与类别数相等的列数。

在我们的数据集中,我们有 3 个类别,因此它将生成具有 0 和 1 值的三列。对于虚拟编码,我们将使用预处理库的OneHotEncoder类。

例子 (Example)

#for Country Variable  
from sklearn.preprocessing import LabelEncoder, OneHotEncoder  
label_encoder_x= LabelEncoder()  
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])  
#Encoding for dummy variables  
onehot_encoder= OneHotEncoder(categorical_features= [0])    
x= onehot_encoder.fit_transform(x).toarray()

输出:


array([[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01,

        6.80000000e+04],

       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.30000000e+01,

        4.50000000e+04],

       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01,

        5.40000000e+04],

       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01,

        6.50000000e+04],

       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01,

        6.52222222e+04],

       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.50000000e+01,

        5.80000000e+04],

       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.11111111e+01,

        5.30000000e+04],

       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.90000000e+01,

        7.90000000e+04],

       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 5.00000000e+01,

        8.80000000e+04],

       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01,

        7.70000000e+04]])

正如我们在上面的输出中看到的,所有变量都被编码为数字 0 和 1,并分为三列。

通过单击 x 选项,可以在变量浏览器部分更清楚地看到它:

机器学习中的数据预处理

对于购买的变量:

例子 (Example)

labelencoder_y= LabelEncoder()  
y= labelencoder_y.fit_transform(y)

对于第二个分类变量,我们将只使用LableEncoder类的labelencoder 对象。这里我们没有使用OneHotEncoder类,因为购买的变量只有两个类别是或否,并且自动编码为 0 和 1。

输出:

Out[17]: array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1])

也可以看成:

机器学习中的数据预处理

6)将数据集拆分为训练集和测试集

在机器学习数据预处理中,我们将数据集划分为训练集和测试集。这是数据预处理的关键步骤之一,因为通过这样做,我们可以提高机器学习模型的性能。

假设,如果我们通过一个数据集对我们的机器学习模型进行了训练,并且我们通过一个完全不同的数据集对其进行了测试。然后,这会给我们的模型理解模型之间的相关性带来困难。

如果我们很好地训练我们的模型并且它的训练精度也非常高,但是我们为它提供了一个新的数据集,那么它会降低性能。因此,我们总是尝试制作一个在训练集和测试数据集上都表现良好的机器学习模型。在这里,我们可以将这些数据集定义为:

机器学习中的数据预处理

训练集:训练机器学习模型的数据集子集,我们已经知道输出。

测试集:用于测试机器学习模型的数据集子集,通过使用测试集,模型预测输出。

为了拆分数据集,我们将使用以下代码行:

例子 (Example)

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=0)

解释:

  • 在上面的代码中,第一行用于将数据集的数组拆分为随机训练和测试子集。

  • 在第二行中,我们为我们的输出使用了四个变量,分别是

    • x_train:训练数据的特征

    • x_test:测试数据的特征

    • y_train:训练数据的因变量

    • y_test:测试数据的自变量

  • train_test_split() 函数中,我们传递了四个参数,其中前两个用于数据数组,而test_size用于指定测试集的大小。test_size 可能是 .5、.3 或 0.2,它告诉训练集和测试集的划分比率。

  • 最后一个参数random_state用于为随机生成器设置种子,以便您始终获得相同的结果,最常用的值为 42。

输出:

通过执行上面的代码,我们会得到4个不同的变量,可以在变量浏览器部分看到。

机器学习中的数据预处理

正如我们在上图中看到的,x 和 y 变量被分成了 4 个具有相应值的不同变量。

7) 特征缩放

特征缩放是机器学习中数据预处理的最后一步。它是一种在特定范围内标准化数据集的自变量的技术。在特征缩放中,我们将变量放在相同的范围和相同的比例中,以便没有任何变量支配另一个变量。

考虑以下数据集:

机器学习中的数据预处理

正如我们所看到的,年龄和薪水列值不在同一范围内。机器学习模型基于欧几里德距离,如果我们不对变量进行缩放,那么它会在我们的机器学习模型中引起一些问题。

欧几里德距离为:

机器学习中的数据预处理

如果我们根据年龄和薪水计算任何两个值,那么薪水值将支配年龄值,并且会产生错误的结果。所以为了解决这个问题,我们需要对机器学习进行特征缩放。

在机器学习中执行特征缩放有两种方法:

标准化

机器学习中的数据预处理

正常化

机器学习中的数据预处理

在这里,我们将对我们的数据集使用标准化方法。

对于特征缩放,我们将导入sklearn.preprocessing库的StandardScaler类为:

例子 (Example)

from sklearn.preprocessing import StandardScaler

现在,我们将为自变量或特征创建StandardScaler类的对象。然后我们将拟合和转换训练数据集。

例子 (Example)

st_x= StandardScaler()  
x_train= st_x.fit_transform(x_train)

对于测试数据集,我们将直接应用transform()函数而不是fit_transform() ,因为它已经在训练集中完成了。

例子 (Example)

x_test= st_x.transform(x_test)

输出:

通过执行上面的代码行,我们将得到 x_train 和 x_test 的缩放值:

x_train:

机器学习中的数据预处理

x_test:

机器学习中的数据预处理

正如我们在上面的输出中看到的,所有变量都在值 -1 到 1 之间缩放。

注意:这里,我们没有缩放因变量,因为只有 0 和 1 两个值。但是如果这些变量有更多的值范围,那么我们也需要缩放这些变量。

结合所有步骤:

现在,最后,我们可以将所有步骤组合在一起,使我们的完整代码更易于理解。

例子 (Example)

# importing libraries  
import numpy as nm  
import matplotlib.pyplot as mtp  
import pandas as pd  

#importing datasets  
data_set= pd.read_csv('Dataset.csv')  

#Extracting Independent Variable  
x= data_set.iloc[:, :-1].values  

#Extracting Dependent variable  
y= data_set.iloc[:, 3].values  

#handling missing data(Replacing missing data with the mean value)  
from sklearn.preprocessing import Imputer  
imputer= Imputer(missing_values ='NaN', strategy='mean', axis = 0)  

#Fitting imputer object to the independent varibles x.   
imputerimputer= imputer.fit(x[:, 1:3])  

#Replacing missing data with the calculated mean value  
x[:, 1:3]= imputer.transform(x[:, 1:3])  

#for Country Variable  
from sklearn.preprocessing import LabelEncoder, OneHotEncoder  
label_encoder_x= LabelEncoder()  
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])  

#Encoding for dummy variables  
onehot_encoder= OneHotEncoder(categorical_features= [0])    
x= onehot_encoder.fit_transform(x).toarray()  

#encoding for purchased variable  
labelencoder_y= LabelEncoder()  
y= labelencoder_y.fit_transform(y)  

# Splitting the dataset into training and test set.  
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=0)  

#Feature Scaling of datasets  
from sklearn.preprocessing import StandardScaler  
st_x= StandardScaler()  
x_train= st_x.fit_transform(x_train)  
x_test= st_x.transform(x_test)

在上面的代码中,我们将所有的数据预处理步骤都包含在了一起。但是有一些步骤或代码行并不是所有机器学习模型都需要的。因此,我们可以将它们从我们的代码中排除,使其可重用于所有模型。

  • 使用社交账号登录,本站支持
全部评论(0)