特征工程之特征值的预处理
1. 概述
- 对数值型数据进行处理
- 预处理就是用来实现无量钢化的方式
- 无量钢化:
- 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据"无量纲化"
- 例如:
- 梯度和矩阵为核心的算法中;逻辑回归,支持向量机,神经网络中无量钢化可以加快求解速度;
- 在距离类模型,譬如K近邻,K-Means聚类中,无量钢化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成的影响
- 决策树和树的集成算法,对决策树不需要无量钢化,决策树可以把任意数据都处理的很好
2. 数据处理
- 含义:特征抽取后我们就可以获取对应的数值型的样本数据,然后进行数据处理
- 概念:通过特定的统计方式(数学方法),将算法转换成算法要求的数据
- 方式
- 归一化
- 标准化
- 如果认为每一个特征具有同等大小的权重都同等重要,则必须要对其进行归一化处理
2.1归一化
- 归一化后的数据服从正态分布
from sklearn.preprocessing import MinMaxScaler
参数:feature_range表示缩放范围,通常使用(0,1)
作用:使得某一个特征对最终结果不会造成很大的影响
from sklearn.preprocessing import MinMaxScaler
mm=MinMaxScaler(feature_range=(0,1)) #每个特征缩放的范围
data=[[90,2,10,40],[60,5,15,45],[73,3,13,45]]
data=mm.fit_transform(data)#data需要归一化的特征
print(data)
# [[1. 0. 0. 0. ]
# [0. 1. 1. 1. ]
# [0.43333333 0.33333333 0.6 1. ]]
-
如果数据中存在的异常值比较多,会有什么影响?
- 结合归一化公式,异常值对原始特征中的最大值和最小值的影响很大,因此也会影响对归一化的值,这个也是归一化的一个弊端,无法很好的处理异常值
- 在特定场景下最大值和最小值是变化的,另外最大最小值很容易受到异常值的影响,所以这种归一化的方式具有一定的局限性。
2.2标准化
-
当数据按均值中心化后,再按标准差缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization),公式如下
-
标准化公式对异常值对均值和标准差的影响不大
-
API
-
处理后,每列所有的数据都聚集在均值为0,标准差为1范围附近
-
标准化API:
from sklearn.preprocessing import StandardScaler fit_transform(X) #对X标准化 mean_#均值 var_ #方差
-
示例
from sklearn.preprocessing import StandardScaler ss=StandardScaler() data=[[90,2,10,40],[60,5,15,45],[73,3,13,45]] ss.fit_transform(data) # array([[ 1.27540458, -1.06904497, -1.29777137, -1.41421356], # [-1.16685951, 1.33630621, 1.13554995, 0.70710678], # [-0.10854507, -0.26726124, 0.16222142, 0.70710678]]) ss.mean_ #array([74.33333333, 3.33333333, 12.66666667, 43.33333333]) ss.var_ #array([150.88888889, 1.55555556, 4.22222222, 5.55555556])
-
3.归一化和标准化总结
- 归一化,如果出现了异常值则会影响特征的最大值最小值,那么最终结果会受到比较大影响
- 标准化,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变比较少
选择:StandardScaler
和MinMaxSclaer
选哪个?
- 大多数机器学习算法中,会选择
StandardSclaer
来进行特征缩放,因为MinMaxSclaer
对异常值非常敏感。 - 在CPA,聚类,逻辑回归,支持向量机,神经网络这些算法中,
StandardSclaer
往往是最好的选择。 MinMaxScaler
在不涉及距离度量,梯度,协方差计算以及数据需要被压缩到特定区间时,使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler
将数据压缩于[0,1]区间之中- 建议先用
StandardScaler
,效果不好换MinMaxScaler