Python机器学习

数据预处理

Python机器学习数据预处理详细操作教程

简介

机器学习算法完全依赖于数据,因为它是使模型训练成为可能的最关键方面。另一方面,如果我们无法理解这些数据,那么在将其提供给ML算法之前,一台机器将毫无用处。简而言之,对于我们要机器解决的问题,我们始终需要提供正确的数据,即正确比例,格式和包含有意义特征的数据。
这使得数据准备成为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])
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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标准化 L2标准化

二值化

顾名思义,这是一种技术,可以帮助我们使数据二进制化。我们可以使用二进制阈值来使数据二进制。高于该阈值的值将转换为1,低于该阈值的值将转换为0。
例如,如果我们选择阈值= 0.5,则其上方的数据集值将变为1,而低于此值的数据集值将变为0。这就是为什么我们可以将其称为 二进制化数据或 阈值数据。当我们在数据集中有几率并希望将其转换为清晰的值时,此技术很有用。
我们可以借助 scikit-learn Python库的 Binarizer 类对数据进行二值化处理
示例
在此示例中,我们将重新缩放我们之前使用的Pima Indians Diabetes数据集的数据。首先,将加载CSV数据,然后在 Binarizer 类的帮助下,根据阈值将其转换为二进制值,即0和1。我们以0.5作为阈值。
以下脚本的前几行与我们在上一章中编写CSV数据时写的相同。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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 类将数据转换为二进制值。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)
在这里,我们显示输出中的前5行。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
print ("\nBinary data:\n", Data_binarized [0:5])
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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数据时写的相同。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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 类重新缩放数据。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)
我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为2,并在输出中显示前5行。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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库-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
import numpy as np
from sklearn import preprocessing
现在,我们需要提供如下输入标签-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
input_labels = ['red','black','red','green','black','yellow','white']
下一行代码将创建标签编码器并对其进行训练。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)
脚本的下一行将通过对随机有序列表进行编码来检查性能-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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脚本的帮助下获取编码值的列表-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4