QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1994|回复: 0
打印 上一主题 下一主题

[建模教程] 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    跳转到指定楼层
    1#
    发表于 2020-6-3 16:17 |只看该作者 |正序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
    * ?) H9 T) O" Q$ o8 n* f5 }8 ?
    6 Z, ^7 T0 ^. @& Q+ W: A7 Y/ }' j当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    5 k; a5 k# X  H; J2 b" G5 U当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    ' w% p# X1 \$ E, B5 v! Y6 u数据变换的目的:% N% `) C  `. p2 m0 Z% ?
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。  j$ o: B4 n& f, F4 C( s
    8 q4 u5 [" b) s5 ^, g1 J1 G' E/ y
    定义 : 设有n个数据的序列  ,则称映射3 O. \, s! `' w3 P3 J9 Y  ~

    $ Q2 S7 ]" x% d* L# Z: d                                        ; j9 _9 B3 C5 p0 V' m* o

    # B, V2 B6 R- o  @1 a' s5 r- J2 Q          为序列 x到序列 y 的数据变换。 6 r6 P( a9 u, G9 d; G4 B
    , X! X" L! v0 e& D  ?$ n( J2 c
    数据变换的七种常见方式
    6 ?+ c$ @2 k1 F" f+ g此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    $ B5 \3 C' u- w' s- s% W, ]% Q2 e4 M/ y9 g  z
    初值化变换& s9 Q8 b5 b( i! S5 l- Z; a: |

    + T  A5 S  a+ d* r+ K: u3 q0 R! _
    也就是要对每一个数据,都除以第一个数据。3 X* Q/ p4 ]- X$ S
    . Y# W1 J# O. r' A) @! I
    均值化变换
    . }5 q/ g' M9 ?
    $ h# N6 h2 C1 _7 p& x' W1 `$ {- H3 m7 g- Z
                 对每一个数据,都除以均值。0 J6 w, e  W8 `# `# q, i

    ( t2 Z& ]- z5 g2 Q, K百分比变换- G1 h2 U9 n- @+ l1 |! D
    & m1 Z. }+ m7 D7 Q( \
    5 K4 n7 p1 X2 X
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    6 p9 ]% j' H. A2 J; ~( e/ N
    0 `5 A) c6 s; |2 g( H* j6 ]0 g倍数变换: n& D) t  Q6 Q- n$ B9 ]7 y, Y
        % V) x2 ?/ m* Z7 S% i1 \5 f; h' w

    0 W0 w/ p) ~1 x% L1 V& p) a归一化变换
    ) _9 U4 s) l1 J- ^& g' U0 g1 ~

    7 a5 S3 M5 ~( @: y4 m/ m/ V" M7 V% F 其中   为大于零的某个值,称  是归一化变换。 5 E+ |8 g1 i8 H7 y

    . S1 n. G6 C2 ?' w9 Y$ w! `/ F
    极差最大值化变换& {& b. K; ~8 I4 I. `6 ~+ [4 @
    / C2 c; f8 _# |; r9 p' o6 ~
    - g8 \# U7 P7 e- C+ m( x* L
    # _* J! {8 m8 G* H
    5 U- |5 G. g/ U! S0 Z
    区间值化变换1 G9 O! s0 z# ~# Q* _
    * e* l8 X9 y2 Z' \7 o: z

    $ R% i6 `( a) n  m0 i                  ,
    . V0 K$ s9 u' L( c. G# x- C9 N( \
    1. matlab 的mapminmax归一化函数
    4 U1 i, C' o3 T函数用法:
    . |- {9 k0 ]+ v; m [Xn,Xps]=mapminmax(X,min,max)
    3 E5 B! N& u4 R; J( p! b: j4 o& W9 L: i  o; W4 p3 N/ S
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。+ i, Y* `7 B8 {( }/ o2 y: \0 t
    $ E( x1 W3 j: ]) _/ Q+ l9 U1 _
       (2)min,max规定X的归一化范围,根据需要自行设置1 r. M+ N/ G" `0 l' x" ?" D+ m

    1 \( e  B# ]& r0 v% A9 O   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    - i0 r& q: Q* n( j+ K& s
      q, z! |- ]/ i6 m8 U7 W0 ~ 调用方法:- C# c& A4 A& t+ }* E

    " S! H. R% `/ P: e% kX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化7 k2 }3 P3 P/ z- [

    ' Y; y; y, q1 A# w( p0 R/ WX2=mapminmax('reverse',Xn, Xps);%反归一化7 p7 o1 L1 J" Q. `
    1 |! X  `7 |0 v4 Q6 ]& C+ n
    x=[1,-1,2;   2,0,0;   0,1,-1]5 y! w  h% O+ D  a
    [x1,Xps]=mapminmax(x,0,1)
    ; }6 c0 i, b, A  L9 P2 n7 b. ]& g
    , C+ q# g; E0 N+ i' H5 ^# N
    / u9 x/ Z$ j, I1 L. k2 C
    对于python中的axis=0 和axis=1的问题, d1 [. K# k3 o3 {4 {# M$ d( S+ O
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)* J9 g8 M; W8 p; `9 S
    换句话说:1 {" i. b7 N( T! N) u
    $ ]+ }) ~" r% Q3 p0 h; t% F7 x
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    0 ~. g  q( O5 w* t+ T$ M6 V' b使用1值表示沿着每一行或者列标签模向执行对应的方法/ {: o! r* a- x1 o, a
    ; N' I0 Q( G3 b1 i1 q" o: z  u1 ?

    7 _/ g7 ?4 Y% a3 E7 Z0 S* g5 A" A3 O4 s' {
    python的sklearn中 scale函数3 t) e7 d. T# F- t
    1 标准化,均值去除和按方差比例缩放" i1 _& t  n' n. a
                  (Standardization, or mean removal and variance scaling)
    ; z0 @) q6 z  K0 ]0 |+ W% z! a. \; E, L
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。# T& B% |3 ]  U' d! G$ p  ]
    / o/ B0 v7 R( _3 c) ]! s
    from sklearn import preprocessing . d* S' y" a, ~* C
    import numpy as np  % g" x4 \7 W$ _/ x+ {/ ~8 D% v+ y5 u
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  ' K4 x& H; g; @/ O" K
    X_scaled = preprocessing.scale(X) - {& m# E: |- U% m

    4 _2 a6 O1 d: `7 \0 \. R' f#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    ! u- o0 d% ]( ?                                  [ 1.22474487  0.         -0.26726124]
    2 w/ j! s# O* `5 j                                  [-1.22474487  1.22474487 -1.06904497]]/ @: N# k7 I8 U3 x6 b" G
    #scaled之后的数据列为零均值,单位方差
    ( W3 h. ]5 z' b  g' aX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    - Y" S8 g7 h6 `9 e/ K( l( vX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    9 ?( k9 k: R/ E" i
    9 r' `* K+ E/ `) e5 k2 h/ }; o7 J. B/ O! ?0 |6 x

    ( }, M# Y3 Q( t0 `4 P$ G& N& _6 K. qStandardScaler ! @/ y! [9 D) ^, Z& T' L* D
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)$ z# z( f1 `4 C$ T" H# u) _
    9 M, L4 t8 S! _+ v
    from sklearn.preprocessing import StandardScaler
    : _. j6 ]) Z7 e9 Jx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & t/ I$ p6 ?' l; M6 V9 D+ A" G  JX_scaler = StandardScaler()! b! N; t) n0 ^4 q3 d
    X_train = X_scaler.fit_transform(x)
    1 T. V& w$ X, T( m& h/ K0 kX_train! w/ g6 Y5 W  a0 X/ @) \5 r7 E
    #结果如下
    # g" ^! D& V% _9 T0 yarray([[-1.2817325 , -1.34164079],
    - I4 _5 \+ R" s2 T# T0 e! o       [ 1.48440157, -0.4472136 ],) j) W- F7 x9 R$ p2 O+ d
           [-0.35938143,  0.4472136 ],
    * D) q; }2 R4 @3 z8 N5 s& f       [ 0.15671236,  1.34164079]])7 a9 c: s- m/ ]5 b. Y* r8 S
    6 p: u5 L' @) X- M) d+ w

    0 T, q4 x; J  y% p  ?; a! D+ i) j, k7 d8 \! E4 {1 I

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。. s( m  j' s! j3 t' u$ L( m$ p, U5 E
    from sklearn.preprocessing import StandardScaler) z$ d# z1 M% }7 Z! M1 O3 P1 G% u7 `
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]; H$ _8 X4 \# u$ I$ t2 i
    X_scaler = StandardScaler()
    . `( n% F7 Z) S% w5 X1 nX_train = X_scaler.fit_transform(x)5 S* ^7 U9 L$ G& L' K+ A/ Y/ N
    X_train4 e- A& W, o0 N, t/ C
    #结果如下
    2 @6 H& Z$ }$ [2 [0 xarray([[-1.2817325 , -1.34164079],
    3 T; M" N, l, S7 R% b       [ 1.48440157, -0.4472136 ],+ J/ f9 e" s* f# |; m$ y
           [-0.35938143,  0.4472136 ],; o' y" l, }, C0 i2 O
           [ 0.15671236,  1.34164079]])& B. F  ^! |* _# _7 t( s& ~6 }

    6 |! r; e( _' `6 G& ?( cscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    8 S- R/ T# T  ~scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  ! ?+ d* ?5 D$ X
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) ! V% B, g# n1 W* H. ~9 G
    #测试将该scaler用于输入数据,变换之后得到的结果同上
    7 g( C! {  s0 J2 u0 G6 ^- Z4 Tscaler.transform(X) 5 \; V4 a# Y! n# j' k
    #out: / e0 }; ]+ b$ w2 b: G7 r! E
    array([[ 0., -1.22474487,  1.33630621], . i0 h7 L/ t# ?% ]- }
           [ 1.22474487, 0. , -0.26726124], ) x0 j4 G0 b6 e) j
           [-1.22474487,1.22474487, -1.06904497]])  
    , W7 \# p4 a; `( I$ {6 b+ J- ^scaler.transform([[-1., 1., 0.]])  #scale the new data
    $ ]3 Y0 b3 j& N# out: array([[-2.44948974,  1.22474487, -0.26726124]])% k8 F! q9 r  P- X# `

    1 ]( ], z2 n4 l1 H1 \: }5 u0 m' d4 E; ~2 将数据特征缩放至某一范围(scalingfeatures to a range): S4 Y. f8 I3 C' H% `- ^1 ?: k! i

    2 E; S5 d7 ?& C1 R- Z" O
    3 m- c& H6 m1 f  k, T5 O
    2.1 MinMaxScaler (最小最大值标准化)! Z% l  c+ n% a- N; V, B
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    , P6 @. N$ i8 c; v
    % [0 z% B$ t- x% L% E  Jfrom sklearn.preprocessing import MinMaxScaler
    1 W/ B2 V" m8 b( d0 l# Cx=[[10001,2],[16020,4],[12008,6],[13131,8]]* s2 n( @2 q* Z
    min_max_scaler = MinMaxScaler()+ r: H. P/ p9 \: `" M8 j1 A
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,2 e$ J% [, ~& N
    ; `; t6 E, B* g
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    $ z# J& g7 p" J+ s4 d* SX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    6 }' c, ?; h, S1 M& x3 e+ f+ \9 W8 U7 K& C1 c5 X
    MinMaxScaler的实现( d3 o6 ?% g9 h
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)): X4 V/ Q: g8 T; e( U
    X_scaled = X_std / (max - min) + min" V! r$ Q/ x, G+ r+ [
    : u# B  e9 r& Y
    这是 向量化的表达方式,说明X是矩阵,其中
    5 K) ]. ]0 _& T& ?4 G' u
      b& w6 ]- W6 M, MX_std:将X归一化到[0,1]之间# k/ D" ?$ U- O, n1 C9 R& l
    X.min(axis=0)表示列最小值
    ! {% [+ k9 d2 `; j& kmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围* u" g2 r. g* N% I% e9 n+ d0 o

    7 i4 E& T. i* t& e) W1 F8 W
    ) ^4 V/ T3 T" z3 t$ B2.2 MaxAbsScaler(绝对值最大标准化)6 ?8 k0 Q6 f0 ]1 P# Z: ~7 |4 s& Y
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。5 h% C$ H8 d/ }( `
    7 t* i* ~0 D8 Y1 l7 a- Z
    X_train = np.array([[ 1., -1.,  2.],& |, b1 B6 [$ K8 \
                         [ 2.,  0.,  0.],. I+ G6 l! x+ |; E9 y2 Q
                        [ 0.,  1., -1.]])
    " o2 X0 P- i" b, C) y0 R: Kmax_abs_scaler = preprocessing.MaxAbsScaler()* Q( R; H7 O2 W2 U
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)4 u1 K/ j4 W2 y; T$ [( M' {  _6 Y
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])* s5 y6 X) Z  g+ s
    X_test = np.array([[ -3., -1.,  4.]])
    4 ?! h  o) L- X3 }9 {% cX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])- ^! J8 x4 A" ]0 ?
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])- p/ t8 I$ e+ E" ^: n/ C1 O& G; o0 @

    8 F+ E( s: H! Q, m. }- d
    5 ]( b6 \( _. j8 \1 W4 N
    - B# H3 _; y# Q1 V
    5 {& V" U  o2 O3 R1 O; s' r4 Z
    ' N( N& h- q! P3 e- d' I/ D( U2 W3 Q; E+ _& ~

    " K4 ~9 L8 n. I9 G) D
    4 ^/ @) b- Q2 Y3 p" j  o7 i1 {* K5 R$ b9 C5 o1 C
    - O4 ~7 Y2 g) [. H8 Q# E
    ————————————————' Z, F9 s& w" R! k
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & I( J9 {) o* w( L/ z原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223- \8 h5 b7 Z$ X1 }2 f! y- B1 l  v2 Z
    ( Q: p# X3 ?) _, Z% l, E8 s

      l! e; C' t4 {" r7 I4 ]4 ]) X) J, K
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-15 19:01 , Processed in 0.437346 second(s), 51 queries .

    回顶部