Fit是对于数据进行拟合,所谓拟合,就是根据数据,计算得到数据里面的一些指标,好比均值,方差;下一步不少API都是须要这些参数来进行后续对数据的操做,好比下面要讲到的transform。html
Transform,对于数据进行变形;常见的变形是标准化和归一化。标准化是须要均值和方差的,标准化本质上将数据进行正态分布化;算法
不少时候,当须要依次对训练数据和测试数据进行变形处理的时候,首先处理训练数据,这个时候须要调用fit,再调用tranform,或者直接使用fit_transform;而后再处理测试数据,这个时候,直接transform就能够了,由于处理训练数据的时候,其实已经经过fit获取了均值方差等指标;dom
1 rnd.seed(42) 2 3 m = 100 4 5 X = 6 * rnd.rand(m, 1) - 3 6 7 y = 2 + X + 0.5 * X**2 + rnd.randn(m, 1) 8 9 X_train, X_val, y_train, y_val = train_test_split(X[:50], y[:50].ravel(), test_size=0.5, random_state=10) 10 11 poly_scaler = Pipeline(( 12 13 ("poly_features", PolynomialFeatures(degree=90, include_bias=False)), 14 15 ("std_scaler", StandardScaler()), 16 17 )) 18 19 X_train_poly_scaled = poly_scaler.fit_transform(X_train) 20 21 X_val_poly_scaled = poly_scaler.transform(X_val)
这里牵涉一个对象就是标准化的伸缩,这个处理是为了不单个数据过大,进而致使了数据处理异常;因而为了下降单个特征对于总体的影响,对于数据集合进行求导,而后对于全部的数据除以导数;将数据缩小到必定程度,下降了个别数值的影响。Numpy里面是有原始实现的:函数
1 >>> from sklearn import preprocessing 2 3 >>> import numpy as np 4 5 >>> X_train = np.array([[ 1., -1., 2.], 6 7 ... [ 2., 0., 0.], 8 9 ... [ 0., 1., -1.]]) 10 11 >>> X_scaled = preprocessing.scale(X_train) 12 13 14 15 >>> X_scaled 16 17 array([[ 0. ..., -1.22..., 1.33...], 18 19 [ 1.22..., 0. ..., -0.26...], 20 21 [-1.22..., 1.22..., -1.06...]]) 22 23 >>> X_scaled.mean(axis=0) 24 25 array([0., 0., 0.]) 26 27 28 29 >>> X_scaled.std(axis=0) 30 31 array([1., 1., 1.])
最后看到通过伸缩数据知足了,均值为0,标准差为1(注意这里指定了参数为0,表明是对列求标准差,最后返回的一行数据;若是是1,则表明对行求标准差,最后返回的一列),后面还会之后给予axis的处理。学习
这个是sklearn中原始的处理;还有一个封装的类专门用于这个处理:StandardScale。测试
1 >>> scaler = preprocessing.StandardScaler().fit(X_train) 2 3 >>> scaler 4 5 StandardScaler(copy=True, with_mean=True, with_std=True) 6 7 >>> scaler.mean_ 8 9 array([1. ..., 0. ..., 0.33...]) 10 11 >>> scaler.scale_ 12 13 array([0.81..., 0.81..., 1.24...]) 14 15 >>> scaler.transform(X_train) 16 17 array([[ 0. ..., -1.22..., 1.33...], 18 19 [ 1.22..., 0. ..., -0.26...], 20 21 [-1.22..., 1.22..., -1.06...]])
这个形式变成了咱们上面描述的fit-transform,在fit以后,将能够获取到mean以及std;而后将会进行一下数据变形;获取到了最后的矩阵,下面咱们要查看一下这个矩阵究竟是不是知足均值为0,标准差为1的正态分布呢?spa
1 import numpy as np 2 formated_data =scaler.transform(X_train) 3 print(np.mean(formated_data, 0)) 4 print(np.std(formated_data))
返回信息:.net
[0. 0. 0.]code
1.0orm
注意,在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