使用 Python 准备数据的机器学习


机器学习算法完全依赖于数据,因为它是使模型训练成为可能的最关键方面。另一方面,如果我们无法理解这些数据,那么在将其提供给 ML 算法之前,机器将毫无用处。简而言之,对于我们希望机器解决的问题,我们总是需要提供正确的数据,即正确比例、格式和包含有意义特征的数据。

这使得数据准备成为机器学习过程中最重要的一步。数据准备可以定义为使我们的数据集更适合 ML 过程的过程。

为什么要进行数据预处理?


在为 ML 训练选择原始数据之后,最重要的任务是数据预处理。从广义上讲,数据预处理会将选定的数据转换为我们可以使用或可以提供给 ML 算法的形式。我们总是需要对我们的数据进行预处理,使其符合机器学习算法的预期。

数据预处理技术


我们有以下数据预处理技术可以应用于数据集以生成用于 ML 算法的数据:

Scaling

很可能我们的数据集包含具有不同比例的属性,但我们无法将此类数据提供给 ML 算法,因此它需要重新缩放。数据重新缩放可确保属性具有相同的比例。通常,属性被重新缩放到 0 和 1 的范围内。梯度下降和 k-最近邻等 ML 算法需要缩放数据。我们可以借助 scikit-learn Python 库的 MinMaxScaler 类重新缩放数据。

例子

在这个例子中,我们将重新调整我们之前使用的 Pima Indians Diabetes 数据集的数据。首先,将加载 CSV 数据(如前几章中所做的那样),然后在 MinMaxScaler 类的帮助下,将在 0 和 1 的范围内重新缩放。

以下脚本的前几行与我们在前几章中加载 CSV 数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用 MinMaxScaler 类在 0 和 1 范围内重新缩放数据。

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为 1 并在输出中显示前 10 行。

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])
Scaled data:
[
    [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
    [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
    [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
    [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
    [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
    [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
    [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
    [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
    [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
    [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

从上面的输出中,所有数据都重新调整到 0 和 1 的范围内。

正常化


另一种有用的数据预处理技术是标准化。这用于将每行数据重新缩放为长度为 1。它主要在我们有很多零的稀疏数据集中有用。我们可以借助 scikit-learn Python 库的 Normalizer 类重新调整数据。

归一化的类型


在机器学习中,归一化预处理技术有以下两种:

L1 归一化

它可以被定义为一种规范化技术,它以一种方式修改数据集的值,使得每行中的绝对值之和总是高达 1。它也被称为最小绝对偏差。

例子

在这个例子中,我们使用 L1 Normalize 技术对我们之前使用的 Pima Indians Diabetes 数据集的数据进行标准化。首先,将加载 CSV 数据,然后在 Normalizer 类的帮助下对其进行规范化。

以下脚本的前几行与我们在前几章中加载 CSV 数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

现在,我们可以使用带有 L1 的 Normalizer 类来规范化数据。

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为 2 并在输出中显示前 3 行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
Normalized data:
[
    [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
    [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
    [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2 归一化

它可以被定义为一种规范化技术,它以一种方式修改数据集的值,使得每一行的平方和总是高达 1。它也被称为最小二乘法。

例子

在此示例中,我们使用 L2 归一化技术对我们之前使用的 Pima Indians Diabetes 数据集的数据进行归一化。首先,将加载 CSV 数据(如前几章中所做的那样),然后在 Normalizer 类的帮助下对其进行规范化。

以下脚本的前几行与我们在前几章中加载 CSV 数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

现在,我们可以使用带有 L1 的 Normalizer 类来规范化数据。

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为 2 并在输出中显示前 3 行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
Normalized data:
[
    [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
    [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
    [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

二值化


顾名思义,这是我们可以使数据二进制化的技术。我们可以使用二进制阈值来使我们的数据二进制。高于该阈值的值将被转换为 1,低于该阈值的值将被转换为 0。例如,如果我们选择阈值 = 0.5,那么它上面的数据集值将变为 1,低于该值将变为 0。即为什么我们可以称之为 二值化 数据或 阈值 数据。当我们的数据集中有概率并且想要将它们转换为清晰的值时,这种技术很有用。

我们可以借助 scikit-learn Python 库的 Binarizer 类对数据进行二值化。

例子

在这个例子中,我们将重新调整我们之前使用的 Pima Indians Diabetes 数据集的数据。首先,将加载 CSV 数据,然后在 Binarizer 类的帮助下,根据阈值将其转换为二进制值,即 0 和 1。我们将 0.5 作为阈值。

以下脚本的前几行与我们在前几章中加载 CSV 数据时编写的相同。

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用 Binarize 类将数据转换为二进制值。

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

在这里,我们显示输出中的前 5 行。

print ("\nBinary data:\n", Data_binarized [0:5])
Binary data:
[
    [1. 1. 1. 1. 0. 1. 1. 1. 1.]
    [1. 1. 1. 1. 0. 1. 0. 1. 0.]
    [1. 1. 1. 0. 0. 1. 1. 1. 1.]
    [1. 1. 1. 1. 1. 1. 0. 1. 0.]
    [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

标准化


另一种有用的数据预处理技术,主要用于将数据属性转换为高斯分布。它将平均值和 SD(标准偏差)与平均值为 0 和 SD 为 1 的标准高斯分布不同。这种技术在 ML 算法中很有用,例如线性回归、逻辑回归,它假设输入数据集中的高斯分布并产生更好的结果结果与重新调整的数据。我们可以在 scikit-learn Python 库的 StandardScaler 类的帮助下标准化数据(平均值 = 0 和 SD = 1)。

例子

在这个例子中,我们将重新调整我们之前使用的 Pima Indians Diabetes 数据集的数据。首先,将加载 CSV 数据,然后在 StandardScaler 类的帮助下将其转换为均值 = 0 和 SD = 1 的高斯分布。

以下脚本的前几行与我们在前几章中加载 CSV 数据时编写的相同。

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用 StandardScaler 类重新缩放数据。

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为 2 并在输出中显示前 5 行。

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])
Rescaled data:
[
    [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
    [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
    [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
    [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
    [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

数据标签


我们讨论了良好的 fata 对于 ML 算法的重要性,以及在将数据发送到 ML 算法之前对数据进行预处理的一些技术。这方面的另一个方面是数据标记。将数据发送到具有适当标签的 ML 算法也非常重要。例如,在分类问题的情况下,数据上有很多以单词、数字等形式存在的标签。

什么是标签编码?


大多数 sklearn 函数都希望数据带有数字标签而不是单词标签。因此,我们需要将这些标签转换为数字标签。这个过程称为标签编码。我们可以借助 scikit-learn Python 库的 LabelEncoder() 函数对数据进行标签编码。

例子

在以下示例中,Python 脚本将执行标签编码。

首先,导入需要的Python库如下:

import numpy as np
from sklearn import preprocessing

现在,我们需要提供如下输入标签:

input_labels = ['red','black','red','green','black','yellow','white']

下一行代码将创建标签编码器并对其进行训练。

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

下一行脚本将通过编码随机排序列表来检查性能:

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

我们可以借助以下python脚本获取编码值列表:

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))
Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']