Z-Score标准化是基于原始数据的均值和标准差进行的标准化,假设原转换的数据为x,新数据为x’,那么x’=(x-mean)/std,其中mean和std为x所在列的均值和标准差。 这种方法适合大多数类型的数据,也是很多工具的默认标准化方法。标准化之后的数据是以0为均值,方差为1的正态分布。但是Z-Score方法是一种中心化方法,会改变原有数据的分布结构,不适合用于对稀疏数据做处理。
提示:在很多时候,数据集会存在稀疏性特征,表现为标准差小、并有很多元素的值为0,最常见的稀疏数据集是用来做协同过滤的数据集,绝大部分的数据都是0,仅有少部分数据为1。对稀疏数据做标准化,不能采用中心化的方式,否则会破坏稀疏数据的结构。
Max-Min标准化方法是对原始数据进行线性变换,假设原转换的数据为x,新数据为x’,那么x’=(x-min)/(max-min),其中min和max为x所在列的最小值和最大值。 这种标准化方法的应用非常广泛,得到的数据会完全落入[0,1]区间内(Z-Score则没有类似区间),这种方法能使数据归一化而落到一定的区间内,同时还能较好地保持原有数据结构。
最大值绝对值标准化(MaxAbs)即根据最大值的绝对值进行标准化,假设原转换的数据为x,新数据为x’,那么x’=x/|max|,其中max为x所在列的最大值。 MaxAbs方法跟Max-Min用法类似,也是将数据落入一定区间,但该方法的数据区间为[-1,1]。MaxAbs也具有不破坏原有数据分布结构的特点,因此也可以用于稀疏数据、稀疏的CSR或CSC矩阵。
注意:CSR(Compressed Sparse Row,行压缩)和CSC(Compressed Sparse Column,列压缩)是稀疏矩阵的两种存储格式,这两种稀疏矩阵在scipy.sparse包中应用广泛。除了这两种格式之外,用于存储稀疏矩阵的格式还有COO、CSR、DIA、ELL、HYB等。
某些情况下,假如数据集中有离群点,我们可以使用Z-Score进行标准化,但是标准化后的数据并不理想,因为异常点的特征往往在标准化之后便容易失去离群特征。此时,可以使用RobustScaler针对离群点做标准化处理,该方法对数据中心化和数据的缩放健壮性有更强的参数控制能力。
将使用Numpy、sklearn进行标准化相关处理。源文件data6.txt位于“附件-chapter3”中(可查看之前的第3篇文章进行相关数据下载)
import numpy as np from sklearn import preprocessing import matplotlib.pyplot as plt data = np.loadtxt('D:/jupter_workspace/chapter3/data6.txt', delimiter='\t') # 读取数据文件 # Z-Score标准化 zscore_scaler = preprocessing.StandardScaler() #建立StandardScaler对象 data_scale_1 = zscore_scaler.fit_transform(data) # StandardScaler标准化处理 # Max-Min标准化 minmax = preprocessing.MinMaxScaler() # 建立MinMaxScaler模型对象 data_scale_2 = minmax.fit_transform(data) # MinMaxScaler标准化处理 # MaxAbsScaler标准化 maxabsscaler = preprocessing.MaxAbsScaler() # 建立MaxAbsScaler对象 data_scale_3 = maxabsscaler.fit_transform(data) # MaxAbsScaler标准化 # RobustScaler标准化 robustscalerr_scaler = preprocessing.RobustScaler() # 建立RobustScaler标准化对象 data_scale_4 = robustscalerr_scaler.fit_transform(data) # RobustScaler标准化标准化处理 # 展示多网格结果 data_list = [data, data_scale_1, data_scale_2, data_scale_3, data_scale_4] #建数据集列表 scalar_list = [15, 10, 15, 10, 15, 10] # 创建点尺寸列表 color_list = ['black', 'green', 'blue', 'yellow', 'red'] # 创建颜色列表 merker_list = ['o', ',', '+', 's', 'p'] # 创建样式列表 title_list = ['source data', 'zscore_scaler', 'minmax_scaler', 'maxabsscaler_scaler', 'robustscalerr_scaler'] # 创建标题列表 for i, data_single in enumerate(data_list): #循环得到索引和每个数值 plt.subplot(2, 3, i + 1) # 确定子网格 plt.scatter(data_single[:, :-1], data_single[:, -1], s=scalar_list[i], marker=merker_list[i], c=color_list[i]) plt.title(title_list[i]) # 设置自网格标题 plt.suptitle("raw data and standardized data") # 设置总标题 plt.show() # 展示图形输出结果图: 1)先创建5个列表,用于存储原始数据和4个标准化后的数据、散 点尺寸、颜色、样式、标题。 2)通过for循环结合enumerate将索引值和5份数据循环读出;通过plt.subplot为不同的数据设置不同的网格,该网格为2行3列;在每个网格中通过plt.scatter画出散点图,并通过索引将列表中对应的值作为参数传给scatter;然后通过title方法为每个子网格设置标题。 3)最后设置整个图像的总标题并展示图像,如图3-4所示。上述过程中,需要考虑的关键点是如何根据不同的数据分布特征和应用选择合适的标准化方式,具体来说包含如下几点: ·如果要做中心化处理,并且对数据分布有正态需求,那么使用Z-Score方法; ·如果要进行0-1标准化或要指定标准化后的数据分布范围,那么使用Max-Min标准化或MaxAbs标准化方式是比较好的选择,尤其是前者; ·如果要对稀疏数据进行处理,Max-Min标准化或MaxAbs标准化仍然是理想方法; ·如果要最大限度保留数据集中的异常,那么使用RobustScaler方法更佳。