数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-6-3 16:17
标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
* Y. n) F" ^3 G/ W. Q3 ^2 ^, k( H3 U
0 \# y2 P8 D# \" ~; i% k当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
: ^( L. M" P4 @当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler4 K/ m+ E" ~2 R* m' S0 C. B1 q
数据变换的目的:
' h8 W" @! z& K" J9 q, r" v  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
' K' U9 Q- @3 L' g' e
) U# Z/ X" j/ U8 H( Z4 U 定义 : 设有n个数据的序列  ,则称映射
1 H# u. E# q7 V3 \/ G
" c3 i8 z7 z$ v* D/ i* ^                                        % f9 t' {  _- X& B; R
% @9 v+ d: S$ t/ |! j
          为序列 x到序列 y 的数据变换。 1 W( O# n/ h; i

$ g4 a$ ~8 R, S  F$ t1 B: S  c数据变换的七种常见方式
0 m) H$ z8 X" f+ i- z8 H9 F. z/ |, o此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
8 K" R$ G% O7 G  O( B: w8 p
2 N. D; L% z$ I  q$ d" ~初值化变换: M9 u2 X9 y! O$ O) J* O5 X8 f

, G2 C7 l1 n1 F1 S( y, d  K; B% b5 N9 L
也就是要对每一个数据,都除以第一个数据。3 e) e+ t. _  r( R( L5 O5 I

" P/ Q% L0 I! N# }5 o均值化变换% G) z9 }& `4 c8 ?
& Q- J4 I! U' H

8 e% ~' |& }6 _( {' q             对每一个数据,都除以均值。
/ Z4 h$ O* z* A: ?' |1 z
/ a3 ]; w4 I. e百分比变换+ O( g6 o7 v1 f. u6 ^
$ h  k- O8 l: ~8 h% ?: Q; |/ ^
) @3 @( k/ t0 S& w
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
* g8 W4 ]& C: y& [1 U% J) h8 k* [  y  T5 H! E' V: T( X$ }
倍数变换
; b( M2 ^7 j, m* q    : v, i2 m: i4 J, w! @9 G" K

( H; S; N0 i9 W. d归一化变换
, S& g" {% O- k& J3 z) V8 B2 @4 O  r
: n/ `, o6 B+ z5 g( u
其中   为大于零的某个值,称  是归一化变换。
; j5 Y* S. l5 ?$ h' }) w& Y1 L
) Z+ I" S; x5 `1 ~
7 e8 J# ~1 K, C极差最大值化变换$ d$ o. r' k7 U& d
- |% x; K: {4 N

1 Y5 W7 _5 m- m3 V) q6 M0 `7 Z
  \- j- V6 P) u; ?, X. R$ c5 i8 A
$ r9 k9 y/ g5 V, L  K* F5 C区间值化变换) g; ^* T+ H* Z" a
) z+ o2 m0 c8 \$ M; S) N& B
  L; D+ T! x6 u1 W9 F) V
                  ,1 [: {$ j4 q" v2 C! _) \1 Q1 r
# H6 D0 P: i1 z) R6 ?# u+ ]  e
1. matlab 的mapminmax归一化函数
0 B4 J# c9 O+ u7 E7 @) S3 ?4 z' u函数用法:
' O1 R" c$ h+ j0 W" ^# f- { [Xn,Xps]=mapminmax(X,min,max)
+ z: B: I( X; D, C! Y# n+ t5 s5 B  z2 a( k5 T1 M! n
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
4 @6 h0 P( n/ K* p* [0 q( J* R  ]1 Q& k) {  p  u; r
   (2)min,max规定X的归一化范围,根据需要自行设置
# K! t# M4 B1 F  L6 R" M( {! Z/ a3 T7 Y; r! @- K) n% n' _9 X
   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     % Y/ @$ b7 |. Q& S
: M2 E/ ~3 t3 A/ U% X* L# c& Y
 调用方法:+ V6 e8 p- k% O

+ e8 c5 L, V& o) eX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化! {$ S* X) b+ D: A2 s

( ~( L$ `2 K4 F2 E( ]& NX2=mapminmax('reverse',Xn, Xps);%反归一化6 D+ u. Q+ e0 t

# a$ V# K/ C; y1 K9 Fx=[1,-1,2;   2,0,0;   0,1,-1]% {  P. n8 s9 y4 C" y
[x1,Xps]=mapminmax(x,0,1)
* l$ Q. V4 t" _+ @$ W  n) b- k
% |1 E% j: s: W% X6 G+ K5 l) J) v% `  ^( Z
* y; G& S$ q5 V8 _$ C0 Q
对于python中的axis=0 和axis=1的问题
( \; D$ ~: j  G! h# A% k 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
0 A: z7 E% U7 ]$ T( x+ w9 e6 E3 x换句话说:
0 C% K* }5 f2 P3 Q, y/ n$ Y& Q7 R7 Q" E* z+ g! R4 O
使用0值表示沿着每一列或行标签\索引值向下执行方法
/ C# ^2 M3 x! j- C0 i4 H8 W4 p* v. O使用1值表示沿着每一行或者列标签模向执行对应的方法$ N1 {/ s4 k4 ^7 I, S

% g3 r9 a; U# Y; y1 D
" ~* g6 L9 ^5 O6 M  _. A2 J2 I/ j+ W9 L" g2 @1 U7 M6 |
python的sklearn中 scale函数' v; \$ f4 W! `& ^5 w# _
1 标准化,均值去除和按方差比例缩放
! t7 Z' A7 l3 l2 `# @3 A4 r              (Standardization, or mean removal and variance scaling)
% @( A: p, s7 G$ y
5 e3 X+ D0 I* y( p, x6 @. O  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。# E( P- d7 e& N$ T
* r/ C8 R4 x& G8 e$ \
from sklearn import preprocessing
0 c/ R: v& a2 @/ |1 zimport numpy as np    o0 _" A" F( Q0 j& }- D5 B
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
! s- o+ q  j* t: iX_scaled = preprocessing.scale(X) & }- ?, Y& z/ O8 \6 V

. q9 u- {, ?7 M8 w% `* G7 @  y#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
% x" P( h$ [4 B- R" Q, D* N                                  [ 1.22474487  0.         -0.26726124]
# d, m) A" V0 r. l# |                                  [-1.22474487  1.22474487 -1.06904497]]
9 e) G; }1 S4 R, J; u#scaled之后的数据列为零均值,单位方差) ~- H! Y# _$ w$ p8 {
X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
5 r# [$ O4 n/ uX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.]): N; B+ O8 s+ R  X

: Z' T7 u# b' X
7 a. n& B: l3 x& j7 m  W: M$ H. q8 r% V4 N5 A6 z
StandardScaler . v6 t( ^9 t& \5 R1 s
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差): }' x" r0 d. Z# n* t

( n& x( \% H  g4 J  [7 ?8 Z! Ufrom sklearn.preprocessing import StandardScaler
( z6 \8 ]  ^. ]6 q$ r6 s) ]x=[[10001,2],[16020,4],[12008,6],[13131,8]]; [$ b9 Q  N) {+ j1 m' A$ \
X_scaler = StandardScaler()
! u9 \1 ], w: U9 e. \; H4 zX_train = X_scaler.fit_transform(x)
, Y% L# M' M& x) y2 mX_train
* T2 [$ {( R1 F* S, H# C7 U! b& H#结果如下! o. b/ v$ P& n# w
array([[-1.2817325 , -1.34164079],; {. u0 I7 L* g3 f0 L
       [ 1.48440157, -0.4472136 ],
9 g7 f$ G9 q9 Y$ L0 H' I8 u       [-0.35938143,  0.4472136 ],7 b5 L( [3 b& d1 K6 G
       [ 0.15671236,  1.34164079]])
8 ?: E5 g. _9 |
5 Y* _  o/ K( Z% m2 x2 a) d0 j
% @6 g7 r" f  j5 \9 ?3 C( R  _0 Q$ H; r" a  }  `- s0 Q" h

注 :

from sklearn.preprocessing import StandardScaler
7 m% s& O0 k" X; }x=[[10001,2],[16020,4],[12008,6],[13131,8]]
: @" i9 u% v" Z  C& nX_scaler = StandardScaler()/ l- e2 Q+ C! T' ]. S8 j8 Q
X_train = X_scaler.fit_transform(x)" C+ \: x- x7 Y& E
X_train
8 a, I+ ^4 }) x" s7 L. f& \#结果如下6 v- j$ M7 D& H) d8 s
array([[-1.2817325 , -1.34164079],% b, K( v1 J* ^. b5 d7 ?# q
       [ 1.48440157, -0.4472136 ],/ q$ U' l  {0 R$ l
       [-0.35938143,  0.4472136 ],6 m/ m7 d3 S$ ~9 j, M8 Z& L
       [ 0.15671236,  1.34164079]])
/ o, [: h2 O( n2 s) ]/ b. M( P" ?2 q% r% ^" N$ ~
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)( N( ~# N) _6 K6 W
scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
, u' ]+ P3 x* R2 e# S3 Rscaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) 5 K# Y' m0 j& T+ v' g" _
#测试将该scaler用于输入数据,变换之后得到的结果同上8 ~) z' _3 w/ S3 r! J
scaler.transform(X) * o0 W1 \& S2 a0 n8 f# D) V
#out:
0 e+ }7 Z. o$ _% P) W' yarray([[ 0., -1.22474487,  1.33630621],
+ N4 ?/ z, e% b: g5 i       [ 1.22474487, 0. , -0.26726124],
* h6 [" X6 Y6 g& \2 M       [-1.22474487,1.22474487, -1.06904497]])  & y3 Y& H( S& }9 H7 s
scaler.transform([[-1., 1., 0.]])  #scale the new data
8 Z  R; S% F& f0 m% g5 L# out: array([[-2.44948974,  1.22474487, -0.26726124]])
0 Y( l/ l0 D1 {: P5 i1 k4 k3 q1 d, `' C6 B$ X
2 将数据特征缩放至某一范围(scalingfeatures to a range)  U3 N' {1 {6 E' M# k

8 y, I/ f" `7 A, h$ n* v4 `

& x# k, [7 F) F3 n# ?: R2.1 MinMaxScaler (最小最大值标准化)
2 o% O* o. ~$ j 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  . i2 g5 ?% ~+ E" |7 c( w* r

  i' Z4 t$ O* qfrom sklearn.preprocessing import MinMaxScaler
: `- p# t  _6 Vx=[[10001,2],[16020,4],[12008,6],[13131,8]]# \4 X% R0 ]3 g- M& m  w
min_max_scaler = MinMaxScaler()
8 Y9 N. d6 S3 b) V: j) u' gX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,$ e4 Y" M9 r1 o8 {8 \
4 M# _7 P5 }3 G: X, T7 v, i
min_max_scaler = MinMaxScaler(feature_range=(-1,1))& ]- f5 e5 r+ ~' b: s
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
0 Z8 z! \: J( y4 G- ?. ]" J$ [, [% U: Z
MinMaxScaler的实现9 a& _" F) e* \5 ~9 \1 L" l- B' T- Z  b9 d
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
  K/ w( ], C! N7 S- h  a9 K- WX_scaled = X_std / (max - min) + min/ q: t. j" G& b' |$ P
5 Y8 J" b6 ~7 @+ G1 e
这是 向量化的表达方式,说明X是矩阵,其中8 [7 a% t5 l' Y! a3 d

9 j8 g; E* c2 d6 o3 ^. LX_std:将X归一化到[0,1]之间
6 I0 s7 k- c3 J. N% bX.min(axis=0)表示列最小值; f2 U1 ~& o% O* _
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
/ S) U: \! C# D5 I( I5 Q% f7 w# P2 p( O* `) M
' l4 _  Q# o2 S. A
2.2 MaxAbsScaler(绝对值最大标准化)" w. ~& a1 e# G3 r
         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。3 z$ O+ d- _- I* K
- S7 w4 i/ m( b8 x+ }7 K
X_train = np.array([[ 1., -1.,  2.],
1 T3 x' R5 n9 P4 I' Q8 s                     [ 2.,  0.,  0.],
! j( L& t# D2 b  x3 G8 t( ~                    [ 0.,  1., -1.]])
1 I; y& Y8 y% Q- J: Umax_abs_scaler = preprocessing.MaxAbsScaler()+ f- t0 Z$ S6 }3 G; Z3 `
X_train_maxabs = max_abs_scaler.fit_transform(X_train)0 q  ?' B  M6 h/ c% Z; c
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])9 d( D1 J- a. D; b
X_test = np.array([[ -3., -1.,  4.]])
" W; ~1 _4 I4 i( a: }X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
7 _  }" N8 c# n3 m/ Qmax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.]). ^  c$ n2 Z6 p2 f2 L' V# N$ p+ \
: g0 W/ d0 W7 H, `$ `6 K

, A% w  N% ?) c( Q: m" R! {
8 Z) n$ Y6 Y& J( J3 }# A! n
- d' x, U* \8 J5 M; M' L/ C5 Q& ?: z; ]7 U6 |9 w

7 m4 i8 e/ g/ p6 y" c  i1 u# W* r: L0 O& S' b
" s5 O6 \$ p2 j* ]/ c& Y% f

' i0 Y' h' h0 j7 E  s0 y4 p6 z* Y
————————————————
* g$ c7 ~& G' z, H% @0 ^$ [版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- W( v9 }7 p$ u4 L" ?3 S( t5 ?/ h
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
( Z* Z  ]  M1 C% Y: w' O" Q9 Q) H4 Q, \
/ i8 L: L0 m# ]8 {6 L( ]





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