我们已经研究了监督学习和非监督学习算法。这些算法要求格式化的数据以开始训练过程。我们必须以某种方式准备或格式化数据,以便它可以作为机器学习算法的输入。
数据预处理
在日常生活中,我们会处理大量的数据,但这些数据是以原始形式存在的。为了将数据作为机器学习算法的输入,我们需要将其转换为有意义的数据。这就是数据预处理的重要性所在。换句话说,在将数据提供给机器学习算法之前,我们需要预处理数据。
数据预处理步骤
以下是使用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 - 应用预处理技术
在此步骤中,需要应用一种预处理技术。
以下部分描述了数据预处理技术。
数据预处理技术
数据预处理的技术描述如下:
二值化(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。
二值化后的数据:
[[ 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代码对输入数据(即特征向量)进行缩放:
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)
运行上述代码后会得到如下输出:
最小最大缩放后的数据:
[[ 0.48648649 0.58252427 0.99122807]
[ 0. 1. 0.81578947]
[ 0.27027027 0. 1. ]
[ 1. 0. 99029126 0. ]]
归一化(Normalization)
这是另一种数据预处理技术,用于修改特征向量。这种修改对于在共同尺度上衡量特征向量是必要的。以下是两种可以在机器学习中使用的归一化:
L1 归一化
这也称为最小绝对偏差。这种归一化修改值,使得每一行的绝对值之和总是达到1。可以通过以下Python代码实现:
data_normalized_l1 = preprocessing.normalize(input_data, norm='l1')
print("\nL1 normalized data:\n", data_normalized_l1)
上述代码生成如下输出:
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("\nL2 normalized data:\n", 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("\nLabels =", 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("\nEncoded values =", encoded_values)
现在,编码值将会打印如下:
Encoded values = [3, 0, 4, 1]
然后解码值将会打印如下:
print("\nDecoded labels =", list(decoded_list))
解码值将会打印如下:
Decoded labels = ['white', 'black', 'yellow', 'green']
标记数据 vs 未标记数据
未标记数据主要由自然或人造物体的样本组成,可以从世界中轻松获得。它们包括音频、视频、照片、新闻文章等。
另一方面,标记数据则取一组未标记数据,并为该组未标记数据中的每一条加上具有意义的标签或类别。例如,如果我们有一张照片,则可以根据照片的内容打上标签,即它是男孩、女孩、动物或其他任何东西的照片。标记数据需要人类的专业知识或对给定未标记数据的判断。
有许多情况,未标记数据丰富且容易获得,但标记数据通常需要人类/专家来进行注释。半监督学习尝试结合标记和未标记数据以建立更好的模型。