Data Preparation
我们已经研究了有监督的以及无监督的机器学习算法。 这些算法需要格式化数据才能启动训练过程。 我们必须以某种方式准备或格式化数据,以便它可以作为ML算法的输入提供。
本章重点介绍机器学习算法的数据准备。
预处理数据
在我们的日常生活中,我们处理大量数据,但这些数据是原始形式。 为了提供数据作为机器学习算法的输入,我们需要将其转换为有意义的数据。 这就是数据预处理进入画面的地方。 换句话说,我们可以说在将数据提供给机器学习算法之前,我们需要对数据进行预处理。
数据预处理步骤
按照以下步骤在Python中预处理数据 -
Step 1 − Importing the useful packages - 如果我们使用Python,那么这将是将数据转换为特定格式的第一步,即预处理。 它可以按如下方式完成 -
import numpy as np
import sklearn.preprocessing
这里我们使用了以下两个包 -
NumPy - 基本上NumPy是一个通用的阵列处理软件包,旨在有效地操作任意记录的大型多维数组,而不会为小型多维数组牺牲太多的速度。
Sklearn.preprocessing - 该软件包提供了许多常用的实用程序函数和转换器类,可将原始特征向量更改为更适合机器学习算法的表示形式。
Step 2 − Defining sample data - 导入包后,我们需要定义一些样本数据,以便我们可以对该数据应用预处理技术。 我们现在将定义以下示例数据 -
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 - 在此步骤中,我们需要应用任何预处理技术。
以下部分描述了数据预处理技术。
数据预处理技术
数据预处理技术如下所述 -
二值化(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.]]
平均删除
这是另一种非常常见的预处理技术,用于机器学习。 基本上它用于消除特征向量的均值,使每个特征都以零为中心。 我们还可以从特征向量中的要素中消除偏差。 为了在样本数据上应用均值删除预处理技术,我们可以编写如下所示的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 ]]
标记数据
我们已经知道,某种格式的数据对于机器学习算法是必要的。 另一个重要的要求是在将数据作为机器学习算法的输入发送之前必须正确标记数据。 例如,如果我们谈论分类,那么数据上就有很多标签。 这些标签采用单词,数字等形式。与sklearn机器学习相关的功能期望数据必须具有数字标签。 因此,如果数据是其他形式,则必须将其转换为数字。 将单词标签转换为数字形式的过程称为标签编码。
标签编码步骤
按照以下步骤在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']
标记的v/s未标记数据
未标记的数据主要包括可以从世界上轻松获得的自然或人造物体的样本。 它们包括音频,视频,照片,新闻文章等。
另一方面,标记数据采用一组未标记的数据,并使用一些有意义的标记或标签或类来增加每个未标记数据。 例如,如果我们有照片,则可以根据照片的内容放置标签,即,它是男孩或女孩或动物的照片或其他任何东西。 标记数据需要人类的专业知识或对给定的未标记数据的判断。
在许多场景中,未标记的数据非常丰富且容易获得,但标记的数据通常需要人/专家进行注释。 半监督学习尝试将标记和未标记数据组合以构建更好的模型。