三种数据标准化方法的对比:StandardScaler、MinMaxScaler、RobustScaler

一、数据标准化 / 归一化的作用

  • 提升模型精度:标准化 / 归一化使不同维度的特征在数值上更具比较性,提高分类器的准确性。
  • 提升收敛速度:对于线性模型,数据归一化使梯度下降过程更加平缓,更易正确的收敛到最优解。

二、标准差标准化 StandardScaler

from sklearn.preprocessing import StandardScaler

使用均值与方差,对服从正态分布的数据处理,得到符合标准正态分布的数据

  • 处理方法:标准化数据减去均值,然后除以标准差,经过处理后数据符合标准正态分布,即均值为0,标准差为1;
  • 转化函数:x = (x-mean) / std;
  • 适用性:适用于本身服从正态分布的数据;
  • Outlier 的影响:基本可用于有outlier的情况,但在计算方差和均值时outliers仍然会影响计算。

参数包括:with_mean, with_std, copy

  • with_mean:布尔型,默认为 True,表示在缩放前将数据居中,当尝试在稀疏矩阵上时,这不起作用(并且会引发异常),因为将它们居中需要构建一个密集矩阵,在常见的用例中,该矩阵可能太大而无法容纳在内存中;
  • with_std:布尔型,默认为True,表示将数据换算成单位方差(或等效的单位标准差);
  • copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。

属性包括:mean_, scale_, var_, n_samples_seen_

  • mean_:训练集中每个特征的平均值,当_mean=False时,为None;
  • scale_:每个特征数据的相对缩放;
  • var_:训练集中每个特征的方差,用于计算比例,当_ std =False时,为None;
  • n_samples_seen_:每个特征处理的样本数。如没有丢失的样本,n_samples_seen_是一个整数,否则是一个数组,并将被重置或递增。

三、极差标准化 / 归一化 MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

区间缩放,基于最大最小值,将数据转换到0,1区间上的

  • 处理方法:将特征缩放到给定的最小值和最大值之间,也可以将每个特征的最大绝对值转换至单位大小。这种方法是对原始数据的线性变换,将数据归一到[0,1]中间;
  • 转换函数:x = (x-min) / (max-min);
  • 适用性:适用于分布范围较稳定的数据,当新数据的加入导致max/min变化,则需重新定义;
  • Outlier 的影响:因为outlier会影响最大值或最小值,因此对outlier非常敏感。

参数包括:min, max, copy

  • min:默认为0,指定区间的下限;
  • max:默认为1,指定区间的上限;
  • copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。

属性包括:min_, scale_, data_min_, data_max_

  • min_:每个功能调整为最小;
  • scale_:每个特征数据的相对缩放;
  • data_min_:每个特征在数据中出现的最小值;
  • data_max_:每个特征在数据中心出现的最大值。

四、稳健标准化 RobustScaler

from sklearn.preprocessing import RobustScaler

使用具有鲁棒性的统计量缩放带有异常值(离群值)的数据

  • 处理方法:该缩放器删除中位数,并根据百分位数范围(默认值为IQR:四分位间距)缩放数据;
  • IQR:是第1个四分位数(25%)和第3个四分位数(75%)之间的范围;
  • 适用性:适用于包含许多异常值的数据;
  • Outlier 的影响:RobustScaler 利用IQR进行缩放来弱化 outlier 的影响。

参数包括:with_centering, with_scaling, quantile_range, copy

  • with_centering:布尔值,默认为 True,表示在缩放之前将数据居中。若使用稀疏矩阵时,这将导致转换引发异常,因为将它们居中需要建立一个密集的矩阵,在通常的使用情况下,该矩阵可能太大而无法容纳在内存中;
  • with_scaling : 布尔值,默认为True,表示将数据缩放到四分位数范围;
  • quantile_range : 元组,默认值为(25.0, 75.0)即 IQR,表示用于计算 scale_的分位数范围;
  • copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。

属性包括:center_, scale_

  • center_ :训练集中每个属性的中位数;
  • scale_ :训练集中每个属性的四分位间距。

五、总结

  • 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler表现更好(避免不同量纲对方差、协方差计算的影响);
  • 在不涉及距离度量、协方差、数据不符合正态分布、异常值较少的时候,可使用MinMaxScaler。(eg:图像处理中,将RGB图像转换为灰度图像后将其值限定在 [0, 255] 的范围);
  • 在带有的离群值较多的数据时,推荐使用RobustScaler。

参考文章:
1. 数据标准化/归一化normalization
2. 机器学习中数据预处理——标准化/归一化方法(scaler)
3. 缩放有离群值的数据 sklearn.preprocessing.RobustScaler
4. 标准化数据-StandardScaler

  • 28
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
制作Mininst格式的数据,研究sklearn库等机器学习算法与库用得到。C++的VS2017测试通过。适用于车牌和数字识别。下面是Skearn测试程序。 #导入必备的包 import numpy as np import struct import matplotlib.pyplot as plt import os ##加载svm模型 from sklearn import svm ###用于做数据预处理 from sklearn import preprocessing import time #加载数据的路径 path='.' def load_mnist_train(path, kind='train'): labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind) images_path = os.path.join(path,'%s-images-idx3-ubyte'% kind) with open(labels_path, 'rb') as lbpath: magic, n = struct.unpack('>II',lbpath.read(8)) labels = np.fromfile(lbpath,dtype=np.uint8) with open(images_path, 'rb') as imgpath: magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16)) images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784) return images, labels def load_mnist_test(path, kind='t10k'): labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind) images_path = os.path.join(path,'%s-images-idx3-ubyte'% kind) with open(labels_path, 'rb') as lbpath: magic, n = struct.unpack('>II',lbpath.read(8)) labels = np.fromfile(lbpath,dtype=np.uint8) with open(images_path, 'rb') as imgpath: magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16)) images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784) return images, labels train_images,train_labels=load_mnist_train(path) test_images,test_labels=load_mnist_test(path) X=preprocessing.StandardScaler().fit_transform(train_images) X_train=X[0:60000] y_train=train_labels[0:60000] print(time.strftime('%Y-%m-%d %H:%M:%S')) model_svc = svm.LinearSVC() #model_svc = svm.SVC() model_svc.fit(X_train,y_train) print(time.strftime('%Y-%m-%d %H:%M:%S')) ##显示前30个样本的真实标签和预测值,用图显示 x=preprocessing.StandardScaler().fit_transform(test_images) x_test=x[0:10000] y_pred=test_labels[0:10000] print(model_svc.score(x_test,y_pred)) y=model_svc.predict(x) fig1=plt.figure(figsize=(8,8)) fig1.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05) for i in range(100): ax=fig1.add_subplot(10,10,i+1,xticks=[],yticks=[]) ax.imshow(np.reshape(test_images[i], [28,28]),cmap=plt.cm.binary,interpolation='nearest') ax.text(0,2,"pred:"+str(y[i]),color='red') #ax.text(0,32,"real:"+str(test_labels[i]),color='blue') plt.show()

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值