在现实世界中,我们经常遇到许多原始数据,这些数据不适合机器学习算法.我们需要在将原始数据输入各种机器学习算法之前对其进行预处理.本章讨论在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.] ]
当我们事先了解数据时,这种技术很有用.
可能需要处理少量和分散的数值,您可能不需要存储这些值.在这种情况下,您可以使用One Hot Encoding技术.
如果不同值的数量为 k ,它将转换该功能进入 k-dimensional 向量,其中只有一个值是 1 ,所有其他值都是 0 .
您可以将以下代码用于一个热编码 :
encoder = preprocessing.OneHotEncoder() encoder.fit([ [0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3] ]) encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray() print "\nEncoded vector =", encoded_vector
现在运行代码,您可以观察以下输出 :
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文件并将其移动到我们的工作目录中并使用本地文件名加载它.
总结数据可以通过多种方式完成,如下所示;
检查数据集的维度
列出整个数据
查看所有属性的统计摘要
按类变量分类数据
您可以使用以下命令检查数据包含的实例(行)和属性(列)的数量形状属性.
print(dataset.shape)
然后,对于我们讨论过的代码,我们可以看到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
您可以查看每个属性的统计摘要,其中包括计数,唯一,顶部和频率,使用以下命令.
print(dataset.describe())
上面的命令为您提供以下显示统计su的输出每个属性的mmary :
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
您可以使用两种类型的图表来显示数据,如图所示 :
单变量图到理解每个属性
多变量图以了解属性之间的关系
单变量图是每个变量的图.考虑输入变量是数字的情况,我们需要创建每个输入变量的方框和胡须图.您可以为此目的使用以下代码.
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()
观察输出中存在一些属性对角分组.这表明高度相关性和可预测的关系.