机器学习笔记之—数据的标准化

         数据的标准化是一个比较常用的数据预处理方法,其目的是处理不同量纲的数据,使其缩放到相同的数据区间和范围,以减少规模,特征、分布差异对模型的影响。标准化后的数据还具有了直接计算并生成符合指标的意义。

数据的标准化主要有以下四种方法:

1、实现中心化和正态分布的Z-score

2、实现归一化的Max-Min

3、用于稀疏矩阵的MaxAbs

4、针对离群点的RobustScaler

下面来具体讲讲以上四种方法:

1、Z-score

       它是基于原始数据的均值和标准差进行的标准化,其标准化的计算公式为x'=(x-mean)/std,其中mean和std为x所在列的均值和标准差。注:这种方法适合大多数的数据类型的数据,得到的数据是以0为均值,1为方差的正态分布,但这种方法改变了原始数据的结构,因此不适宜用于对稀疏矩阵做数据预处理。

2、Max-Min

        该方法是用数据的最大值和最小值对原始数据进行预处理其是一种线性变换。其标准化的计算公式为x'=(x-min)/(max-min),min和max是x所在列的最小值和最大值。此方法得到的数据会完全落入[0,1]区间内(z-score没有类似区间),而且能使数据归一化落到一定的区间内,同时保留原始数据的结构

3、MaxAbs

      根据最大值得绝对值标准化。其标准化的计算公式为x'=x/|max|,其中max是x所在列的最大值。该方法和Max-Min方法类似,但该方法的数据区间为[-1,1],也不会破坏原始数据的结构,因此也可以用于稀疏矩阵、稀疏的CSR或CSC矩阵。

4、RobustScaler

当数据集中含有离群点,即异常值时,可以用z-score进行标准化,但是标准化后的数据并不理想,因为异常点的特征往往在标准化之后容易失去离群特征。此时可以用该方法针对离群点做标准化处理。

代码实例:

#导入相关包
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt

#读取数据
data=np.loadtxt('D:\data\data6.txt')

#Z-score标准化
zscore_scaler=preprocessing.StandardScaler()     #建立StandarScaler对象
data_scale_1=zscore_scaler.fit_transform(data)   #StandardScaler标准化处理

#max-min标准化
minmax_scaler=preprocessing.MinMaxScaler()      #建立MinMaxScaler模型对象
data_scale_2=minmax_scaler.fit_transform(data)  #MinMax标准化处理

#MaxAbscaler标准化
maxab_scaler=preprocessing.MaxAbsScaler()          #建立MaxAbsScaler对象
data_scale_3=maxab_scaler.fit_transform(data)      #MaxAbScaler标准化处理

#RobustScaler标准化
robustscaler=preprocessing.RobustScaler()      #建立MaxAbsScaler对象
data_scale_4=robustscaler.fit_transform(data)  #MaxAbScaler标准化处理

#展示多网格结果
data_list=[data,data_scale_1,data_scale_2,data_scale_3,data_scale_4]  #创建数据集列表
scaler_list=[15,10,15,10,15,10]                      #建立点尺寸列表
color_list=['blank','green','blue','yellow','red']   #创建颜色列表
merker_list=['o',',','+','s','p']                    #创建样式列表
title_list=['source_data','zscore_scaler','minmax_scaler','maxabscaler_scaler','robustscaler_scaler']  #创建标题列表

for i,data_single in enumerate(data_list):   #循环得到索引和每个数值
    plt.subplot(2,3,i+1)                     #确定子网格
    plt.scatter(data_single[:,:-1],data_single[:,-1])  #自网格展示散点图
    plt.title(title_list[i])                           #设置自网格标题
plt.subtitle("raw data and standardized data")         #设置总标题
plt.show()     #展示图形

 

本文部分内容摘选自宋天龙老师的公众号~

你可能感兴趣的:(机器学习)