数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-6-3 16:17
标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
& v1 R- V+ O& y+ n: m5 a1 {, k% z) u) n2 `6 d
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler. ]2 m) j6 t/ L$ F: k9 @8 x
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler1 M* k" {& ]$ J) t4 f- Z: r6 N
数据变换的目的:/ A/ ]$ l7 H, N/ t, b3 \  y
  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。2 B( U$ k# {0 k; }1 P+ b/ R

: d4 h; J* J4 U& d8 g3 z 定义 : 设有n个数据的序列  ,则称映射
8 z( V& h% m' I9 h* a" E
! |) _1 ^3 m7 @( Z8 K. m6 m                                        . G5 M0 l. \! q6 _# G5 y" t* E
3 |8 f8 ]1 b  [4 r) g3 C, _" b7 m
          为序列 x到序列 y 的数据变换。
' [" O' U. f# B# Q, M7 [, G& U1 q4 _: U* o! r) K
数据变换的七种常见方式$ [& s- ~  L) Q  C
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。0 T# b  u- a$ \$ T- D1 B
! F- t  S" m# o- [+ P* D4 p2 Y
初值化变换  a+ _* X$ J$ L0 q2 D% O
& I( @$ P' D7 T5 i! [# y7 ?

. b; n8 \, y7 h4 z$ {) i 也就是要对每一个数据,都除以第一个数据。' @8 V8 J$ q% }2 R# a2 X

* C3 f8 [! z  S1 y( ~& a均值化变换
1 w" V# E7 B5 P% o% s, ^/ c# F2 \% R# K. P" D1 O

) c5 K$ s2 b3 e( @* E$ E( ]             对每一个数据,都除以均值。4 y  Z' o% _' W  Q  |* ]9 M  F
0 k: p' o1 B* b+ G
百分比变换/ _* M# r) ~! p

0 i/ L7 k% @$ Q2 `( c" O8 y6 Q
. S( Z2 _8 y" V6 q5 o5 i分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。$ e8 Z* ~% T0 b5 @" J

' U" q" e2 l5 N. u倍数变换' u) Z* [& G- ?- T& F
   
9 [, ]! z7 q0 P" O- x7 D7 V, D' x' A8 _8 u3 h8 z  N
归一化变换/ S* |- h7 R$ A+ H4 y  q
, }# Y& Q" u: Q1 N+ D( s3 G

4 g+ C7 K! t# Z4 ^  \+ d5 ~: r 其中   为大于零的某个值,称  是归一化变换。
$ T  e0 Y5 h9 w' x+ a) D8 e" q( b9 ?" D  c7 B

. V8 w5 k$ D0 C/ U极差最大值化变换
/ v# c2 G  t$ Y7 L: i; W# H: z! \) ]0 Z* g- |$ @2 m/ j
! E4 o- e# E4 W. `! U6 c) H

4 f# I6 M* j" N5 A2 P% h6 k
# m* r2 N& G" ^$ s  i, ^2 k区间值化变换
" T! p2 t5 l3 j% q/ e$ @$ t( i
/ i' a& W5 _! Q- \  C+ I7 c
- `# ^- {2 u+ y5 I7 J                  ,, E6 I! z4 q7 a3 c& e# j

% O; P+ n2 O# s3 z! `2 z1. matlab 的mapminmax归一化函数
* g9 Q0 _3 i% I' x$ [函数用法:
' ^, \% Z7 J) p) o1 d# f# ]( \7 S: x [Xn,Xps]=mapminmax(X,min,max)
4 g9 o2 g1 f) z1 j1 c. e* _9 T: N$ X6 p& @1 F) ~0 x- c4 \4 g
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。3 r6 S$ T8 F2 @' M* H. g$ w

! T7 h) q$ g3 }9 Q/ q3 P# O   (2)min,max规定X的归一化范围,根据需要自行设置
. Y& C& t( b5 \4 v! ]
8 _$ k/ ~5 S( y  Q! T9 {  q5 Q   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
! {5 n4 E3 k8 C0 A' S+ S0 I( Q6 L8 c
+ {% C  S7 i6 T9 h# T' P  c 调用方法:$ j& o  c' G5 ~1 I
0 x" k2 |5 `. o2 a; N
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化$ g5 j1 `% l% U1 Y
0 W5 k+ o4 u4 n
X2=mapminmax('reverse',Xn, Xps);%反归一化
! m( M+ D' B% o/ p
' o- Y5 B6 _) k* }x=[1,-1,2;   2,0,0;   0,1,-1]
1 `4 ?+ J# Q6 v- ~[x1,Xps]=mapminmax(x,0,1)) ^& F$ v. Y3 x2 b

6 L" r4 @! {5 S$ F: V9 E: G1 J
9 D5 t8 B4 T9 K) `# E% c2 k5 x2 ?8 ]% x4 V: f8 V5 d2 v9 H
对于python中的axis=0 和axis=1的问题1 d: N! w  [: M% o3 u
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
) D: L$ ]" w) {+ C2 V换句话说:
5 P- k" D4 g0 O* e' G. I! ~7 i
% i! p2 L/ k2 S使用0值表示沿着每一列或行标签\索引值向下执行方法
  n/ l& d+ x  j1 h/ d使用1值表示沿着每一行或者列标签模向执行对应的方法
% @  Y- h/ H3 @3 H! @$ ^, L3 f& B( `! S. B/ H! A8 g
5 M, `( g; z8 J- j% w  H$ N

" u0 G1 P4 w* B. \' p5 Qpython的sklearn中 scale函数
, j1 @7 @/ x4 a8 z0 T$ L$ M1 标准化,均值去除和按方差比例缩放
2 V  F5 @0 L1 X3 d              (Standardization, or mean removal and variance scaling)8 W& z: S& N  ?# c
( t% J( b/ x0 y$ r
  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
3 S0 ]4 {6 a8 j5 g' O: ^) d. i. ]6 ^1 s4 |
from sklearn import preprocessing
0 [$ U. r) ~$ x  @/ Y" R9 ^import numpy as np  
5 U9 ]0 R' x6 l$ }# t0 U( ^$ D' |) kX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
( y2 O* o+ |% N1 F  {" h7 E4 \X_scaled = preprocessing.scale(X) + F9 O: c8 Q2 g" {! \, |  p

0 U6 Z- Y' d+ }#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
6 y; @2 f) V0 v                                  [ 1.22474487  0.         -0.26726124]) [5 |) n' i, {+ F5 S0 K
                                 [-1.22474487  1.22474487 -1.06904497]]
- E7 W9 N) b7 k) W( M#scaled之后的数据列为零均值,单位方差
; a$ T2 o5 G' u7 O5 m2 AX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  ( q# g9 J/ _- O* _0 {, g
X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
6 e* r& I, a) @8 p8 R- e
0 i, X- w* R* h4 ?, O% [
* B% M4 m: ~" V/ c$ w. I
8 a9 T5 w7 K. _4 F! J. TStandardScaler % W# e2 F$ m; y6 y! u
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
, b& {6 L6 n5 ?; ^
! R% U' t! C/ M5 vfrom sklearn.preprocessing import StandardScaler
6 U- d/ S/ [! U: rx=[[10001,2],[16020,4],[12008,6],[13131,8]]  x2 V6 M2 w0 m9 N
X_scaler = StandardScaler()# S, Y+ `2 _, |
X_train = X_scaler.fit_transform(x)- g4 k" }1 x( ]4 `" H( x
X_train
/ S4 s; W' E, a& x+ q- y- t#结果如下
) A* e( [  f' \2 f8 a2 uarray([[-1.2817325 , -1.34164079],
9 \8 s$ W) f/ w" L2 w7 y' J7 Z$ d$ n       [ 1.48440157, -0.4472136 ],* V; h6 {! @; `7 M0 N- p6 V
       [-0.35938143,  0.4472136 ],  B& d* x" h9 t$ W& l2 r
       [ 0.15671236,  1.34164079]])) S2 Z( H! {! [4 y
$ D: T* F$ A2 w+ b$ t) _* t$ q

4 J1 u$ t2 t2 x/ e4 p( O$ d, p/ A  ?8 A$ e8 _, n2 \% x: S7 c% o. M& c

注 :

from sklearn.preprocessing import StandardScaler$ \$ l. N' s* j8 P6 W7 K8 y
x=[[10001,2],[16020,4],[12008,6],[13131,8]]6 V4 _  w6 p) D
X_scaler = StandardScaler()
/ S) U7 b& U2 s, s' vX_train = X_scaler.fit_transform(x)
% _% Y* N5 \+ P/ q6 YX_train' L/ j7 T7 f8 A  `6 {
#结果如下5 G1 M9 ]5 A1 ^' u% ]
array([[-1.2817325 , -1.34164079],
* s8 I0 X* O8 J& w; [       [ 1.48440157, -0.4472136 ],
# K' l0 F/ B8 k  r) k% E- p       [-0.35938143,  0.4472136 ],. n+ }5 g% W' Y
       [ 0.15671236,  1.34164079]])/ N! g- {6 X& s3 Q! ~

9 P7 }& i/ v, R& z2 Bscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)% C# p0 C+ r* N* w
scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
7 M; T# _* ]. Y# j- j6 y+ ^scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
' O4 Y# u( W* `5 W2 I& x; }  {#测试将该scaler用于输入数据,变换之后得到的结果同上4 O& P  r  a4 Q- R+ K8 Y
scaler.transform(X) 5 |: e; f! i" d9 Z4 Y! J7 t! |
#out:
) i( N; E9 e1 Z- c* \- y# iarray([[ 0., -1.22474487,  1.33630621], , L0 g, c$ U( e# R* O8 A
       [ 1.22474487, 0. , -0.26726124],
" x  V! y7 n: W: `. L% X       [-1.22474487,1.22474487, -1.06904497]])  2 ^& B( Y0 S) [, u. x3 e. Q. H  P. g& D
scaler.transform([[-1., 1., 0.]])  #scale the new data* |7 p6 m4 ?: _8 V  _( a
# out: array([[-2.44948974,  1.22474487, -0.26726124]])
' I5 J* M4 ]/ i9 ]* g$ S% Y
1 ]; b' h' e6 I" S" x% L  ^2 将数据特征缩放至某一范围(scalingfeatures to a range)7 b& j/ t* M. p0 s7 s* z

* F$ q1 ?( e/ m: d

$ ^) P3 P& v6 s  e/ G2.1 MinMaxScaler (最小最大值标准化)
" E  j0 W9 Q0 C6 ]" C 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
) ]8 i$ U: |6 s) f4 t6 v1 D7 m" M. [
from sklearn.preprocessing import MinMaxScaler& |4 n$ z9 V3 V% ]
x=[[10001,2],[16020,4],[12008,6],[13131,8]]% o0 D2 h5 r6 N4 _3 u8 h7 M" Y
min_max_scaler = MinMaxScaler()
1 o( }: U& E% }3 n) x' J2 \) bX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
. y% D( \) J( n- ]3 y. _5 P7 q# [) _
min_max_scaler = MinMaxScaler(feature_range=(-1,1))+ o4 k' L# @7 m! Y5 y
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
2 S9 t0 F* S& ^. [. {
! Z6 R/ \2 |7 m' k" o* ~3 {3 M2 P0 o5 DMinMaxScaler的实现
- o# p3 c# V  v: j: vX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))+ m% k1 u0 r% a) t* B( d
X_scaled = X_std / (max - min) + min4 ~0 Y7 Y7 e4 \) ^" O

( G3 W1 ^, h3 B0 F% D这是 向量化的表达方式,说明X是矩阵,其中
% o# w/ q# v+ W! i! T, U/ m2 {( E/ ^3 U" b! Z
X_std:将X归一化到[0,1]之间
( N0 [6 i8 I+ l4 rX.min(axis=0)表示列最小值
$ {, m( a- l$ e6 Q& g$ ?2 }max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围2 O+ y: {9 m. }9 W+ S4 q. x9 `6 o

0 e$ \' Z9 Q% M* E) ~) ]
; _/ U- W0 [% T* b; \' f2.2 MaxAbsScaler(绝对值最大标准化)
/ C  t: t0 B& X  ^% U3 T         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。9 M( _4 o9 e# S! P
9 I: @: l- Y! w; T; L
X_train = np.array([[ 1., -1.,  2.],+ s5 ^& X7 h7 z9 R) [5 p/ A( f
                     [ 2.,  0.,  0.],
8 o  x. D6 x, {1 ^7 h3 P: j' |( J                    [ 0.,  1., -1.]])
" A" k) v+ l5 W0 b! Umax_abs_scaler = preprocessing.MaxAbsScaler()) S( m- i' K+ o0 `
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
) ?! w! A+ g' b: j5 W, C# T/ j* v# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
+ L2 ^% f4 i' f$ k- K" nX_test = np.array([[ -3., -1.,  4.]])
4 v4 K; ^/ Z7 V. O1 J! o% E# }X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])+ P: K% ^: R1 n1 [
max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])8 A$ m. y# O) `8 n( @  o6 H/ v5 Z

- z; s( @* L8 \7 X- d7 _6 N; ]0 W" V$ }1 r

8 |6 Q2 V" ^+ u1 x( e
/ F4 ]& S& F+ t2 r6 O4 H3 T4 @" t& S4 a" o

# q+ }5 s" Q# K% B1 \+ p( i0 k

2 G4 _( q$ X# c$ @2 Q4 N! y+ |: k/ S& Q
0 B" }% V9 L3 O. Z) B
9 F: A$ m; M* |————————————————5 B3 e9 J" `( ?' I, e! ]
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# t) j& Q3 i( d. J" z" ~
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223$ }! m$ u, o- s' B% {& R: \

% o6 L, d0 j. D% f/ a9 F% k; D
; G" e' s$ ?( K* G& U7 e2 _




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