归一化MinMaxScaler()、标准化StandardScaler()(特征工程之特征预处理)

一、什么是特征预处理?

sklearn官网的解释:The sklearn.preprocessing package provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻译一下:sklearn.preprocessing包提供了一些常用的实用函数和转换器类,以将原始特征向量更改为更适合下游估计量的表示形式。
一言以蔽之:通过一些转换函数将数据转换成更加适合算法模型的特征数据的过程。

二、特征预处理常用方法:归一化、标准化

为什么要进行归一化、标准化?因为特征的单位或者大小相差较大,或者某个特征的方差比其他的特征要大出几个数量级,容易影响(支配)目标结果。使得一些算法无法学习到其它特征。比如下图数据(不是真实数据),用KNN算法来预测一个二手车的优劣,如果两个样本之间的举例比较近可以认为是同一个类别的。但是如果数据不预处理会出现什么问题呢?如下图,KNN算法会计算样本之间的距离,比如计算样本1和2之间的距离。
在这里插入图片描述
把数据进行无量纲化,使不同规格的数据转换到同一规格。

1.标准化MinMaxScaler()

1.1 归一化举例

把数据映射到指定区间(a,b),通常是(0,1)之间。数据里最大的数值为1,最小的数值为0,其余的按照比例映射。
比如下面的例子中,先准备一些数据,然后用MinMaxScaler()归一化处理。
代码如下:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

#1先准备好数据
myindex=pd.Index(data=['1','2','3','4','5','6','7','8','9','10'],name='样本序号')
mydata={
    
    
    '行程':[1234,4235,3214,3421,4312,2341,3214,1432,1423,4211],
    '油耗':[14,35,32,21,41,25,32,42,12,13],
    '时间':[0.3,1.4,1.8,2.4,3.1,0.6,0.7,0.1,0.5,4.0],
    '优劣':[0,1,1,0,1,0,1,0,1,1]
}
myown=pd.DataFrame(data=mydata,index=myindex)[['行程','油耗','时间','优劣']]
print("看一下myown:\n{}\n及其维度{}".format(myown,myown.shape))

在这里插入图片描述

#2实例化一个转换器类,把上面的数据都映射到2-3之间,每列中最小的数据是2,最大数据是3,其他按照比例映射
transfer=MinMaxScaler((2,3))#这里默认的是(0,1)
#3调用fit_transform
data_new=transfer.fit_transform(myown)
print("看一下datanew(数据映射到2-3之后):\n{}\n及其数据类型:{}".format(data_new,data_new.shape))

在这里插入图片描述

#再把列索引加进去
data_new=pd.DataFrame(data=data_new,index=myindex,columns=['行程','油耗','时间'])
data_new['优劣']=mydata['优劣']
print('再把列索引加进去:\n{}'.format(data_new))

在这里插入图片描述

1.2 归一化使用局限

因为归一化是通过最大值、最小值的把数据映射到一个新的区间里,所以如果数据中有异常值(最大或者最小值是异常的、离谱的),这样机会影响整个数据的映射分布。所以这种方法鲁棒性较差,只适合传统精确小数据场景。
有没有更加通用的一种数据规范化方式呢?下面是标准化StandardScaler()。

2.标准化StandardScaler()

数据标准化StandardScaler()是把数据变换到均值为0,标准差为1的范围内。公式如下:
在这里插入图片描述
举例:

import pandas as pd
from sklearn.preprocessing import StandardScaler

##列名与数据对其显示
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

#1先准备好数据
myindex=pd.Index(data=['1','2','3','4','5','6','7','8','9','10'],name='标号')
mydata={
    
    
    '行程':[1234,4235,3214,3421,4312,2341,3214,1432,1423,4211],
    '油耗':[14,35,32,21,41,25,32,42,12,13],
    '时间':[0.3,1.4,1.8,2.4,3.1,0.6,0.7,0.1,0.5,4.0]
}
myown=pd.DataFrame(data=mydata,index=myindex)
print("看一下myown:\n{}\n及其维度{}".format(myown,myown.shape))

在这里插入图片描述

#2实例化一个转换器类
transfer=StandardScaler()
data_new=transfer.fit_transform(myown)
print("转换完之后的数据:\n{}".format(data_new))

在这里插入图片描述
以上就完成了一个数据的标准化,标准化StandardScaler()不易受异常值的影响。在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

总结

(如果您发现我写的有错误,欢迎在评论区批评指正)。

猜你喜欢

转载自blog.csdn.net/qq_27328197/article/details/113823077
今日推荐