QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1960|回复: 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。, q; I( K! e+ x' g9 c
    1 r' K9 j. f9 P! k/ ?* _- F
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    8 ^6 n6 k- B8 y6 e# `当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler% P9 S3 P- B7 b% ^6 p, [  m
    数据变换的目的:6 x5 |  Y8 S8 m6 Z
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。8 {+ X9 @5 t9 R

    4 x/ t- L( T- q+ W 定义 : 设有n个数据的序列  ,则称映射
    ' I/ c! R% L4 z' l3 E! L$ {. i0 N1 M8 L7 _0 {: f7 ]3 v: c6 N
                                           
    4 F5 K' Z" S* S5 V0 m) E
    ; _* v) C# U8 L, L          为序列 x到序列 y 的数据变换。
    & e$ r  A5 H* r, F( L4 p4 |
    2 k$ {; u) _" @  S数据变换的七种常见方式
    ! `+ V6 N% C5 Q此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    2 V/ l) _6 \8 F5 m, |; G. f# z( R# P! e6 s3 a) J% e" a
    初值化变换
    2 u/ b/ c3 Y, L* _
    ! F$ N1 ~6 T# `- M( [. ]+ t& e5 v" U6 k) r) x
    也就是要对每一个数据,都除以第一个数据。
    ( m: ]: M, F: Q/ o. Y% a! S# S2 F3 x8 B1 m( Q+ |1 X  w, L- X6 s/ P
    均值化变换
    4 w. G* \0 E* }0 j( h5 \# w3 e2 b- r: z5 x/ _  B

    $ ~" f& b+ j: j- b  |$ E             对每一个数据,都除以均值。
    9 `" R. v: Y6 f# l* t( k/ B
    ' i! l# x7 r- G百分比变换6 O0 y3 _5 x/ x, @/ i& Z

    4 L; Y9 x: J' [; M1 x% k% I4 ]
    4 Y4 f- P' N$ e( N( ]1 t9 [& p分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    ) k6 j. F9 ~, Z/ A- }
    ; L0 j3 p; R. U  h倍数变换
    . v* c* a' G% k6 W) V8 J   
    3 U) E/ b  N5 M
    4 T" x' e$ a! ~, |9 I' T归一化变换, h1 C. V% s8 f! W( w7 ?5 ?

    + _* w% @  M8 \5 v
    - \# S% y0 u% u, e 其中   为大于零的某个值,称  是归一化变换。
    : q4 |" K5 q% S! p1 W9 K( K/ U! ?, r! L
    / G  @# M* y/ f  m3 T
    极差最大值化变换, P* |5 g, _) a6 H$ ]( e4 c4 _" p. V

    . ]2 v( \* a& c' N5 B! W' Z/ R- h1 ]& J
    ( ]  ^6 {2 Q' Y: K# p4 ~( d

    ) l( H; O8 l1 i区间值化变换" ]3 t+ u0 U3 a, w
    2 k) i4 k' z$ d9 A8 K3 V

    . K3 S7 O# |* _1 ]% n                  ,! M# t1 [4 ?# r( q" ]/ n# u0 Y

    0 n" t, y$ k1 D1 f4 `4 \! B8 B1. matlab 的mapminmax归一化函数+ v$ n" b" ?# d  v. B
    函数用法:
    + Z/ \# L  u0 `+ t* X [Xn,Xps]=mapminmax(X,min,max)
    9 {+ r7 Z2 o( z3 Q
    4 ^$ U2 P" [/ H) L$ P% [6 ^/ ^说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。4 v( i( `$ d$ O" |* Y

    " N" z+ i1 j* M+ j   (2)min,max规定X的归一化范围,根据需要自行设置' l; q' V4 V& }) h0 E
    7 o& D5 t) C7 s" l
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    3 n9 A$ n: A# Y9 v0 X
      v4 j" b. q5 R9 K4 t7 F( b 调用方法:& }3 R$ k# v5 e' k' }6 K( X( R' U
    5 _  @# L( p! @" I) B
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    % C, c4 Q3 B4 w2 A, |1 Q: b' Z( U+ m
    X2=mapminmax('reverse',Xn, Xps);%反归一化- J: j) |0 x: i9 W

    " q8 ^- q5 p$ Q# e/ Sx=[1,-1,2;   2,0,0;   0,1,-1]
    ! P& U$ W+ s1 u) ][x1,Xps]=mapminmax(x,0,1)2 M5 x* }( H3 @2 j

    7 `0 k0 h5 D6 s/ R+ |9 Y
    , y1 [" E! p$ ^8 D# e# M
    8 X) C; m7 }7 l' @对于python中的axis=0 和axis=1的问题& [  f% H1 P- \: E
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    . B+ q: Z, U% ~; c* o换句话说:
    7 A  j1 D/ `3 D, m
    ) W' c1 [9 v  P使用0值表示沿着每一列或行标签\索引值向下执行方法
    5 o2 I& s8 d# b* ~- Z  R2 z3 A使用1值表示沿着每一行或者列标签模向执行对应的方法
    . l. y6 e8 `. x/ x
    3 U! P4 V% G8 {
    % I8 L1 J- K7 F/ e8 h
    ; J3 f( \0 ~6 |8 Rpython的sklearn中 scale函数
    + Q( V% q5 D; }7 }, C1 标准化,均值去除和按方差比例缩放
    ' p0 n# O/ T  ?) G1 Y              (Standardization, or mean removal and variance scaling)
      q+ g) B4 f! G/ v# {' u
    / q; `6 c; P0 s# y7 e  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。8 {  a( H7 B! L4 A" L6 E/ A$ K1 E

    : U) k9 @6 ?$ G. c6 h8 g! hfrom sklearn import preprocessing 7 U# }7 l- r/ A1 X% g
    import numpy as np  
    9 `4 y8 n3 {. N; VX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    : c. t. W8 N/ y: z! p0 W5 TX_scaled = preprocessing.scale(X) & o& f3 H0 M3 |. b5 P
      ]* t% E$ A! u' e( x% ?
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    , k  C/ e& m3 g) w; o3 b% i                                  [ 1.22474487  0.         -0.26726124]
    1 U0 f: V# x' `* q$ O) S                                  [-1.22474487  1.22474487 -1.06904497]]9 P- D2 ?* Y7 s3 m2 @% F& c) |
    #scaled之后的数据列为零均值,单位方差" a4 ^! G/ f% n$ m+ n, B
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    : N8 V6 T- Q# r7 ]! X# eX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    1 Z/ o6 s& N' o  U1 j' G. C* _: D, J5 V, G% Y
    9 I# }* j1 o% S0 Q3 g3 Y
    4 V0 l$ i. E  B( z6 W6 t& p
    StandardScaler ( r4 [- V' v- {( g8 X
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)2 ?# {5 j& ~  R% S
    $ d( P% q3 _* ^7 i  v% l  R7 y
    from sklearn.preprocessing import StandardScaler
    6 \1 o" l; j( zx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & y+ A! y, V) }! F/ `X_scaler = StandardScaler()" y% x) u6 o% @" g/ O! x
    X_train = X_scaler.fit_transform(x): L' P: l: l& M4 d2 y" \
    X_train6 T% S+ u! B4 o# C0 ^' m
    #结果如下
    $ g& R- e4 N, m. F/ barray([[-1.2817325 , -1.34164079],9 T+ H8 q- e  `0 }" C% g
           [ 1.48440157, -0.4472136 ],  ]) I$ ]$ O- o' P
           [-0.35938143,  0.4472136 ],) \9 S. z$ Y$ W+ m. e
           [ 0.15671236,  1.34164079]])) t7 Y+ ?0 ?- Y6 E( k/ g
    6 B8 _( ^! c/ R# e5 _

    ) q2 U6 q  j* j# k+ ?* f# ]4 y( c4 e) [4 T' v$ j+ @

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。# R( m/ I5 L; c; s
    from sklearn.preprocessing import StandardScaler
    . U4 `" K# Y( N4 Q5 @x=[[10001,2],[16020,4],[12008,6],[13131,8]]8 |' o! }6 U; r% V
    X_scaler = StandardScaler()
    - l7 y9 D$ l  n4 T5 NX_train = X_scaler.fit_transform(x)
    # r8 t$ c3 y; W7 V; t1 A8 L* e. DX_train
    * K: c) ]9 ]# m. [8 }5 Q+ e  }#结果如下
    - \( X( J1 k  H2 D+ Jarray([[-1.2817325 , -1.34164079],! n5 J5 t& r& l! E1 |0 q
           [ 1.48440157, -0.4472136 ],, h6 ~4 u+ N: f' B
           [-0.35938143,  0.4472136 ],
    ! A+ ]( }; H) |2 R( k  v" a       [ 0.15671236,  1.34164079]])
    ; Z1 {1 X# @' C8 V' f
    # ?4 c  d- x% D+ Cscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    8 O- A2 t: y# e9 _' m, Ascaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  2 {6 w0 _1 x/ z4 b- ^4 j8 C
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    + T, _$ m5 k) f  {$ q* M: o& ^#测试将该scaler用于输入数据,变换之后得到的结果同上
    4 K' x+ c+ @# V9 e' P) B" gscaler.transform(X) % \6 W5 L) E; F' x: w4 j, u
    #out:
      a  D9 z' s/ h; ]- U/ u6 C: larray([[ 0., -1.22474487,  1.33630621], - X6 d) `& T! q6 h* t
           [ 1.22474487, 0. , -0.26726124], 6 b( s! G! o! r
           [-1.22474487,1.22474487, -1.06904497]])  
    / a) ]( J$ [+ x! m6 H$ Tscaler.transform([[-1., 1., 0.]])  #scale the new data5 F' i: S# C1 q1 |$ L$ ~3 R
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])- q2 P& }" f$ p: g$ N3 _

    / ?, I/ ^2 M  t0 P2 将数据特征缩放至某一范围(scalingfeatures to a range)
    " @# L( J$ i0 V, W + a- H$ a! s. {3 V

    " g. e9 Y$ K5 m) N! A# ]2.1 MinMaxScaler (最小最大值标准化)5 ], l) K/ L# {& B
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  % j5 q2 ]/ L* M2 }3 Y
    9 v$ X( ?8 a3 T: z* j" T1 h7 a0 `
    from sklearn.preprocessing import MinMaxScaler
    5 I9 A+ g1 h! V: h$ b9 I3 N3 Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & E: A6 C5 u- |% Y2 D6 T3 m5 g% [  F2 Ymin_max_scaler = MinMaxScaler()7 E4 p' A0 W9 v" x6 b
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    9 c% L2 t/ o: U$ a/ f# D
    5 L5 ^4 Q; M) k# v, x& [min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    3 ]8 r  k0 O- s0 S9 U/ TX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果" M4 k) m: Q8 _* Y3 J
    3 m  ]6 E; S' d
    MinMaxScaler的实现
    2 U4 a' [# b7 d% xX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    9 ?; ]+ p; E" c' J9 B. \4 H/ ?X_scaled = X_std / (max - min) + min
    $ q, h& Z* a8 R: f$ g6 H
      U: v2 \) i6 s! g这是 向量化的表达方式,说明X是矩阵,其中  ~, d$ x; u" _$ {' g/ ]

    , X* L6 C* [" X+ E" p' i6 ^7 O( BX_std:将X归一化到[0,1]之间
    % P- X& s" e; @, s) z8 V" YX.min(axis=0)表示列最小值- \4 ~% A/ s. `% |) n
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    ) I1 q* n% s) H/ l8 D: V8 `4 u8 w& v# {) c7 \, B5 c4 W" v
    1 U. @. ^! _/ j$ ~; a4 s( j
    2.2 MaxAbsScaler(绝对值最大标准化)5 L2 o0 X0 J. y( a
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。" J: T9 P7 }( p6 |
    ( u* O9 [+ B$ d% G" Q4 O
    X_train = np.array([[ 1., -1.,  2.],% y1 z& i+ d/ X: j( U
                         [ 2.,  0.,  0.],
    8 y# ]  Q( M$ M                    [ 0.,  1., -1.]]), T1 g; i; J' a# C
    max_abs_scaler = preprocessing.MaxAbsScaler(). U- `6 z, S# m2 c4 o- _6 d1 s
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
      u3 e7 G" ~4 X& [, L# t% P# U# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]]); m/ f$ R  M$ X
    X_test = np.array([[ -3., -1.,  4.]])
    7 E8 g6 A" @7 Y. T2 M2 |X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    " B. R7 W( G: Zmax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    ; V$ L( ^' f' |; ]# D2 R- t3 w+ q1 u3 P: G% L& R
    * [% M; \" h6 r2 {- S

    ! D* P  P9 |# S1 g  b
      @7 O- P5 Y( Z& f9 Q5 g( Y8 T5 |. U; J' g/ q4 J
    + |0 U* t% a) x$ @% Y% a

    , R+ j) ]. x; I9 J: D" f
    : _" u; @: ?. {  i7 E' c7 G5 [! X& Y  A  X

    " ~8 i! r' ^! L. b* e, R————————————————
    & l) i  O5 ]* F& N6 N* J) ]4 F' F+ A版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. u$ S* i5 N2 |( m+ R! M
    原文链接:https://blog.csdn.net/qq_29831163/article/details/894202237 S+ t4 d8 }* H( u- Z# {3 Q
    , F$ h/ f2 R5 x0 S" K  q8 k
    2 |) g( o# T! @
    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-4-13 12:07 , Processed in 0.316200 second(s), 50 queries .

    回顶部