利用不同方法处理数据
现实世界中, 我们经常需要处理大量的数据. 对于机器学习而言, 这些数据通常是不友好的. 为进行机器学习, 我们首先需要对数据进行预处理.
准备
让我们看看如何在Python中预处理数据. 创建名为preprocessor.py的文件, 并输入以下内容:
import numpy as np
from sklearn import preprocessing
# 这里我们只载入需要的库以及包, 接下来创建一些测试数据, 如下:
data = np.array([[3, -1.5, 2, -5.4], [0, 4, -0.3, 2.1], [1, 3.3, -1.9, -4.3]])
接下来处理数据
怎么做...?
数据预处理有很多方法, 我们只讨论一些具有代表性的处理技巧(方法)
均值移除
从每个数据中减去均值通常是有用的, 因为它的中心为0. 这样有助于我们从特征值中去除任何偏差. 把下面的代码加入到preprocessor.py 文件中:
data_standardized = preprocessing.scale(data)
print ('Mean =', data_standardized.mean(axis=0))
print ('Std devision =', data_standardized.std(axis=0))
下面就可以直接运行这个文件了:
$ python preprocessor.py
输出结果如下:
Mean = [ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
Std devision = [ 1. 1. 1. 1.]
从结果可以看出, 均值大约为0, 而标准差为1.
缩放
有时数据点的值会随机变化. 所以, 对数据进行缩放也很重要. 将下面的代码加入文件中:
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print ('Min max scaled data =', data_scaled)
输出结果将在指定的值(0 ~ 1)之间:
Min max scaled data = [[ 1. 0. 1. 0. ]
[ 0. 1. 0.41025641 1. ]
[ 0.33333333 0.87272727 0. 0.14666667]]
正则化
数据标准化在对特征向量进行标准尺度测量时非常有用. 在机器学习中最常见的标准化是调整特征向量的值, 使它们的总和为1(正则化). 添加如下代码到文件中:
data_normalized = preprocessing.normalize(data, norm='l1')
print ('L1 normalized data =', data_normalized)
输入结果如下:
L1 normalized data = [[ 0.25210084 -0.12605042 0.16806723 -0.45378151]
[ 0. 0.625 -0.046875 0.328125 ]
[ 0.0952381 0.31428571 -0.18095238 -0.40952381]]
二元化
二值化多用于将数字转换为bool值的转换, 添加如下代码:
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)
print ('Binarized data =', data_binarized)
输出结果如下:
Binarized data = [[ 1. 0. 1. 0.]
[ 0. 1. 0. 1.]
[ 0. 1. 0. 0.]]
独热码
很多时候, 我们需要处理系数矩阵和分散的数值. 我们不需要存储这些值. 这就是热编码. 我们可以把热编码当成一个收紧特征向量的工具. 它查看每个特征值, 并标记不同值的总数. 它使用one-of-k方案来对值进行编码. 基于此对特征向量中的每个特征进行编码. 这有助于我们在空间方面更高效. 例如,假设我们处理4维特征向量. 为了对特征向量中的第n个特征进行编码,编码器将遍历每个特征向量中的第n个特征,并且计算不同值的数目. 如果不同值的数量为k,则其将将特征变换为k维向量,其中只有一个值为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 ('Encoded vector =', encoded_vector)
输出结果如下:
Encoded vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]