在现实世界中,我们经常遇到许多原始数据,这些数据不适合机器学习算法。我们需要在将原始数据输入各种机器学习算法之前对其进行预处理。本章讨论在Python机器学习中预处理数据的各种技术。
数据预处理
在本节中,让我们了解如何在Python中预处理数据。
最初,在文本编辑器(如记事本)中打开扩展名为.py的文件,例如prefoo.py文件。
然后,将以下代码添加到此文件中-
import numpy as np
from sklearn import preprocessing
#We imported a couple of packages. Let's create some sample data and add the line to this file:
input_data= np.array([[3, -1.5, 3, -6.4], [0, 3, -1.3, 4.1], [1, 2.3, -2.9, -4.3]])
现在我们已经准备好对这些数据进行操作了。
预处理技术
可以使用这里讨论的几种技术对数据进行预处理-
平均去除
它涉及从每个要素中删除均值,使其以零为中心。平均删除有助于消除特征中的任何偏差。
您可以使用以下代码进行平均删除-
data_standardized= preprocessing.scale(input_data)
print "nMean= ", data_standardized.mean(axis= 0)
print "Std deviation= ", data_standardized.std(axis= 0)
现在在终端上运行以下命令-
$ python prefoo.py
您可以观察以下输出-
Mean= [ 5.55111512e-17 -3.70074342e-17 0.00000000e+00 -1.85037171e-17]
Std deviation= [1. 1. 1. 1.]
观察输出中的平均值几乎为0且标准差为1.
缩放
数据点中每个要素的值可以在随机值之间变化。因此,重要的是缩放它们以使其符合指定的规则。
您可以使用以下代码进行缩放-
data_scaler= preprocessing.MinMaxScaler(feature_range= (0, 1))
data_scaled= data_scaler.fit_transform(input_data)
print "nMin max scaled data= ", data_scaled
现在运行代码,您可以观察以下内容输出-
Min max scaled data= [ [ 1. 0. 1. 0. ]
[ 0. 1. 0.27118644 1. ]
[ 0.33333333 0.84444444 0. 0.2 ]
]
请注意,所有值都已在给定范围之间缩放。
标准化
标准化涉及调整特征向量中的值,以便以共同的尺度衡量它们。这里,调整特征向量的值,使它们总和为1.我们将以下行添加到prefoo.py文件中-
您可以使用以下代码进行规范化-
data_normalized= preprocessing.normalize(input_data, norm= 'l1')
print "nL1 normalized data= ", data_normalized
现在运行代码,您可以观察以下输出-
L1 normalized data= [ [ 0.21582734 -0.10791367 0.21582734 -0.46043165]
[ 0. 0.35714286 -0.1547619 0.48809524]
[ 0.0952381 0.21904762 -0.27619048 -0.40952381]
]
规范化用于确保数据点不会因其功能的性质而得到提升。
二值化
二值化用于将数字特征向量转换为布尔向量。您可以使用以下代码进行二值化-
data_binarized= preprocessing.Binarizer(threshold=1.4).transform(input_data)
print "nBinarized data=", data_binarized
现在运行代码,您可以观察以下输出-
Binarized data= [[ 1. 0. 1. 0.]
[ 0. 1. 0. 1.]
[ 0. 1. 0. 0.]
]
当我们事先了解数据。
一个热编码
可能需要处理少量和分散的数值,您可能不需要存储这些值。在这种情况下,您可以使用一种热编码技术。
如果不同值的数量是k,它会将该特征转换为k维 vector只有一个值1且所有其他值都是0。
您可以将以下代码用于一个热编码- GGGoogg10gggoogg
现在运行代码,您可以观察以下输出-
Encoded vector= [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
在上面的示例中,让我们考虑每个特征向量中的第三个特征。值为1,5,2和4.
这里有四个单独的值,这意味着单热编码向量的长度为4.如果我们要编码值5,它将是向量[0,1,0,0]。此向量中只有一个值可以是1。第二个元素是1,表示该值为5.
标签编码
在监督学习中,我们主要遇到各种标签,这些标签可以是数字形式或者说话。如果它们是数字,则它们可以由算法直接使用。但是,很多时候,标签需要是可读的形式。因此,训练数据通常用单词标记。
标签编码是指将单词标签更改为数字,以便算法可以理解如何处理它们。让我们详细了解如何执行标签编码-
创建一个新的Python文件,并导入预处理包-
from sklearn import preprocessing
label_encoder= preprocessing.LabelEncoder()
input_classes= ['suzuki', 'ford', 'suzuki', 'toyota', 'ford', 'bmw']
label_encoder.fit(input_classes)
print "nClass mapping:"
for i, item in enumerate(label_encoder.classes_):
print item, '-->', i
现在运行代码,您可以观察以下内容输出-
Class mapping:
bmw --> 0
ford --> 1
suzuki --> 2
toyota --> 3
如上面的输出所示,单词已被更改为0索引号。现在,当我们处理一组标签时,我们可以将它们转换为以下和缩小;
labels= ['toyota', 'ford', 'suzuki']
encoded_labels= label_encoder.transform(labels)
print "nLabels=", labels
print "Encoded labels=", list(encoded_labels)
现在运行代码,您可以观察以下输出-
Labels= ['toyota', 'ford', 'suzuki']
Encoded labels= [3, 1, 2]
这是比手动维护单词和数字之间的映射更有效。您可以通过将数字转换回单词标签进行检查,如代码中所示-
encoded_labels= [3, 2, 0, 2, 1]
decoded_labels= label_encoder.inverse_transform(encoded_labels)
print "nEncoded labels=", encoded_labels
print "Decoded labels=", list(decoded_labels)
现在运行代码,您可以观察以下输出-
Encoded labels= [3, 2, 0, 2, 1]
Decoded labels= ['toyota', 'suzuki', 'bmw', 'suzuki', 'ford']
从输出,你可以观察到映射保存完好。
数据分析
本节详细讨论了Python机器学习中的数据分析-
加载数据集
我们可以直接从UCI机器学习库加载数据。请注意,这里我们使用pandas来加载数据。我们还将使用pandas来探索数据,包括描述性统计和数据可视化。请注意以下代码,并注意我们在加载数据时指定每列的名称。
import pandas
data= ‘pima_indians.csv’
names= ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', ‘Outcome’]
dataset= pandas.read_csv(data, names= names)
运行代码时,您可以观察到数据集已加载并准备好进行分析。在这里,我们已经下载了pima_indians.csv文件并将其移动到我们的工作目录中并使用本地文件名加载它。
汇总数据集
汇总数据可以在许多方式如下- 检查数据集的维度
列出整个数据
查看所有数据的统计摘要属性
按类变量分类数据
数据集的维度
您可以使用以下命令检查实例数(行数) )和数据包含的属性(列)与t然后,对于我们讨论过的代码,我们可以看到769个实例和6个属性-
(769, 6)
列出整个数据
您可以查看整个数据并了解其摘要-
print(dataset.head(20))
此命令打印数据的前20行,如下所示-
Sno Pregnancies Glucose BloodPressure SkinThickness Insulin Outcome
1 6 148 72 35 0 1
2 1 85 66 29 0 0
3 8 183 64 0 0 1
4 1 89 66 23 94 0
5 0 137 40 35 168 1
6 5 116 74 0 0 0
7 3 78 50 32 88 1
8 10 115 0 0 0 0
9 2 197 70 45 543 1
10 8 125 96 0 0 1
11 4 110 92 0 0 0
12 10 168 74 0 0 1
13 10 139 80 0 0 0
14 1 189 60 23 846 1
15 5 166 72 19 175 1
16 7 100 0 0 0 1
17 0 118 84 47 230 1
18 7 107 74 0 0 1
19 1 103 30 38 83 0
查看统计摘要
您可以使用以下命令查看每个属性的统计摘要,其中包括count,unique,top和freq。
print(dataset.describe())
上面的命令为您提供以下输出,显示每个属性的统计摘要-
Pregnancies Glucose BloodPressur SkinThckns Insulin Outcome
count 769 769 769 769 769 769
unique 18 137 48 52 187 3
top 1 100 70 0 0 0
freq 135 17 57 227 374 500
按类变量细分数据
您还可以查看属于每个结果的实例(行)数作为绝对计数,使用此处显示的命令-
print(dataset.groupby('Outcome').size())
然后您可以看到实例的结果数量显示-
Outcome
0 500
1 268
Outcome 1
dtype: int64
Data Visualiza
您可以使用两种类型的图表来显示数据,如图所示- 单变量图以了解每个属性
了解属性之间关系的多变量图
单变量图
单变量图是每个变量的图。考虑输入变量是数字的情况,我们需要创建每个输入变量的方框和胡须图。您可以使用以下代码来实现此目的。
import pandas
import matplotlib.pyplot as plt
data= 'iris_df.csv'
names= ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset= pandas.read_csv(data, names=names)
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
plt.show()
您可以更清楚地了解输入属性的分布,如图所示-
框和晶须图
您可以使用下面显示的命令创建每个输入变量的直方图,以了解分布;
#histograms
dataset.hist()
plt().show()
从输出中,您可以看到两个输入变量具有高斯分布。因此,这些图有助于了解我们可以在程序中使用的算法。
多变量图
多变量图有助于我们理解变量之间的相互作用。
散点图矩阵
首先,让我们看一下所有属性对的散点图。这有助于发现输入变量之间的结构化关系。
from pandas.plotting import scatter_matrix
scatter_matrix(dataset)
plt.show()
您可以观察输出如图所示-
观察输出中存在一些属性对角分组。这表明高度相关性和可预测的关系。