我是靠谱客的博主 有魅力大地,最近开发中收集的这篇文章主要介绍数据预处理一、无量纲化二、特征分箱三、统计变换四、特征编码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

特征预处理包括无量纲化、特征分桶、统计变换和特征编码等步骤。

一、无量纲化

只能针对数值型特征。方法有数据标准化(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/jd(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

最后

以上就是有魅力大地为你收集整理的数据预处理一、无量纲化二、特征分箱三、统计变换四、特征编码的全部内容,希望文章能够帮你解决数据预处理一、无量纲化二、特征分箱三、统计变换四、特征编码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部