数据标准化
数据标准化的目的是使其缩放到相同的数据区间,防止量纲差异对模型的影响。
除了用做模型计算,标准化后的数据还具有直接计算并生成符合指标的意义,是加权指标的必要步骤。
1. 实现中心化和正太分布的Z-Score
Z-Score标准化是基于原始数据的均值和标准差进行的标准化,假设原转换数据为x,新数据为 x' ,那么 x' = (x-mean)/std。
这种方法适合大多数类型的数据,是默认的标准化方法。标准化后的数据是以0为均值,1为方差的正太分布。但Z-Score方法是一种中心化方法,会改变原有数据的分布结构,不适合对稀疏矩阵做处理。
注意:很多时候,数据集会存在稀疏性,表现为标准差小、很多元素值为0,最常见的稀疏数据集是用来做协同过滤的数据集,绝大部分的数据都为0,仅有少部分数据为1。对稀疏矩阵做标准化,不能采用中心化的方式,否则会破坏稀疏矩阵的结构。
2. 实现归一化的Max-Min
Max-Min标准化是对原始数据进行线性变换,假设原转换数据为 x,新数据为 x',那么x' = (x-min)/(max-min)。
这种标准化得到的数据完全落入[0, 1]区间内(Z-Score没有类似区间)。
这种方法还能较好的保持原有数据结构。
3. 用于稀疏矩阵的MaxAbs
最大值绝对值标准化(MaxAbs)即根据最大值的绝对值进行标准化,假设原转换的数据x,新数据 x',那么 x' = x/|max|。
MaxAbs方法跟Max-Min用法类似,也将数据落入一定区间,区间为[-1, 1]。
这种方法保持原有数据结构,可用于稀疏矩阵、稀疏的CSR或CSC矩阵。
注意:CSR(Compressed Sparse Row,行压缩)和 CSC(Compressed Sparse Column,列压缩)是稀疏矩阵的两种存储格式,这两种稀疏矩阵在 scipy.sparse包中应用广泛。(稀疏矩阵的格式:COO、CSR、DIA、ELL、HYB等)。
4. 针对离群点的 RobustScaler
假如数据有离群点,使用Z-Score标准化,结果并不理想,因为异常点的特征往往在标准化后失去离群特征。
可以使用 RobustScaler针对离群点做标准化处理。该方法对数据中心化和数据的缩放健壮性有更强的参数控制能力。
5. 代码实操:Python标准化处理
import numpy as np from sklearn import preprocessing import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 data = np.loadtxt('data6.txt', delimiter='\t') # Z-Score标准化 zscore_scaler = preprocessing.StandardScaler() data_scale_1 = zscore_scaler.fit_transform(data) # Max-Min标准化 minmax_scaler = preprocessing.MinMaxScaler() data_scale_2 = minmax_scaler.fit_transform(data) # MaxAbsScaler标准化 maxabs_scaler = preprocessing.MaxAbsScaler() data_scale_3 = maxabs_scaler.fit_transform(data) # RobustScaler标准化 robustscalerr_scaler = preprocessing.RobustScaler() data_scale_4 = robustscalerr_scaler.fit_transform(data) # 展示多网格结果 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'] # 创建样式列表 marker_list = ['o', ',', '+', 's', 'p'] # 创建标题列表 title_list = ['scource data', 'zscore_scaler', 'minmax_scaler', 'maxabsscaler_scaler', 'robustscalerr_scaler'] for i, data_single in enumerate(data_list): # enumerate():将可遍历的对象组合成一个索引序列 plt.subplot(2, 3, i+1) plt.scatter(data_single[:, :-1], data_single[:, -1], s=scalar_list[i], marker = marker_list[i], c=color_list[i]) # plt.title(title_list[i]) # plt.suptitle('原始数据和标准化后的数据') plt.show()
实例代码用空行分为8个部分:
(1)导入库,Numpy做数据读取,Sklearn.preprocessing模块做标准化处理,matplotlib.pyplot做可视化。
(2)用来正常显示中文,负号。
(3)np.loadtxt()导入数据,文件以tab分割。
(4)Z-Score标准化。通过preprocessing.StandardScaler建立模型,然后应用fit_transform进行转换。除了StandardScaler类外,还可以用preprocessing.scale(X)做标准化处理,二者的差别是preprocessing.StandardScaler方法可以满足一次性的标准化处理,又能将转换数据集的特征保存下来,分别通过fit和transform对多个数据集(测试集、训练集)做相同规则的转换。
(5)Max-Min标准化。通过preprocessing.MinMaxScaler建立模型,然后用用fit_transform进行转换。也可以用sklearn.preprocessing.minmax_scale。
(6)MaxAbsScaler标准化。通过