数据预处理的几种方法
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]])
# 去除均值
data_standardized = preprocessing.scale(data)
print( "\nMean =", data_standardized.mean(axis=0))
print( "Std deviation =", data_standardized.std(axis=0))
# 将特征缩放至特定范围内
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print( "\nMin max scaled data:\n", data_scaled)
# 归一化
data_normalized = preprocessing.normalize(data, norm='l1')
print( "\nL1 normalized data:\n", data_normalized)
# 特征二值化
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)
print( "\nBinarized data:\n", data_binarized)
# 分类特征编码
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:\n", encoded_vector)
2. 将特征缩放至特定范围内
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print( "\nMin max scaled data:\n", data_scaled)
### 显示结果:
Min max scaled data:
[[1. 0. 1. 0. ]
[0. 1. 0.41025641 1. ]
[0.33333333 0.87272727 0. 0.14666667]]
可见,处理后数据的特征值在(0,1)之间。
使用这种缩放的目的包括实现特征极小方差的鲁棒性以及在稀疏矩阵中保留零元素。
3.特征归一化
data_normalized = preprocessing.normalize(data, norm='l1')
print( "\nL1 normalized data:\n", 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]]
归一化常见的用法之一,是以“L1范式”将数据的属性之和调整成 1。
根据有限的验算,“L2范式”与“L1范式”归一化的结果不同。
4. 特征二值化
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)
print( "\nBinarized data:\n", data_binarized)
### 结果是:
Binarized data:
[[1. 0. 1. 0.]
[0. 1. 0. 1.]
[0. 1. 0. 0.]]
如果有这些数据的先验知识,特征二值化可以帮助概率估算。
5. 分类特征编码
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:\n", encoded_vector)
### 结果是:
Encoded vector:
[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
在机器学习中,特征经常不是数值型的而是分类型的。举个例子,一个人可能有 ["male", "female"] , ["from Europe", "from US", "from Asia"] , ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"] 等分类的特征。这些特征能够被有效地编码成整数,比如 ["male", "from US", "uses Internet Explorer"] 可以被表示为 [0, 1, 3] , ["female", "from Asia", "uses Chrome"] 表示为 [1, 2, 1] 。
这个整数特征并不能在scikit-learn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。(例如:浏览器的类别数据则是任意排序的)
一种将分类特征转换为能够被scikit-learn中模型使用的编码是one-of-K或one-hot编码,在 OneHotEncoder 中实现。这个类使用 m 个可能值转换为 m 值化特征,将分类特征的每个元素转化为一个值。