数据预处理:数据标准化

  在不少学习算法中,目标函数往往假设其特征均值在 0 附近且方差齐次,若是其中有一个特征的方差远远大于其他特征的方差,那么这个特征将成为影响目标特征的主要因素。模型难以学习到其他特征对目标特征的影响。因此,数据的标准化是数据分析流程中的重要步骤。

Z-score 标准化

简介

Z-score标准化是最常用的标准化方法。该方法通过对数据集中的每个样本进行处理,使得处理后的数据具有固定的均值和标准差
假设特征 f f f的取值集合为 { f 1 , f 2 , … , f n f_1,f_2,…,f_n f1,f2,,fn} ,则特征取值 f i f_i fi 经过 Z-score 标准化后的取值 f i ′ f_i' fi
f i ′ = f i − μ σ f_i' = \frac{f_i-\mu}{\sigma} fi=σfiμ
其中 μ = 1 n ∑ i = 1 n f i \mu=\displaystyle \frac{1}{n}\displaystyle \sum^{n}_{i=1}f_i μ=n1i=1nfi 为特征 f f f 的平均值, σ = 1 n ∑ i = 1 n ( f i − μ ) 2 {\sigma} = \displaystyle\sqrt{\frac{1}{n} \sum^{n}_{i=1}(f_i - \mu)^2} σ=n1i=1n(fiμ)2 为特征 f f f 的标准差。
经过Z-score 标准化后,特征的均值落在 0 附近,样本离 0 的距离可解释为其值远离均值的标准差距离。
当数据存在离群值时,为了降低离群值的影响,可以将 Z-score 标准化方法中的标准差换成平均绝对偏差。此时特征 f f f 的平均绝对偏差为
s = 1 n ∑ i = 1 n ∣ f i − μ ∣ s = \frac{1}{n}\displaystyle \sum^{n}_{i=1}|f_i - \mu| s=n1i=1nfiμ
新的 Z-score 标准化的公式为
f i ′ = f i − μ s f'_i = \frac{f_i - \mu}{s} fi=sfiμ
Z-score 标准化适用于特征的最大值或最小值未知和样本分布非常分散的情况。

代码实现

# z-score标准化
def get_z_score(data):
    return (data - data.mean()) / data.std()

get_z_score(data)

Min-Max 标准化

简介

Min-Max 标准化通过对特征作线性变换,使得转换后特征的取值分布在 [0, 1] 区间内,假设特征 f f f的取值集合为 { f 1 , f 2 , … , f n f_1,f_2,…,f_n f1,f2,,fn} ,则特征取值 f i f_i fi 经过 Min-Max 标准化后的取值 f i ′ f_i' fi
f i ′ = f i − f m i n f m a x − f m i n f'_i=\frac{f_i-f_{min}}{f_{max}-f_{min}} fi=fmaxfminfifmin
其中 f m i n f_{min} fmin 为特征 f f f 取值的最小值, f m a x f_{max} fmax 为特征 f f f 取值的最大值。
同样如果希望将特征 f f f 线性映射到任意区间 [a, b] 上,则 Min-Max 标准化方法为
f i ′ = b − a f m a x − f m i n ( f i − f m i n ) + a f'_i={\frac{b-a}{f_{max}-f_{min}}}(f_i-f_{min}) +a fi=fmaxfminba(fifmin)+a
Min-Max 标准化适用于需要将特征取值简单地线性映射到某一区间内的情形,其不足之处在于当数据集中有新数据加入时,特征的最大值或最小值会发生变化,此时需要重新计算新的最大值和最小值,并重新进行标准化操作。由于需要计算最大值和最小值,所以当数据含有离群值时,标准化后的效果较差。

代码实现

# min-max标准化
def get_minmax(data, a=0, b=1):
    return (data - data.min())*(b - a) / (data.max() - data.min()) + a

get_minmax(data)

小数定标标准化

简介

小数定标标准化(decimal scaling)方法通过移动特征取值的小数点位置来进行标准化,使得标准化后特征取值的绝对值总是小于1。小数点移动的位数取决于特征取值的最大绝对值大小。
假设数据中特征 f f f 的取值集合为 { f 1 , f 2 , … , f n f_1,f_2,…,f_n f1,f2,,fn},特征 f i f_i fi 经过小数定标标准化后的取值 f i ′ f_i' fi
f i ′ = f i 1 0 j f_i'=\frac{f_i}{10^j} fi=10jfi
其中 j j j 是满足max{ f 1 ′ , f 2 ′ , … , f n ′ f_1',f_2',…,f_n' f1,f2,,fn} < 1 <1 <1的最小整数。例如,某特征的取值范围为 [ − 30735 , 21872 ] [-30735, 21872] [30735,21872].特征取值绝对值的最大值为30735,则 j j j 取值为5.
小数定标标准化方法适用于特征取值比较分散,尤其是特征取值分布在多个数量级的情况,且在确定小数点的移动位数后,易于还原标准化后的取值特征。

代码实现

# 小数定标标准化
def get_float(data):
    return data/10**np.ceil(np.log10(data.abs().max()))

get_float(data)

逻辑斯蒂标准化

简介

逻辑斯蒂(Logistic)标准化利用逻辑斯蒂函数的特性,将特征取值映射到 [0, 1] 区间内,其函数定义形式为
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
逻辑斯蒂函数将数据从实数域光滑映射到 [0, 1] 区间,可以使用该函数对特征进行标准化处理,假设数据中特征 f f f 的取值集合为 { f 1 , f 2 , … , f n f_1,f_2,…,f_n f1,f2,,fn},特征 f i f_i fi 经过逻辑斯蒂标准化后的取值 f i ′ f_i' fi
f i ′ = 1 1 + e − f i f_i'=\frac{1}{1+e^{-f_i}} fi=1+efi1
逻辑斯蒂标准化方法适用于特征取值分布相对比较集中地分布于 0 两侧的情况。否则,会造成原始特征的分布及取值间关系被改变。

代码实现

def get_log(series):
    return [1 / (1 + math.exp((-1)*i)) for i in series]

get_log(series)

总结

每一种标准化处理方法都会因数据的不同而产生不同的效果,在分析处理中,应以实际的数据情况为参考依据。且标准化处理会改变原始特征的取值,因此在实际操作中需要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化处理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值