概述
特征预处理包括无量纲化、特征分桶、统计变换和特征编码等步骤。
一、无量纲化
只能针对数值型特征。方法有数据标准化(Standardization)、归一化(MinMax归一化、MaxAbs归一化)、正态分布化(Normalization)
数据标准化的原因:
1、某些算法要求样本具有零均值和单位方差;
2、需要消除样本不同属性具有不同量级时的影响。
①、归一化有可能提高精度;数量级的差异将导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要);
②、数量级的差异将导致迭代收敛速度减慢;
③、当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;
④、依赖于样本距离的算法对于数据的数量级非常敏感。
1 数据标准化(Standardization)
标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。即μ=0、σ=1,也叫z-score标准化。
适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
公式:x’=(x-μ)/σ
1.1 优缺点
1.1.1优点:
Z-Score最大的优点就是简单,易计算,Z-Score能够应用于数值型的数据,并且不受数据量级的影响,因为它本身的作用就是消除量级给分析带来的不便。
1.1.2 缺点:
①、估算Z-Score需要总体的平均值与方差,但是这一值在真实的分析与挖掘中很难得到,大多数情况下是用样本的均值与标准差替代;
②、Z-Score对于数据的分布有一定的要求,正态分布是最有利于Z-Score计算的;
③、Z-Score消除了数据具有的实际意义,A的Z-Score与B的Z-Score与他们各自的分数不再有关系,因此Z-Score的结果只能用于比较数据间的结果,数据的真实意义还需要还原原值;
④、在存在异常值时无法保证平衡的特征尺度。
1.2 代码实现
class StandardScaler:
def __init__(self):
self.mean_=None
self.scale_=None
def fit(self,X):
"""根据数据集X获得数据的均值和方差"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
# 求出每个列的均值和方差
self.mean_=np.mean(np.array([X[:,i] for i in range(X.shape[1])]),axis=1)
self.scale_=np.std(np.array([X[:,i] for i in range(X.shape[1])]),axis=1)
return self
def transform(self,X):
"""将X根据StandardScaler进行均值方差归一化处理"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
assert self.mean_ is not None and self.scale_ is not None,
"must fit before transform"
assert X.shape[1]==len(self.mean_),
"the feature number of X must be equal to mean_ and std_"
# 创建一个浮点型矩阵,大小和X相同
resX=np.empty(shape=X.shape)
# 对于每一列(维度)都计算
for col in range(X.shape[1]):
resX[:,col]=(X[:,i]-np.mean_[col])/np.std_[col]
return resX
2 归一化
2.1 MinMax归一化
区间缩放法利用了边界值信息,将属性缩放到[0,1]。
公式:x’=(x-min)/(max-min)
2.1.1缺点:
①、这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义;
②、MinMaxScaler对异常值的存在非常敏感。
2.1.2 代码实现
class MinMaxScaler:
def __init__(self):
self.maxnum_=None
self.minnum_=None
def fit(self,X):
"""根据数据集X获得数据的最值"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
# 求出每个列的最大值和最小值
self.maxnum_=np.max(np.array([X[:,i] for i in range(X.shape[1])]),axis=1)
self.minnum_=np.min(np.array([X[:,i] for i in range(X.shape[1])]),axis=1)
return self
def transform(self,X):
"""将X根据MinMaxScaler进行最值归一化处理"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
assert self.maxnum_ is not None and self.minnum_ is not None,
"must fit before transform"
assert X.shape[1]==len(self.maxnum_),
"the feature number of X must be equal to maxnum_ and minnum_"
# 创建一个浮点型矩阵,大小和X相同
resX=np.empty(shape=X.shape)
# 对于每一列(维度)都计算
for col in range(X.shape[1]):
resX[:,col]=(X[:,i]-np.minnum_[col])/(np.maxnum_[col]-self.minnum_[col])
return resX
2.2 MaxAbs 归一化
单独地缩放和转换每个特征,使得训练集中的每个特征的最大绝对值将为1.0,将属性缩放到[-1,1]。它不会移动/居中数据,因此不会破坏任何稀疏性。
公式:x’=x/|max|
2.2.1 缺点:
①、这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义;
②、MaxAbsScaler与先前的缩放器不同,绝对值映射在[0,1]范围内。
在仅有正数据时,该缩放器的行为MinMaxScaler与此类似,因此也存在大的异常值。
2.2.2 代码实现
class MaxAbsScaler:
def __init__(self):
self.maxnumabs_=None
def fit(self,X):
"""根据数据集X获得数据的最大值绝对值"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
# 求出每个列的最大
self.maxnumabs_=np.abs(np.max(np.array([X[:,i] for i in range(X.shape[1])]),axis=1))
return self
def transform(self,X):
"""将X根据MaxAbsScaler进行最值绝对值归一化处理"""
assert X.ndim>=2,"The dimension of X must be greater than or equal to 2"
assert self.maxnumabs_ is not None ,
"must fit before transform"
assert X.shape[1]==len(self.maxnumabs_),
"the feature number of X must be equal to maxnumabs_"
# 创建一个浮点型矩阵,大小和X相同
resX=np.empty(shape=X.shape)
# 对于每一列(维度)都计算
for col in range(X.shape[1]):
resX[:,col]=X[:,i]/np.maxnumabs_[col]
return resX
3 正态分布化(Normalization)
正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。
该方法是文本分类和聚类分析中经常使用的向量空间模型(Vector Space Model)的基础。
Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。
规则为l2的公式: x ′ = x / ∑ j d ( x j ) 2 x'=x/ sqrt {sum_{j}^{d}(x_j)^2} x′=x/j∑d(xj)2
4 标准化与归一化对比
4.1 标准化与归一化的异同
4.1.1 相同点
它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。
4.1.2 不同点
①、目的不同,归一化是为了消除纲量压缩到[0,1]区间;标准化只是调整特征整体的分布;
②、归一化与最大,最小值有关;标准化与均值,标准差有关;
③、归一化输出在[0,1]之间;标准化无限制。
4.2 标准化与归一化如何选择
①、如果对输出结果范围有要求,用归一化;
②、如果数据较为稳定,不存在极端的最大最小值,用归一化;
③、如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
4.3 归一化与标准化的应用场景
①、在分类、聚类算法中,需要使用距离来度量相似性的时候(如SVM、KNN)、或者使用PCA技术进行降维的时候,标准化(Z-score standardization)表现更好;
②、在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。
比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围;
③、基于树的方法不需要进行特征的归一化。
例如随机森林,bagging与boosting等方法。
如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。
注:一般来说,建议优先使用标准化。对于输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。
二、特征分箱
主要适用数值型特征。分无监督和有监督两种,自定义分箱、等距分箱、等频分箱、聚类分箱、二值化(Binarization 也适用非数值型特征)属于无监督分箱法;卡方分箱、最小熵法分箱属于有监督分箱法。
三、统计变换
分log变换和Box-Cox变换两种。
四、特征编码
主要适用分类型特征。有标签编码(LabelEncode)、独热编码(OneHotEncode)、标签二值化(LabelBinarizer)、多标签二值化(MultiLabelBinarizer)、平均数编码(Mean Encoding)等方法。
参考内容:
特征工程系列文章 https://mp.weixin.qq.com/s/qWO9zgKyntvyWfftpGqrHQ ;
归一化文章 https://mp.weixin.qq.com/s/RkenakI_DSXoMLwNNvUAAw;
归一化代码 https://nbviewer.jupyter.org/github/strongerfish/Machine-learning/blob/master/Studies%26Notes%20of%20preprocessing.ipynb
最后
以上就是有魅力大地为你收集整理的数据预处理一、无量纲化二、特征分箱三、统计变换四、特征编码的全部内容,希望文章能够帮你解决数据预处理一、无量纲化二、特征分箱三、统计变换四、特征编码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复