数学建模社区-数学中国

标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值... [打印本页]

作者: 浅夏110    时间: 2020-6-3 16:17
标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。+ `& U! g1 h; {6 L
# a' ]/ V+ }6 I6 O2 r, }( Z: t
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler# R1 R  w. z) \
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
6 l* H# t, x! C1 `  a; B数据变换的目的:
) E1 w) e  \% T  y% u6 j  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
* _( @& U: Z: ~' T" M( ?
! i% V' s6 ?8 J8 X2 m 定义 : 设有n个数据的序列  ,则称映射
. T9 O7 ^) T9 K4 t* W7 A+ Y6 a, w2 ~6 Q6 \! A( J
                                       
# m. b  U% q9 e. d3 f9 b( q9 T. h4 f
          为序列 x到序列 y 的数据变换。
5 b% M" k% @- B
# J* B+ [0 ]" B) f( a数据变换的七种常见方式
. J$ M) L: W7 g" k# A5 m* b: Z此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
. Q5 z' E* X- A* z* O+ T# t4 i1 R$ T
初值化变换
, L3 m. x5 E4 J! j' G) p; ?8 Z/ A% Z4 Q3 I& B
, V$ t" b: U: S& c
也就是要对每一个数据,都除以第一个数据。
4 m1 U  F- W4 G6 N  ^: m2 O- V% M9 q
均值化变换
, u9 }7 ?' e# A8 c+ K
- m! N; D& C4 T) V* H1 O3 c0 s+ g- b1 G2 X5 a
             对每一个数据,都除以均值。! R6 D' M0 P7 f- l/ K; x7 b( |) s

2 J& ~0 ]7 g4 k  H1 p0 M% e百分比变换) P! q  Z+ i% a8 Q" }/ v( N

- S  X" e1 n7 G' H; D
0 C9 _- s5 a  s( X; c# i( S7 x分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
) ^$ ~% s7 L/ E' P# C8 ?5 w6 K+ a8 ], U" [6 L
倍数变换
; N! Q, r. [+ g5 p- p$ O$ q   
* h, w- {0 }" S% R5 a3 i$ z4 M: V9 V  W8 M/ S0 R+ t- b/ P- {
归一化变换
" d+ T4 E5 R2 e6 I) u5 S! ^- Z
  n5 u" u# @# Z- d
# q! o. T) j8 h$ C 其中   为大于零的某个值,称  是归一化变换。 ! g5 e* D  L! ]5 ?3 T1 O
  _: p& B* n' q+ {' }
5 H! X1 B9 g$ ^4 k$ D
极差最大值化变换* C: U# Z4 ]$ \% ]7 S4 l

' A7 p8 k- F! |5 h( y/ V; p6 M7 H/ o& }# ~

+ Y8 _9 n8 P$ ?  d5 G+ h! z5 T  `/ [1 W0 j3 Z
区间值化变换
7 [, N! A1 x, b! b; ~
0 i5 d' t9 E: }# V0 C3 d- K( s3 b9 I$ S; P  o/ x! V) l0 P  n0 Y
                  ,% Z# b  k8 \0 E8 c% F
, P" c7 m) W- h
1. matlab 的mapminmax归一化函数* ~7 v$ Z5 D/ J4 a# j' b* S
函数用法:+ z7 H/ l5 ^6 `; A
[Xn,Xps]=mapminmax(X,min,max)
& S8 d5 b* P( L, O3 t- [, |/ D- S+ x! z2 ^
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。% r5 p$ V6 Q2 }! G- ]

$ M# o2 L$ `* H) [/ }; H   (2)min,max规定X的归一化范围,根据需要自行设置+ m: K: K0 N8 @

% ~& q  i  X8 r$ B   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用       E+ n  J) j( d
( H" V: @6 o# b/ M- C8 R
 调用方法:
  x5 G. j" \8 ]4 I$ V; K0 D7 R9 B; g" d5 h2 z
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化3 a. b4 B; d4 i
& X7 T; @; j& _  W! A& b9 O
X2=mapminmax('reverse',Xn, Xps);%反归一化
) l" v3 L- v, M2 k9 e  E1 S' l1 E. k0 p! i" ~3 N
x=[1,-1,2;   2,0,0;   0,1,-1]
* i9 k' N" e! g5 i[x1,Xps]=mapminmax(x,0,1)# Q: c2 t* c, W  [" H
4 j0 V2 u$ U' M0 g, i5 \' x

7 C' Y+ h. q2 k( h3 U% H0 c8 ]& v! b1 s6 o$ f
对于python中的axis=0 和axis=1的问题, j; {. I. W6 T" s7 `
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
( Q# r2 F7 g* R( y* E换句话说:3 S; ^0 R$ f( d0 T

, X4 y9 l* `) A( f+ H使用0值表示沿着每一列或行标签\索引值向下执行方法( a& l8 R; a7 j' y. q/ y
使用1值表示沿着每一行或者列标签模向执行对应的方法
/ a7 G, L. B. l3 F+ E* _8 Z& F9 b  w6 X8 l5 M8 E- }# Q
1 a$ E3 w: \; p# I& t/ g0 D/ L

" W" I8 c/ V- J4 m6 dpython的sklearn中 scale函数
# W& \! `1 d7 R. h5 k' c: W1 标准化,均值去除和按方差比例缩放3 r4 }9 I2 N& K( `$ G$ u0 J
              (Standardization, or mean removal and variance scaling)
6 ?2 ?4 t  n) H. P  L; d% z) k
. z3 ^, y* k" |  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
- t! |: I$ k" x3 X' s; N$ i) v* I, b$ x
from sklearn import preprocessing
- j3 y) ?3 l& U+ }0 zimport numpy as np  
8 Q( C/ @" h- I& s* _X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
) o2 Q9 G) \' C, x: g0 F4 B# dX_scaled = preprocessing.scale(X)
$ F+ ~/ J7 ]- f6 |
! K" I/ t+ _. ^: K- f( r6 J4 l4 p0 e#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
& c& d8 m/ x" e, D3 ^  U  a                                  [ 1.22474487  0.         -0.26726124]
2 s5 u, o$ C! \6 j% C                                  [-1.22474487  1.22474487 -1.06904497]]
* f; S9 K# r/ x9 I# Z- v) |#scaled之后的数据列为零均值,单位方差2 z; h( h- W9 G# `
X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
4 [1 ]/ u, o7 Q* H) n8 g1 a6 vX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])# {2 g5 S" u- g- ~/ K
3 D% |% f# m4 {$ U* n

4 z5 n. X8 P2 X6 o7 @$ ~
  i- v0 [+ k/ G" G. [+ A1 z4 t0 t# x9 u- TStandardScaler
0 N+ s1 Q) `5 o; M& F% y% GStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
! K, T  a* M" [6 p0 G. j
  q2 `0 ~; y5 B$ x% G+ Y! L& l$ gfrom sklearn.preprocessing import StandardScaler' D0 ?* q' [7 f# l% J% ^9 N* ]
x=[[10001,2],[16020,4],[12008,6],[13131,8]]0 J$ P1 G- [% @- q# `
X_scaler = StandardScaler()- G2 {9 l# j% V& X; l0 A
X_train = X_scaler.fit_transform(x)
* \' u$ c: b/ e1 x! K4 W5 Y6 t+ nX_train% _4 m, a  ?, T$ j1 X$ M
#结果如下
) s0 m& z9 x' u1 }% N+ {array([[-1.2817325 , -1.34164079],* E# {5 \& D% A2 ^4 E
       [ 1.48440157, -0.4472136 ],
4 q; n+ c- X' U- j4 j& i% m* P       [-0.35938143,  0.4472136 ],
# M& `, [9 f- z; h       [ 0.15671236,  1.34164079]])
3 |6 D! _' r! L  r1 G& {; F0 m) T; X" |, E& `

. i- P6 _8 Z& b$ U# \7 o
/ X0 r& G5 ^/ U7 C4 ]- L/ A3 @

注 :

from sklearn.preprocessing import StandardScaler
4 W5 g* ~' t: e& W' y, J# q% sx=[[10001,2],[16020,4],[12008,6],[13131,8]]
3 y+ i/ \6 R8 cX_scaler = StandardScaler()
* Z1 k' x6 e( u$ n. K8 oX_train = X_scaler.fit_transform(x)+ w) c, V/ f9 ^5 @1 M7 Z: b
X_train
2 v0 C, j8 q+ S& t0 ~#结果如下! s. }( p/ C* P
array([[-1.2817325 , -1.34164079],
( ]: @0 `0 u7 |3 H# B4 [       [ 1.48440157, -0.4472136 ],
- S. t9 I) ]' X- r2 P       [-0.35938143,  0.4472136 ],
* X, u- `; o3 W: h       [ 0.15671236,  1.34164079]])
- s. E3 L2 n, P2 p; z! \
8 ^& t* Q4 j% g  r% d& {. J& fscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)% J' y& `7 _& d5 I- @1 M
scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  , f$ h6 k& p( L; E
scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) ' ]" a' S& B8 ~; J) H! K
#测试将该scaler用于输入数据,变换之后得到的结果同上
) e: C$ G# a; v5 |: ascaler.transform(X) ; F3 }, z  N0 J' ~. Q
#out: % K0 |% {0 M) i
array([[ 0., -1.22474487,  1.33630621],   {- E( y9 o% f8 p5 h' f
       [ 1.22474487, 0. , -0.26726124], 9 s% l6 o2 \: u
       [-1.22474487,1.22474487, -1.06904497]])  7 f4 b9 C  L' y3 ?
scaler.transform([[-1., 1., 0.]])  #scale the new data& p: `) O" |, S7 V
# out: array([[-2.44948974,  1.22474487, -0.26726124]])2 C: c5 c, h% w; P* `- I. W7 |8 ~5 p

  s, L0 J( |) K# {2 将数据特征缩放至某一范围(scalingfeatures to a range)
$ F: k! v2 d, o+ G7 d* B( e 1 i) n  I1 k$ v7 g8 h* J- |! Y/ v* {
5 q/ V1 H4 J& f4 o3 @  I
2.1 MinMaxScaler (最小最大值标准化)
, z9 x; N, a4 R- L6 d7 _ 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  + }! z1 p* D& M' B
, J' b$ H2 s2 p7 n2 x/ X$ f
from sklearn.preprocessing import MinMaxScaler# B, K* f4 _7 |  c
x=[[10001,2],[16020,4],[12008,6],[13131,8]]& k6 r5 t9 t) K' b! X! |
min_max_scaler = MinMaxScaler()
2 _3 i7 u5 F/ x9 ?X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,+ P5 }! b. k, @5 k, ]& z8 P/ s: }

) c6 V7 l; u, g% e+ Omin_max_scaler = MinMaxScaler(feature_range=(-1,1)): O3 z5 U* s1 r( {- E# h4 Y
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
6 }1 }* r. L' Y$ c5 N6 Q8 {6 C# z" d+ m. Q
MinMaxScaler的实现& ^- P* H* b* u! {: G: ?& T3 n9 K
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))% j; s' g! i0 Y+ S
X_scaled = X_std / (max - min) + min
! j6 O' @5 c# n! h! q+ f0 x$ J1 E/ |1 Y' x
这是 向量化的表达方式,说明X是矩阵,其中! F, c3 P4 H3 v) m) P
9 g$ ?, e2 K* }. e% a, u
X_std:将X归一化到[0,1]之间
  g) r9 A8 H) a* \X.min(axis=0)表示列最小值. z/ m& R0 ?, ?  s1 w6 O' S* |  ^
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
9 ^" q6 O0 ]4 w9 S6 w2 P, f2 o- e0 ~: `
' S$ e0 y6 D  x
2.2 MaxAbsScaler(绝对值最大标准化)
- @) k6 S0 E! H# H* z; N         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
0 A7 K$ j. P: R/ k2 b( o" i  `* R7 M
X_train = np.array([[ 1., -1.,  2.],, c* r/ Z: `+ G, @& \
                     [ 2.,  0.,  0.],
5 G& s. X/ ]* m8 x5 r/ H1 [                    [ 0.,  1., -1.]])9 W7 c+ N8 k6 `+ C
max_abs_scaler = preprocessing.MaxAbsScaler()' N( `9 {" B9 K3 ?, v7 r
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
4 ~; z- K$ q& {* Q: T# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])2 J  n8 w$ M5 _# a) S. Q2 P  m
X_test = np.array([[ -3., -1.,  4.]])
- a; u, a8 ^) I: J( h* W1 ^% M$ B) ~X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]]): k. h$ ?: `+ y* Z" m' B4 [$ _
max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
& d' d$ x9 J8 r3 O* _: h# E
" `& ?* E; A# @! f3 x; T9 ]4 W; \5 @1 z# p1 i

% a! w+ H3 Z; z; `4 {! W8 \. i9 ]+ w
& r9 Z3 y9 n& B' R! ~2 X. h" R' W* Q* [* o7 r

; c! C4 M' N  H' p' D
; O8 m5 s* t1 I! z" d& o1 c) m
+ X: t2 E/ R" C- J9 D0 M
0 E4 T) J2 K  e0 U; }3 u) G/ p( I. I
————————————————
: s0 Y) G1 X! k( ]  o  Y版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 y, G" C* r  Z5 \; x# D
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
) {" y  Z9 R4 t" g1 m
: O: v( g3 a' ?; D) N1 M
: r4 A- T- N% d8 h" Y




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5