📜  使用Python机器学习-准备数据

📅  最后修改于: 2020-12-10 05:32:48             🧑  作者: Mango


介绍

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

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

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

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

数据预处理技术

我们拥有以下数据预处理技术,可以将其应用于数据集以为ML算法生成数据-

缩放比例

我们的数据集很可能包含规模可变的属性,但是我们无法将此类数据提供给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归一化技术对我们之前使用的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]
]

资料标示

我们讨论了好法塔对于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']