使用 Python 进行 AI – 数据准备

我们已经研究了监督和非监督机器学习算法。这些算法需要格式化的数据才能开始训练过程。我们必须以某种方式准备或格式化数据,以便可以将其作为 ML 算法的输入提供。

本章重点介绍机器学习算法的数据准备。

预处理数据

在我们的日常生活中,我们处理大量数据,但这些数据是原始形式的。为了将数据作为机器学习算法的输入,我们需要将其转换为有意义的数据。这就是数据预处理发挥作用的地方。换句话说,我们可以说在将数据提供给机器学习算法之前,我们需要预处理数据。

数据预处理步骤

按照以下步骤在 Python 中预处理数据 −

步骤 1 −导入有用的包 − 如果我们使用的是 Python,那么这将是将数据转换为特定格式的第一步,即预处理。 可以按如下方式完成 −

import numpy as np
import sklearn.preprocessing

这里我们使用了以下两个包 −

  • NumPy − 基本上,NumPy 是一个通用的数组处理包,旨在有效地操作任意记录的大型多维数组,而不会为小型多维数组牺牲太多速度。

  • Sklearn.preprocessing −此包提供了许多常用的实用函数和转换器类,用于将原始特征向量转换为更适合机器学习算法的表示形式。

步骤 2 − 定义样本数据 − 导入包后,我们需要定义一些样本数据,以便我们可以对该数据应用预处理技术。我们现在将定义以下样本数据 −

input_data = np.array([2.1, -1.9, 5.5],
                      [-1.5, 2.4, 3.5],
                      [0.5, -7.9, 5.6],
                      [5.9, 2.3, -5.8])

步骤 3 − 应用预处理技术 − 在此步骤中,我们需要应用任何预处理技术。

以下部分介绍了数据预处理技术。

数据预处理技术

数据预处理技术如下所述 −

二值化

这是当我们需要将数值转换为布尔值时使用的预处理技术。我们可以使用内置方法对输入数据进行二值化,例如使用 0.5 作为阈值,如下所示 −

data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("
Binarized data:
", data_binarized)

现在,运行上述代码后,我们将得到以下输出,所有高于 0.5(阈值)的值将转换为 1,所有低于 0.5 的值将转换为 0。

二值化数据

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

均值消除

这是机器学习中使用的另一种非常常见的预处理技术。基本上,它用于从特征向量中消除均值,以便每个特征都以零为中心。我们还可以从特征向量中的特征中消除偏差。为了将均值消除预处理技术应用于样本数据,我们可以编写如下所示的 Python 代码。代码将显示输入数据的平均值和标准偏差 −

print("Mean = ", input_data.mean(axis = 0))
print("Std variations = ", input_data.std(axis = 0))

运行上述代码行后,我们将得到以下输出 −

         Mean = [ 1.75       -1.275       2.2]
Std deviation = [ 2.71431391  4.20022321  4.69414529]

现在,下面的代码将删除输入数据的平均值和标准差 −

data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std variations =", data_scaled.std(axis = 0))

运行上述代码后,我们将得到以下输出 −

         Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1.             1.             1.]

缩放

这是另一种用于缩放特征向量的数据预处理技术。需要缩放特征向量,因为每个特征的值可以在许多随机值之间变化。换句话说,我们可以说缩放很重要,因为我们不希望任何特征合成地变大或变小。借助以下 Python 代码,我们可以缩放输入数据,即特征向量 −

# 最小最大缩放

data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("
最小最大缩放数据:
", data_scaled_minmax)

运行上述代码行后,我们将获得以下输出 −

最小最大缩放数据

[ [ 0.48648649  0.58252427   0.99122807]
[   0.          1.           0.81578947]
[   0.27027027  0.           1.        ]
[   1.          0. 99029126  0.        ]]

归一化

这是另一种用于修改特征向量的数据预处理技术。这种修改对于在公共尺度上测量特征向量是必要的。以下是两种可用于机器学习的归一化类型 −

L1 归一化

它也被称为最小绝对偏差。这种归一化会修改值,使每行的绝对值之和始终为 1。它可以在以下 Python 代码的帮助下在输入数据上实现 −

# 归一化数据
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("
L1 归一化数据:
", data_normalized_l1)

上面的代码行生成以下输出 &miuns;

L1归一化数据:
[[ 0.22105263  -0.2          0.57894737]
[ -0.2027027    0.32432432   0.47297297]
[  0.03571429  -0.56428571   0.4       ]
[  0.42142857   0.16428571  -0.41428571]]

L2 归一化数据

它也被称为最小二乘法。这种正则化会修改值,使得每行的平方和始终为 1。它可以在以下 Python 代码的帮助下在输入数据上实现 −

# 规范化数据
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("
L2 归一化数据:
", data_normalized_l2)

上面这行代码将生成以下输出 −

L2 归一化数据:
[[ 0.33946114  -0.30713151   0.88906489]
[ -0.33325106   0.53320169   0.7775858 ]
[  0.05156558  -0.81473612   0.57753446]
[  0.68706914   0.26784051  -0.6754239 ]]

标记数据

我们已经知道,某种格式的数据对于机器学习算法是必需的。另一个重要要求是,在将数据作为机器学习算法的输入发送之前,必须对其进行正确的标记。例如,如果我们谈论分类,数据上有很多标签。这些标签的形式是单词、数字等。sklearn中与机器学习相关的函数要求数据必须有数字标签。因此,如果数据是其他形式,则必须将其转换为数字。将单词标签转换为数字形式的过程称为标签编码。

标签编码步骤

按照以下步骤在 Python 中对数据标签进行编码 −

步骤 1 − 导入有用的包

如果我们使用 Python,那么这将是将数据转换为特定格式的第一步,即预处理。可以按如下方式完成 −

import numpy as np
from sklearn import preprocessing

步骤 2 − 定义样本标签

导入包后,我们需要定义一些样本标签,以便创建和训练标签编码器。我们现在将定义以下样本标签 −

# 样本输入标签
input_labels = ['red','black','red','green','black','yellow','white']

步骤 3 − 创建和训练标签编码器对象

在此步骤中,我们需要创建标签编码器并对其进行训练。以下 Python 代码将有助于完成此操作 −

# 创建标签编码器
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

运行上述 Python 代码后,输出结果如下 −

LabelEncoder()

步骤 4 − 通过编码随机排序列表检查性能

此步骤可用于通过编码随机排序列表检查性能。可以编写以下 Python 代码来执行相同操作 −

# 编码一组标签
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("
Labels =", test_labels)

标签将按如下方式打印 −

Labels = ['green', 'red', 'black']

现在,我们可以获取编码值列表,即将单词标签转换为数字,如下所示 −

print("Encoded values =", list(encoded_values))

编码值将按如下方式打印 −

Encoded values = [1, 2, 0]

步骤 5 − 通过解码一组随机数字来检查性能 −

此步骤可用于通过解码一组随机数字来检查性能。可以编写以下 Python 代码来执行相同操作 −

# 解码一组值
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("
Encoded values =", encoded_values)

现在,编码值将按如下方式打印 −

Encoded values = [3, 0, 4, 1]
print("
Decoded labels =", list(decoded_list)))

现在,解码值将按如下方式打印 −

Decoded labels = ['white', 'black', 'yellow', 'green']

标记数据与未标记数据

未标记数据主要由可从世界轻松获取的自然或人造物体样本组成。它们包括音频、视频、照片、新闻文章等。

另一方面,标记数据采用一组未标记数据,并用一些有意义的标签或标签或类别来增强未标记数据的每一部分。例如,如果我们有一张照片,那么可以根据照片的内容贴上标签,即它是男孩、女孩、动物或其他任何东西的照片。标记数据需要人类对给定未标记数据的专业知识或判断。

在许多情况下,未标记数据丰富且易于获取,但标记数据通常需要人类/专家进行注释。半监督学习试图结合标记和未标记数据来构建更好的模型。