3.9 标准化,让运营数据落入相同的范围
参考:《Python数据分析和运营化处理》
数据标准化是一种数据预处理操作,通过处理不同规模和量纲的数据,使其缩放到相同的数据区间,例如[0, 1],或[-1, 1],减少了因为数据规模和分布差异的不同造成对模型的影响。避免“大数吃小数”现象。
标准化方法 | 数学公式 | 优点 | 缺点 | 区间 |
---|---|---|---|---|
Z-Score | \(x^' = (x-mean)/std\) | 默认标准化方法,生成数据以0为均值,方差为1的正态分布。 | 一种中心化方法,会改变原有数据的分布结构,不适合用于对稀疏数据做处理。 | [0,1] |
Max-Min | \(x^'=(x-min)/(max-min)\) | 应用广泛,对数据线性变换,能较好地保持原有数据结构。 | 可能出现分母为0,导致计算溢出。 | [0,1] |
MaxAbs | $x^'=x/ | max | $ | 不破坏原有数据分布结构,可以用于稀疏数据、稀疏的CSR或CSC |
RobustScaler | - | 针对离群点做标准化处理,对数据中心华和数据的缩放健壮性有更强的参数控制能力。能最大限度地保留数据集中的异常。 | - | - |
稀疏数据:数据集会存在稀疏性特征,表现为标准差小,并有很多元素的值为0。常用来做协同过滤。对稀疏数据不能采用中心化的方式,否则会破坏稀疏数据的结构。
协同过滤:系统利用用户喜好、共同经验群体来推荐用户感兴趣的信息,而用户通过评分、收藏等合作机制和系统协同达到过滤的目的。
相关python程序:
# 3.9 标准化,让运营数据落入相同的区间
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
data = np.loadtxt('data6.txt', delimiter='\t') # 读取数据
# Z-Score标准化
zscore_scaler = preprocessing.StandardScaler() # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data) # StandardScaler标准化处理
# Max-Min标准化
minmax_scaler = preprocessing.MinMaxScaler() # 建立MinMaxScaler模型对象
data_scale_2 = minmax_scaler.fit_transform(data) # MinMaxScaler标准化处理
# MaxAbsScaler标准化
maxabsscaler_scaler = preprocessing.MaxAbsScaler() # 建立MaxAbsScaler对象
data_scale_3 = maxabsscaler_scaler.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() # 展示图形