浅谈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=x1Tx2TxnT

其中 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)=(n1aμ(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中的数据预处理的主要内容,如果未能解决你的问题,请参考以下文章

sklearn-preprocessing预处理数据的方法

机器学习- Sklearn (交叉验证和Pipeline)

浅谈PipelineDB系列一: Stream数据是如何写到Continuous View中的

预处理数据的方法总结(使用sklearn-preprocessing)

数据归一化和其在sklearn中的处理

将多个预处理步骤应用于 sklearn 管道中的列