前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习测试笔记(16)——数据处理

机器学习测试笔记(16)——数据处理

作者头像
顾翔
发布2021-01-18 11:20:19
7910
发布2021-01-18 11:20:19
举报

1.数据处理的重要性

对于机器学习,选择一个好的算法是非常有用的,另外对测试集和训练集的数据进行处理也是非常重要的。通常情况下是为了消除量纲的影响。譬如一个百分制的变量与一个5分值的变量在一起怎么比较?只有通过数据标准化,都把它们标准到同一个标准时才具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1。当然也有其他标准化,比如0——1标准化等,可根据自己的数据分布情况和模型来选择。

那什么情况下需要对数据进行处理呢?主要看模型是否具有伸缩不变性。不是所有的模型都一定需要标准化,有些模型对量纲不同的数据比较敏感,比如SVM等。当各个维度进行不均匀伸缩后,最优解与原来不等价,这样的模型,除非原始数据的分布范围本来就不叫接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据主导。但是如果模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression等,对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型,最好也进行数据标准化。

标准化分为:Rescaling、Normalizing和Standardizing,如下表所示:

名称

中文名

解释

Rescaling

重缩放/归一化

通常是指增加或者减少一个常数,然后乘以/除以一个常数,来改变数据的衡量单位。例如:将温度的衡量单位从摄氏度转化为华氏温度。

Normalizing

正则化

通常是指除以向量的范数。例如:将一个向量的欧氏长度等价于1。在神经网络中,"正则化"通常是指将向量的范围重缩放至最小化或者一定范围,使所有的元素都在[0,1]范围内。通常用于文本分类或者文本聚类中。

Standardizing

标准化

通常是为了消除不同属性或样方间的不齐性,使同一样方内的不同属性间或同一属性在不同样方内的方差减小。例如:如果一个向量包含高斯分布的随机值,你可能会通过除以标准偏差来减少均值,然后获得零均值单位方差的"标准正态"随机变量。

一般来说,提供以下方法来做标准化:

  • StandardScaler:计算训练集的平均值和标准差,以便测试数据集使用相同的变换。

提供以下方法来做归一化(将数据特征缩放至某一范围(scalingfeatures to a range)):

  • MinMaxScaler:将数据缩放至给定的最小值与最大值之间,通常是0与1之间。
  • MaxAbsScale:将最大的绝对值缩放至单位大小(数据集的标准差非常非常小,有时数据中有很多很多零(稀疏数据)需要保存住0元素)。
  • 中方法实现
代码语言:javascript
复制
from sklearn.datasets import make_blobs
# 导入画图工具
import matplotlib.pyplot as plt
# 导入数据划分模块、分为训练集和测试集
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def my_preprocessing ():
# 产生40个新样本,分成2类,随机生成器的种子为8, 标准差为2
    X,y =make_blobs(n_samples=40,centers=2, random_state=5,cluster_std=2)
#将数据集用散点图方式进行可视化分析
   plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.cool)
    plt.show()

上面未做处理, x区间:(-12,0),y区间:(5,13)。现在我们使用StandardScaler进行处理。

代码语言:javascript
复制
#使用StandardScaler进行处理
x_1 =StandardScaler().fit_transform(X)
    plt.scatter(x_1[:,0],x_1[:,1],c=y,cmap=plt.cm.cool)
   plt.title("StandardScaler")
    plt.show()

处理后x区间:(-3,3),y轴:(-2,3)。StandardScaler原理:将所有数据转换为均值为0,方差为1的状态。

2.2MinMaxScaler

代码语言:javascript
复制
from sklearn.preprocessing import MinMaxScaler
    x_2 = MinMaxScaler().fit_transform(X)
    plt.scatter(x_2[:,0],x_2[:,1],c=y,cmap=plt.cm.cool)
   plt.title("MinMaxScaler")
    plt.show()

x区间:(0,1),y轴:(0,1),MinMaxScaler原理:将所有数据压缩到长宽都是1的方块中去。

X_std = (X -X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;

X_scaler =X_std/ (max - min) + min

2.3RobustScaler

代码语言:javascript
复制
from sklearn.preprocessing import RobustScaler
    x_3 =RobustScaler().fit_transform(X)
    plt.scatter(x_3[:,0],x_3[:,1],c=y,cmap=plt.cm.cool)
   plt.title("RobustScale")
    plt.show()

x区间:(-3,2),y轴:(-1,2.0)。如果数据有离群点,对数据进行均差和方差的标准化效果并不好。这种情况可以使用RobustScaler 作为替代。它们有对数据中心化和数据的缩放鲁棒性更强的参数。

2.4Normalizer

代码语言:javascript
复制
from sklearn.preprocessing import Normalizer
    x_4 =Normalizer().fit_transform(X)
    plt.scatter(x_4[:,0],x_4[:,1],c=y,cmap=plt.cm.cool)
    plt.title("Normalizer")
    plt.show()

x区间:(-0.9,-0.1),y轴:(-0.5,1.0)。Normalizer原理:把特征向量变成一个半径为1的圆或球(保留特征向量忽略数值)。

2.5 MaxAbsScaler、QuantileTransformer、Binarizer

代码语言:javascript
复制
from sklearn.preprocessing import MaxAbsScaler
from sklearn.preprocessing import QuantileTransformer
from sklearn.preprocessing import Binarizer
    x_5 =MaxAbsScaler().fit_transform(X)
    plt.scatter(x_5[:,0],x_5[:,1],c=y,cmap=plt.cm.cool)
   plt.title("MaxAbsScaler")
    plt.show()
    x_6 =QuantileTransformer().fit_transform(X)
    plt.scatter(x_6[:,0],x_6[:,1],c=y,cmap=plt.cm.cool)
   plt.title("QuantileTransformer")
    plt.show()
    x_7 =Binarizer().fit_transform(X)
    plt.scatter(x_7[:,0],x_7[:,1],c=y,cmap=plt.cm.cool)
   plt.title("Binarizer")
    plt.show()

3.数据处理函数介绍

3.1fit()、transform()、fit_transform()与fit_transform(trainData)区别

函数

意义

fit()

求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。

transform()

在fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。

fit_transform()

fit_transform是fit和transform的组合,既包括了训练又包含了转换。 transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)

fit_transform(trainData)

对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。

3.2 sklearn.preprocessing.StandardScaler

含义:标准化缩放

格式:

sklearn.preprocessing.StandardScaler(copy=True,with_mean=True, with_std=True)

参数

解释

copy

如果为false,就会用归一化的值替代原来的值;如果被标准化的数据不是np.array或scipy.sparse CSR matrix, 原来的数据还是被copy而不是被替代

with_std

boolean类型,默认为True,表示将数据方差规范到1

with_mean

boolean类型,默认为True,表示将数据均值规范到0

这里是用于做标准化,将数据的方差规范到1,均值规范到0,实际上就是标准正态分布的方差和均值。

方差:

均值:平均数

3.3 sklearn.preprocessing.MinMaxScaler

含义:最小最大值标准化

格式:

sklearn.preprocessing.MinMaxScaler(feature_range=(0,1), copy=True)

参数

解释

feature_range

为元组类型,范围某认为:[0,1],也可以取其他范围值。

copy

为拷贝属性,默认为True,表示对原数据组拷贝操作,这样变换后元数组不变,False表 示变换操作后,原数组也跟随变化,相当于c++中的引用或指针。

3.4 sklearn.preprocessing.RobustScaler

含义:使用对异常值鲁棒的统计信息来缩放特征。这个标量去除中值,并根据分位数范围(默认为IQR即四分位数范围)对数据进行缩放。IQR是第1个四分位数(第25分位数)和第3个四分位数(第75分位数)之间的范围。

格式:

sklearn.preprocessing.RobustScaler(with_centering,with_scaling,copy=True)

参数

解释

with_centering

boolean类型,默认为True。如果为真,在缩放前将数据居中。这将导致“转换”在尝试处理稀疏矩阵时引发异常,因为围绕它们需要构建一个密集的矩阵,在常见的用例中,这个矩阵可能太大而无法装入内存。

with_scaling

boolean类型,默认为True。如果为真,将数据缩放到四分位范围。quantile_range:元组(q_min, q_max), 0.0 < q_min < q_max < 100.0。默认:(25.0,75.0)=(第1分位数,第3分位数)= IQR。用于计算' ' scale_ ' '的分位数范围。

copy

boolean类型,可选,默认为真。如果为False,则尽量避免复制,而改为就地缩放。这并不能保证总是有效的;例如,如果数据不是一个NumPy数组或scipy。稀疏CSR矩阵,仍可返回副本。

属性

解释

center_

浮点数数组。训练集中每个特征的中值。

scale_

浮点数数组。训练集中每个特征的(缩放的)四分位范围。

3.5 sklearn.preprocessing.Normalizer

含义:该函数归一化输入数组使它的范数或者数值范围在一定的范围内。

格式:

sklearn.preprocessing.Normalize(InputArraysrc,OutputArray dst, double alpha=1, doublebeta=0, int norm_type=NORM_L2, intdtype=-1, InputArray mask=noArray() )

参数

解释

src

输入数组

dst

输出数组,支持原地运算

alpha

range normalization模式的最小值

beta

range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

normType

归一化的类型,可以有以下的取值:

NORM_MINMAX

数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

NORM_INF

此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)

NORM_L1

归一化数组的L1-范数(绝对值的和)

NORM_L2

归一化数组的(欧几里德)L2-范数

dtype

dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).

mask

操作掩码,用于指示函数是否仅仅对指定的元素进行操作。

3.6 sklearn.preprocessing.MaxAbsScaler

含义:该函数为绝对值最大标准化

格式:

sklearn.preprocessing.Normalize(feature_range,copy )

参数

解释

feature_range

tuple (min, max),默认值=(0,1),所需的转换数据范围。

copy

布尔值,可选,默认为真,设置为False执行插入行规范化并避免复制(如果输入已经是numpy数组)。

属性

解释

min_

ndarray, shape (n_features,),每个功能调整为最小。

scale_

ndarray, shape (n_features,) ,每个特征数据的相对缩放。

data_min_

ndarray, shape (n_features,) ,每个特征在数据中出现的最小值

data_max_

ndarray, shape (n_features,) ,每个特征在数据中出现的最大值

data_range_

ndarray, shape (n_features,) ,在数据中看到的每个特性范围 (data_max_ - data_min_)

3.7 sklearn.preprocessing.QuantileTransformer

格式:

sklearn.preprocessing.QuantileTransformer(*,n_quantiles=1000, output_distribution='uniform', ignore_implicit_zeros=False,subsample=100000, random_state=None, copy=True)

参数

解释

n_quantiles

int,默认值=1000或n_samplesNumber要计算的分位数。它对应于用于离散累积分布函数的地标数。如果n_quantiles数大于样本数,则n_quantiles分位数被设置为样本数,因为较大的分位数不能给出累积分布函数估计的更好近似。

output_distribution

{'uniform', 'normal'}, 默认='uniform'转换数据的边界分布。选项为'uniform'或'normal'。

ignore_implicit_zeros

布尔值, 默认=False,仅适用于稀疏矩阵。如果为True,则丢弃矩阵的稀疏项以计算分位数统计。如果为False,这些条目将被视为零。

subsample

int,默认=1e5,用于估计分位数以提高计算效率的最大样本数。注意,对于值相同的稀疏矩阵和密集矩阵,子采样过程可能不同。

random_state

int, RandomState instance或None,default=None确定子采样和平滑噪波的随机数生成。更多细节请参见子样本。在多个函数调用之间传递int以获得可再现的结果。

copy

布尔值,默认=True,设置为False以执行就地转换并避免复制(如果输入已经是numpy数组)。

属性

解释

n_quantiles_

Int 用于离散累积分布函数的实际分位数。

quantiles_

ndarray of shape (n_quantiles, n_features),与参考分位数相对应的值。

references_

ndarray of shape (n_quantiles, )参考分位数

3.8 sklearn.preprocessing.Binarizer

格式:

sklearn.preprocessing.Binarizer(threshold,copy)

参数

解释

threshold

浮点数,可选。小于或等于阈值的值映射到0,否则映射到1。

copy

布尔值,如果设置为False,则会避免复制。默认情况下为True。

4. 数据处理的重要性

下面我们来看一下数据处理的重要性。

代码语言:javascript
复制
from sklearn.neural_network import MLPClassifier
from sklearn import datasets
def sklearn_for_Nerver():
       wine =datasets.load_wine()
       X_train,X_test,y_train,y_test= train_test_split(wine.data,wine.target,random_state=62)
       mlp =MLPClassifier(hidden_layer_sizes=[100],max_iter=4000,random_state=62)
       mlp.fit(X_train,y_train)
       print("改造前训练模型得分{:.2%}".format(mlp.score(X_train,y_train)))
       print("改造前测试模型得分{:.2%}".format(mlp.score(X_test,y_test)))
       scaler = MinMaxScaler()
       scaler.fit(X_train)
       X_train_pp =scaler.transform(X_train)
       X_test_pp =scaler.transform(X_test)
       mlp.fit(X_train_pp,y_train)
       print("改造后训练模型得分{:.2%}".format(mlp.score(X_train_pp,y_train)))
       print("改造后测试模型得分{:.2%}".format(mlp.score(X_test_pp,y_test)))

输出

代码语言:javascript
复制
改造前训练模型得分62.41%
改造前测试模型得分48.89%
改造后训练模型得分100.00%
改造后测试模型得分100.00%

大家可以看到改造以后的模型得分得到了显著的上升。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.5 MaxAbsScaler、QuantileTransformer、Binarizer
  • 3.数据处理函数介绍
    • 3.2 sklearn.preprocessing.StandardScaler
      • 3.3 sklearn.preprocessing.MinMaxScaler
        • 3.4 sklearn.preprocessing.RobustScaler
          • 3.5 sklearn.preprocessing.Normalizer
            • 3.6 sklearn.preprocessing.MaxAbsScaler
              • 3.7 sklearn.preprocessing.QuantileTransformer
                • 3.8 sklearn.preprocessing.Binarizer
                • 4. 数据处理的重要性
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档