如何看待 z-score 和 修正z-score(中位数标准化)

一、常规标准化

z-score作为一种标准化方法,已经在各种数据处理中被使用,比如最为常见的机器学习,多种组学数据的标准化。

但是,z-score标准化有其自身的限制,这些限制来自于:

  • 异常值的存在
  • 正太分布(方差齐性)的假说

当我们在处理各种组学数据时,常常由于观察值不多导致数据在进行正态性检验的时候,发现并不服从正太假说;有时候,还会受到异常值的影响。

我们先介绍常规的z-score标准化方法:
z i = x i − μ δ z_i = \frac{x_i-\mu}{\delta} zi=δxiμ
其中, μ \mu μ是均值; x i x_i xi表示样本观察值; δ \delta δ表示所有样本观察值的标准差; z i z_i zi表示该样本点距离样本均值有多少个标准差,用来表示各原始数据在数据组中的相对位置。

一个常规的应用:

如果样本服从正态分布,当 ∣ z i ∣ > 2 |z_i|>2 zi>2时,该样本点即为异常点。它标示的是距离均值2个标准差范围的数据量有95%(正态分布的性质),有2.5%的数据会被标记为异常。
zscore

二、修正后的z-score

由于均值和标准差对于异常值都比较敏感,导致常规的z-score方法出现偏差。因此,对其进行了修正:
Z i = x i − m e d i a n ( x i ) M A D Z_i=\frac{x_i-median(x_i)}{MAD} Zi=MADximedian(xi)
其中, x i x_i xi是样本观察值, m e d i a n ( x i ) median(x_i) median(xi)是所有样本观察值的中位数,MAD(Median Absolute deviation)是中位数绝对偏差,定义如下:
M A D = m e d i a n ∣ x i − m e d i a n ( x i ) ∣ MAD=median|x_i-median(x_i)| MAD=medianximedian(xi)

标准差的定义是与均值距离的平方和,对异常值更敏感,比如一个较大的样本值在样本内,则会直接影响到样本的标准差,而MAD不会,它具有更好的鲁棒性

MAD与标准差的关系

MAD的用法类似于样本标准差,为了使用MAD作为一致估计量来估计标准差,我们可以有:
δ = k ∗ M A D \delta=k*MAD δ=kMAD
其中, k k k只是一个常量因子,与样本分布有关,如果样本服从正态分布, k = 1.4826 k=1.4826 k=1.4826.

三、实践

例子:这里有一个数据集,包含2012年康涅狄格州学区SAT的学生参与率,我们的任务是找到低参与率的学校,可以看做一个异常检测任务。由于我们要找低参与率的学校,所以阈值是一个负数,这里我们设为-2。
ps: 对于较大的数据集,较大的绝对值z zz(通常为z = 3 z=3z=3)通常用作阈值。因为我们的数据集很小,z zz的大值可能导致没有数据被标记为异常。另外,我们在选择z$时比较保守,因为我们想帮助尽可能多的学校。

# 常规z-score
import scipy.stats as ss
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import random
#用于展示检测结果
def plot_anomaly(score_data, threshold):
    # Mask to plot values above and below threshold in different colors
    score_data = score_data.copy().sort_values(ascending=False).values
    ranks = np.linspace(1, len(score_data), len(score_data))
    mask_outlier = (score_data < threshold)
    plt.figure(dpi=150)
    plt.plot(ranks[~mask_outlier], score_data[~mask_outlier],'o', color='b',label='OK schools')
    plt.plot(ranks[mask_outlier], score_data[mask_outlier],'o', color='r', label='anomalies')
    plt.axhline(threshold,color='r',label='threshold', alpha=0.5)
    plt.legend(loc = 'lower left')
    plt.title('Z-score vs. school district', fontweight='bold')
    plt.xlabel('Ranked School district')
    plt.ylabel('Z-score')
    plt.show()
data = pd.read_csv('SAT_CT_District_Participation_2012.csv') 
zscore_rate = ss.zscore(ct_test['Participation Rate'], ddof=0)#ddof是标准差计算中的自由度修正,默认为0,即标准差分母是n,而不是n-1
data=data.assign(zscore=zscore_rate)
plot_anomaly(data['zscore'], -2)
anomalies = data[(data['zscore'] < -2)]
anomalies

在这里插入图片描述
在这里插入图片描述

--------------------------------------------------------

# 修正z-score
def plot_anomaly(score_data, threshold):
    # Mask to plot values above and below threshold in different colors
    score_data = score_data.copy().sort_values(ascending=False).values
    ranks = np.linspace(1, len(score_data), len(score_data))
    mask_outlier = (score_data < threshold)
    plt.figure(dpi=150)
    plt.plot(ranks[~mask_outlier], score_data[~mask_outlier],'o', color='b',label='OK schools')
    plt.plot(ranks[mask_outlier], score_data[mask_outlier],'o', color='r', label='anomalies')
    plt.axhline(threshold,color='r',label='threshold', alpha=0.5)
    plt.legend(loc = 'lower left')
    plt.title('Z-score vs. school district', fontweight='bold')
    plt.xlabel('Ranked School district')
    plt.ylabel('Z-score')
    plt.show()
#修正z-score方法
def modify_zscore(data,k=1.4826):
    data_median=np.median(data)
    dev_from_med=np.array(data)-data_median
    MAD=np.median(np.abs(dev_from_med))
    mod_zscore=dev_from_med/(k*MAD)#使用的是标准差的一致性估计
    return mod_zscore,MAD
    
data = pd.read_csv('SAT_CT_District_Participation_2012.csv') 
mod_zscore,MAD=modified_zscore(data['Participation Rate'])
data = data.assign(mod_zscore=mod_zscore)
plot_anomaly(data['mod_zscore'],-2)
anomalies = data[(data['zscore'] < -2)]
anomalies

在这里插入图片描述
在这里插入图片描述

效果比较:

我们可以发现,z-score方法识别出的异常点一共4项,而修正后的z-score方法识别结果除此之外,还识别出第55项0.47为低参与率。另外,通过计算,可以发现k ∗ M A D k*MADk∗MAD比样本标准差更小,也体现MAD统计量受异常点影响较小,具有更好的鲁棒性。

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最小-最大规范化(Min-Max normalization)和Z-score标准化(Z-score normalization)都是数据归一化的方法,下面简要介绍一下它们的区别和应用场景。 1. 最小-最大规范化(Min-Max normalization):最小-最大规范化是将数据按照线性比例缩放到[0,1]的区间内。其公式为:$x_{new}=\frac{x-x_{min}}{x_{max}-x_{min}}$,其中$x_{new}$为归一化后的数据,$x_{min}$和$x_{max}$分别为数据集中的最小值和最大值。 最小-最大规范化适用于数据集中的数据分布比较均匀的情况。例如,当数据集中的数据都落在0-100的范围内时,可以使用最小-最大规范化将数据归一化到[0,1]的范围内。 2. Z-score标准化(Z-score normalization):Z-score标准化是将数据按照均值为0、方差为1的比例缩放。其公式为:$x_{new}=\frac{x-\mu}{\sigma}$,其中$x_{new}$为标准化后的数据,$\mu$和$\sigma$分别为数据集的均值和标准差。 Z-score标准化适用于数据集中的数据分布比较不均匀的情况。例如,当数据集中的数据分布比较偏态或存在异常值时,可以使用Z-score标准化将数据归一化到均值为0、方差为1的标准正态分布中。 需要注意的是,不同的数据归一化方法对于不同的数据分布和问题可能会有不同的效果,因此需要根据具体问题选择合适的方法。同时,在使用数据归一化方法时,需要注意避免数据泄露问题,即在测试集中不能重新计算均值和标准差等统计量,而应该使用训练集中的统计量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值