天天看点

常用数据预处理技术(python实现)一、特征规范化方法1. 均值移除( Mean removal)

一、特征规范化方法

1. 均值移除( Mean removal)

把每个特征的平均值移除,以保证特征均值为0(即标准化处理)。这样做可以消除特征彼此间的偏差(bias),变为均值为0方差为1的数据集。(x-mean)/标准差

#均值移除
           
from sklearn import preprocessing
data_standardized = preprocessing.scale(data)
print ("\nMean =", data_standardized.mean(axis=0))
print ("Std deviation =", data_standardized.std(axis=0))
           

2. 范围缩放( Scaling)

数据点中每个特征的数值范围可能变化很大,因此,有时将特征的数值范围缩放到合理的大小是非常重要的。有些算法中,数值范围会极大影响模型性能,需要将不同特征缩放到同一范围,去除数值范围的影响,如SVM。 (x-min)/(max-min)

#范围缩放
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print ("\nMin max scaled data =", data_scaled)
           

3. 归一化( Normalization)

数据归一化用于需要对特征向量的值进行调整时,以保证每个特征向量的值都缩放到相同的数值范围。机器学习中最常用的归一化形式就是将特征向量调整为L1范数,使特征向量的数值之和为1。这个方法经常用于确保数据点没有因为特征的基本性质而产生较大差异,即确保数据处于同一数量级,提高不同特征数据的可比性。

data_normalized = preprocessing.normalize(data, norm='l1')
print ("\nL1 normalized data =", data_normalized)
           

4. 二值化( Binarization)

二值化用于将数值特征向量转换为布尔类型向量

#二值化
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)
print ("\nBinarized data =", data_binarized)
           

5. 独热编码

需要处理的数值通常都是稀疏地、散乱地分布在空间中,然而,我们并不需要存储这些大数值,这时就需要使用独热编码(One-Hot Encoding)。可以把独热编码看作是一种收紧(tighten)特征向量的工具。它把特征向量的每个特征与特征的非重复总数相对应,通过one-of-k的形式对每个值进行编码。特征向量的每个特征值都按照这种方式编码,这样可以更加有效地表示空间。例如,我们需要处理4维向量空间,当给一个特性向量的第n个特征进行编码时,编码器会遍历每个特征向量的第n个特征,然后进行非重复计数。如果非重复计数的值是K,那么就把这个特征转换为只有一个值是1其他值都是0的K维向量。

#独热编码
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)
           
结果:
           

在上面的示例中,观察一下每个特征向量的第三个特征,分别是1、 5、 2、 4这4个不重复的值(从小打大),也就是说独热编码向量的长度是4。如果你需要对5进行编码,那么向量就是[0, 1, 0, 0]。向量中只有一个值是1。第二个元素是1,对应的值是5。其他三个天特征同理。

二、标记编码方法

将单词转换成从0开始的索引值。

#标记编码
input_classes = ['audi', 'ford', 'audi', 'toyota', 'ford', 'bmw']
label_encoder=preprocessing.labelEncoder() #建立标记编码器
label_encoder.fit(input_classes) #对标记进行编码
for i, item in enumerate(label_encoder.classes_): #显示编码结果
    print item, '-->', i
    
labels = ['toyota', 'ford', 'audi']
encoded_labels = label_encoder.transform(labels)#转换新标记

encoded_labels = [2, 1, 0, 3, 1]
decoded_labels = label_encoder.inverse_transform(encoded_labels) #反转标记为原始单词
           

继续阅读