浅谈sklearn中的数据预处理
Posted raelum
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈sklearn中的数据预处理相关的知识,希望对你有一定的参考价值。
目录
前言
sklearn 中的 sklearn.preprocessing
中提供了数据预处理的相关函数,本文将主要围绕特征缩放来展开讲解。
一、标准化(StandardScaler)
设数据矩阵为
X = [ x 1 T x 2 T ⋮ x n T ] X= \\beginbmatrix \\boldsymbolx_1^\\mathrm T \\\\ \\boldsymbolx_2^\\mathrm T \\\\ \\vdots \\\\ \\boldsymbolx_n^\\mathrm T \\endbmatrix X=⎣⎢⎢⎢⎡x1Tx2T⋮xnT⎦⎥⎥⎥⎤
其中 x i = ( x i 1 , x i 2 , ⋯ , x i d ) T \\boldsymbolx_i=(x_i1, x_i2,\\cdots,x_id)^\\mathrm T xi=(xi1,xi2,⋯,xid)T 为特征向量。
在进行下一步之前,我们有必要先引入数据矩阵的均值和标准差。
我们知道,对于数据向量 a = ( a 1 , ⋯ , a n ) T \\boldsymbola=(a_1,\\cdots,a_n)^\\mathrm T a=(a1,⋯,an)T 而言(这里的向量可以理解成一组数据,之所以称之为向量,是为了方便后续的表述),其均值和标准差分别为:
μ ( a ) = a 1 + ⋯ + a n n , σ ( a ) = ( 1 n ∥ a − μ ( a ) ∥ 2 ) 1 / 2 , 其 中 μ ( a ) = ( μ ( a ) , ⋯ , μ ( a ) ⏟ n 个 ) T \\mu(\\boldsymbola)=\\fraca_1+\\cdots+a_nn,\\quad\\sigma(\\boldsymbol a)=\\left(\\frac1n \\Vert \\boldsymbola-\\boldsymbol\\mu(\\boldsymbola)\\Vert^2\\right)^1/2,\\quad 其中 \\;\\boldsymbol\\mu(\\boldsymbola)=(\\underbrace\\mu(\\boldsymbola),\\cdots, \\mu(\\boldsymbola)_n 个)^\\mathrm T μ(a)=na1+⋯+an,σ(a)=(n1∥a−μ(a)∥2)1/2,其中μ(a)=(n个 μ(a),⋯,μ(a))T
我们将 X X X 写成行向量的形式: X = ( a 1 , a 2 , ⋯ , a d ) X =(\\boldsymbola_1,\\boldsymbola_2,\\cdots,\\boldsymbola_d) X=(a1,a2,⋯,ad),其中每个 a i \\boldsymbola_i ai 均为列向量,因此
μ ( X ) = ( μ ( a 1 ) , μ ( a 2 ) , ⋯ , μ ( a d ) ) T σ ( X ) = ( σ ( a 1 ) , σ ( a 2 ) , ⋯ , σ ( a d ) ) T \\beginaligned \\mu(X)&=(\\mu(\\boldsymbola_1),\\mu(\\boldsymbola_2),\\cdots,\\mu(\\boldsymbola_d))^\\mathrm T \\\\ \\sigma(X)&=(\\sigma(\\boldsymbola_1),\\sigma(\\boldsymbola_2),\\cdots,\\sigma(\\boldsymbola_d))^\\mathrm T \\endaligned μ(X)σ(X)=(μ(a1),μ(a2),⋯,μ(ad))T=(σ(a1),σ(a2),⋯,σ(ad))T
设对 X X X 进行标准化后得到 Z Z Z,利用 numpy 的广播机制, Z Z Z 有如下形式
Z = ( z 1 , z 2 , ⋯ , z d ) , 其 中 z i = a i − μ ( a i ) σ ( a i ) , i = 1 , 2 , ⋯ , d Z=(\\boldsymbolz_1,\\boldsymbolz_2,\\cdots,\\boldsymbolz_d),\\quad 其中\\; \\boldsymbolz_i=\\frac\\boldsymbola_i-\\mu(\\boldsymbola_i)\\sigma(\\boldsymbola_i),\\;\\;i=1,2,\\cdots,d Z=(z1,z2,⋯,zd),其中zi=σ(ai)ai−μ(ai),i=1,2,⋯,d
当然 Z Z Z 可以更为简洁地表成
Z = X − μ ( X ) T σ ( X ) T Z=\\fracX-\\mu(X)^\\mathrm T\\sigma(X)^\\mathrm T Z=σ(X)TX−μ(X)T
查看 X X X 的均值,方差和标准差:
from sklearn.preprocessing import StandardScaler
import numpy as np
# 数据矩阵
X = np.array([
[1, 3],
[0, 1]
])
# 创建一个scaler实例并将数据传入该实例中
scaler = StandardScaler().fit(X)
# 查看X的的均值,方差和标准差
print(scaler.mean_) # [0.5 2. ]
print(scaler.var_) # [0.25 1. ]
print(scaler.scale_) # [0.5 1. ]
之所以标准差为 scale_
,是因为标准差控制着我们数据的缩放程度。需要注意的是,如果数据矩阵的某一列方差为
0
0
0,则 scale_
为
1
1
以上是关于浅谈sklearn中的数据预处理的主要内容,如果未能解决你的问题,请参考以下文章
浅谈PipelineDB系列一: Stream数据是如何写到Continuous View中的