利用不同方法处理数据

现实世界中, 我们经常需要处理大量的数据. 对于机器学习而言, 这些数据通常是不友好的. 为进行机器学习, 我们首先需要对数据进行预处理.

准备

让我们看看如何在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.]]

results matching ""

    No results matching ""