Artificial Intelligence With Python 简明教程

AI with Python – Data Preparation

すでに、教師付きと教師なしの両方の機械学習アルゴリズムを学習しました。これらのアルゴリズムでは、訓練プロセスを開始するためのフォーマットされたデータが必要です。MLアルゴリズムに入力として供給できるような、特定の方法でデータを準備またはフォーマットする必要があります。

この章の焦点は、機械学習アルゴリズムのためのデータ準備です。

Preprocessing the Data

日常では、多くのデータを扱いますが、このデータは未加工の状態です。機械学習アルゴリズムの入力としてデータを供給するには、意味のあるデータに変換する必要があります。ここでデータの事前処理が問題になってきます。別の言い方をすれば、機械学習アルゴリズムにデータを提供する前に、データを事前処理する必要があります。

Data preprocessing steps

Pythonでデータを事前処理するには、次の手順に従います。

手順1 − 有用なパッケージのインポート − Pythonを使用している場合、これはデータを特定のフォーマットに、つまり事前処理に変換するための最初のステップとなります。これは次のように行うことができます。

import numpy as np
import sklearn.preprocessing

ここでは、次の2つのパッケージを使用しました。

  1. NumPy − NumPyは、本質的に汎用の配列処理パッケージであり、少量の多次元配列の速度をあまり犠牲にすることなく、任意のレコードの大きな多次元配列を効率的に操作するように設計されています。

  2. 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])

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

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

Techniques for Data Preprocessing

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

Binarization

当我们需要将数值转换成布尔值时,可以使用此预处理技术。我们可以使用内置方法将输入数据二值化,例如使用 0.5 作为阈值,具体方式如下 −

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

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

Binarized data

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

Mean Removal

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

print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", 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 deviation =", data_scaled.std(axis = 0))

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

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

Scaling

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

# Min max scaling

data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)

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

Min max scaled data

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

Normalization

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

L1 Normalization

它也被称为 Least Absolute Deviations 。此类规范化修改值,以便每一行中绝对值的总和始终达到 1。可以使用以下 Python 代码对其在输入数据上进行实现 −

# Normalize data
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("\nL1 normalized data:\n", data_normalized_l1)

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

L1 normalized data:
[[ 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 Normalization

它也被称为 least squares 。此类规范化修改值,以便每一行中平方和的总和始终达到 1。可以使用以下 Python 代码对其在输入数据上进行实现 −

# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)

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

L2 normalized data:
[[ 0.33946114  -0.30713151   0.88906489]
[ -0.33325106   0.53320169   0.7775858 ]
[  0.05156558  -0.81473612   0.57753446]
[  0.68706914   0.26784051  -0.6754239 ]]

Labeling the Data

我们已经知道机器学习算法需要采用特定格式的数据。另一个重要要求是必须在将数据作为机器学习算法的输入之前正确地标记数据。例如,如果我们讨论分类法,数据中就有许多标签。这些标签以单词、数字等形式出现。 sklearn 中与机器学习相关的函数要求数据必须有数字标签。因此,如果数据采用其他格式,则必须将其转换为数字。将单词标签转换为数字形式的过程称为标签编码。

Label encoding steps

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

Step1 − Importing the useful packages

如果使用 Python,这将是将数据转换为特定格式的第一步,即预处理。具体步骤如下 −

import numpy as np
from sklearn import preprocessing

Step 2 − Defining sample labels

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

# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']

Step 3 − Creating & training of label encoder object

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

# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

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

LabelEncoder()

Step4 − Checking the performance by encoding random ordered list

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

# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)

标签将按如下方式打印 −

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

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

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

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

Encoded values = [1, 2, 0]

Step 5 − Checking the performance by decoding a random set of numbers −

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

# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)

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

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

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

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

Labeled v/s Unlabeled Data

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

另一方面,标记数据获取一组未标记数据,并使用有意义的标记或标签或类别来增强该未标记数据的每一项。例如,如果我们有一张照片,那么该标签可以根据照片的内容来标注,即它是一张男孩、女孩、动物或其他任何事物的照片。对数据进行标记需要人类专业知识或对给定未标记数据的判断。

在许多场景中,未标记数据很多且易于获取,但标记数据通常需要人类/专家进行注释。半监督学习试图将标记和未标记数据组合起来构建更好的模型。