码迷,mamicode.com
首页 > 其他好文 > 详细

关于fit和transform

时间:2018-09-30 15:07:39      阅读:1284      评论:0      收藏:0      [点我收藏+]

标签:rem   参数   根据   nbsp   描述   公式   比较   内容   ipy   

Fit是对于数据进行拟合,所谓拟合,就是根据数据,计算获得数据里面的一些指标,比如均值,方差;下一步很多API都是需要这些参数来进行后续对数据的操作,比如下面要讲到的transform。

Transform,对于数据进行变形;常见的变形是标准化和归一化。标准化是需要均值和方差的,标准化本质上将数据进行正态分布化;

很多时候,当需要依次对训练数据和测试数据进行变形处理的时候,首先处理训练数据,这个时候需要调用fit,再调用tranform,或者直接使用fit_transform;然后再处理测试数据,这个时候,直接transform就可以了,因为处理训练数据的时候,其实已经通过fit获取了均值方差等指标;

rnd.seed(42)

m = 100

X = 6 * rnd.rand(m, 1) - 3

y = 2 + X + 0.5 * X**2 + rnd.randn(m, 1)

X_train, X_val, y_train, y_val = train_test_split(X[:50], y[:50].ravel(), test_size=0.5, random_state=10)

poly_scaler = Pipeline((

("poly_features", PolynomialFeatures(degree=90, include_bias=False)),

("std_scaler", StandardScaler()),

))

X_train_poly_scaled = poly_scaler.fit_transform(X_train)

X_val_poly_scaled = poly_scaler.transform(X_val)

这里牵涉一个对象就是标准化的伸缩,这个处理是为了避免单个数据过大,进而导致了数据处理异常;于是为了降低单个特征对于整体的影响,对于数据集合进行求导,然后对于所有的数据除以导数;将数据缩小到一定程度,降低了个别数值的影响。Numpy里面是有原始实现的:

>>> from sklearn import preprocessing

>>> import numpy as np

>>> X_train = np.array([[ 1., -1., 2.],

... [ 2., 0., 0.],

... [ 0., 1., -1.]])

>>> X_scaled = preprocessing.scale(X_train)

 

>>> X_scaled

array([[ 0. ..., -1.22..., 1.33...],

[ 1.22..., 0. ..., -0.26...],

[-1.22..., 1.22..., -1.06...]])

>>> X_scaled.mean(axis=0)

array([0., 0., 0.])

 

>>> X_scaled.std(axis=0)

array([1., 1., 1.])

最后看到经过伸缩数据满足了,均值为0,标准差为1(注意这里指定了参数为0,代表是对列求标准差,最后返回的一行数据;如果是1,则代表对行求标准差,最后返回的一列),后面还会以后给予axis的处理。

这个是sklearn中原始的处理;还有一个封装的类专门用于这个处理:StandardScale。

>>> scaler = preprocessing.StandardScaler().fit(X_train)

>>> scaler

StandardScaler(copy=True, with_mean=True, with_std=True)

>>> scaler.mean_

array([1. ..., 0. ..., 0.33...])

>>> scaler.scale_

array([0.81..., 0.81..., 1.24...])

>>> scaler.transform(X_train)

array([[ 0. ..., -1.22..., 1.33...],

[ 1.22..., 0. ..., -0.26...],

[-1.22..., 1.22..., -1.06...]])

这个形式变成了我们上面描述的fit-transform,在fit之后,将可以获取到mean以及std;然后将会进行一下数据变形;获取到了最后的矩阵,下面我们要查看一下这个矩阵到底是不是满足均值为0,标准差为1的正态分布呢?

import numpy as np

formated_data =scaler.transform(X_train)

print(np.mean(formated_data, 0))

print(np.std(formated_data))

返回信息:

[0. 0. 0.]

1.0

注意,在np.mean的时候,传递了第二个参数,且值为0(对列进行均值,返回一行);注意这个有值和没有值结果是完全不一样,没有传递参数只是返回一个值,应该是对于行列统一做了一下均值;

上面的描述中提到了transform的时候,内部执行的是标准化,到底对数据做了什么,到底为什么要做标准化呢?

首先将归一化/ 标准化,就是将数据缩放(映射)到一个范围内,比如[0,1],[-1,1],还有在图形处理中将颜色处理为[0,255];归一化的好处就是不同纬度的数据在相近的取值范围内,这样在进行梯度下降这样的算法的时候,曲线将会更加简单(由原始的椭圆变成了圆形),如下图所示:

至于缩放的原理就是量纲代表,比如身高和指甲宽度,如果统一都是厘米那么两者不是一个数量级,如果把身高的量纲改为米,那么你会发现身高取值范围和指甲宽度其实是相近的取值范围,这样避免了某个维度成为了影响学习结果的主导。

常见的归一化/ 标准化

1. Standard Scala(z-score standardization):是标准化处理;将元素通过下面的公式进行处理:

x =(x - ??)/??

标准缩放只是是和数据近似服从正态分布的场景;而且数据的分布发生变化,变为相对标准的正态分布

2. MaxMinScala:其实这个是归一化处理,MaxMinScaler并没有改变数据分布,只是将按照某个规则进行缩放;处理公式如下:

x = (x-min)/(max-min)

适合于整体数据比较分布平和(集中),没有离群数据,或者很少的离群数据,否则max的值的偏差将会导致计算不准确;而且MaxMinScala不稳定,如果有新加入的数据需要重新进行计算;

3. RobustScaler:是一种鲁棒性特别好的算法;如果数据有很多异常值,那么使用该方法对数据进行处理;

4. 非线性化归一:对于一些场景下数据分化非常大,那么可以使用log,指数以及反正切的方式对数据进行缩放;

log函数:x = lg(x)/lg(max);反正切函数:x = atan(x)*2/pi

 

总结:

1)在分类和聚类的算法中,牵涉到了距离的计算,那么,PCA降维计算的时候,Standard Scaler表现的比较好;

2)不涉及距离,协方差计算,数据不符合正态分布的场景下,可以使用MinMaxScaler来计算;

 

可以通过scipy库中内容来做正态性检验;

什么是协方差?用来表明(X,Y)是否独立的概念

 

 

 

参考:

https://www.cnblogs.com/bjwu/p/8977141.html

正态性检验实现

https://blog.csdn.net/QimaoRyan/article/details/72861387

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

https://blog.csdn.net/csmqq/article/details/51461696

关于fit和transform

标签:rem   参数   根据   nbsp   描述   公式   比较   内容   ipy   

原文地址:https://www.cnblogs.com/xiashiwendao/p/9729152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!