数据标准化

数据标准化的目的是使其缩放到相同的数据区间,防止量纲差异对模型的影响

除了用做模型计算,标准化后的数据还具有直接计算并生成符合指标的意义,是加权指标的必要步骤。

 

 

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方法可以满足一次性的标准化处理,又能将转换数据集的特征保存下来,分别通过fittransform对多个数据集(测试集、训练集)做相同规则的转换。

(5)Max-Min标准化。通过preprocessing.MinMaxScaler建立模型,然后用用fit_transform进行转换。也可以用sklearn.preprocessing.minmax_scale

(6)MaxAbsScaler标准化。通过

 

posted @ 2021-07-02 17:38  做梦当财神  阅读(659)  评论(0编辑  收藏  举报