QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2017|回复: 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。
    ' V* I4 i8 _* E/ L/ S- f
    # e/ j, z0 q+ t/ m( {' W当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    + M; j: B9 ]4 G当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler& E* A; s) i7 E: E) J
    数据变换的目的:7 n0 c- s- z+ Z7 J& [
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    - Q! N5 q& f  {! r/ f0 l, W1 \& m$ I: Q& ?# d% Y1 ^4 V
    定义 : 设有n个数据的序列  ,则称映射
    0 B( M4 z9 @, t# R6 ]- ~- q! x) R+ l- ~* c. W
                                           
    % A# Y1 t' |& A* r& o. @" q4 ?' Z: ^7 n
              为序列 x到序列 y 的数据变换。
    0 _; X3 o+ Z- A: t
    % q* c; b$ A% T' t, N; W数据变换的七种常见方式
      A* e2 D0 }. D- Q此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。6 q6 ?, x. m. V5 `) O! J

    . w6 M8 {! B$ ?$ x初值化变换+ v' L8 h. R7 e2 q! K0 ~

    & Z" r8 W" l" C3 F: B2 m$ a( ?9 x/ }# L8 _3 f5 y6 W! x& a/ W" _# Q* H, \
    也就是要对每一个数据,都除以第一个数据。
    - `, H& ^9 H% }" x! ]8 Z; l2 q& ^1 c- _8 J4 a0 }! |" v
    均值化变换& L% j% r; A5 ^

    & e# b& Y( ]" G- E! I; A  z$ O" Q, B/ L
                 对每一个数据,都除以均值。( d% _8 N. X' p! e4 _4 e; O) E

    4 c2 p8 }9 j. Q& |百分比变换
    7 n! ]' ~: ~) h. O0 r4 l6 H
    8 J, t: N8 o9 B3 x! z$ S2 t$ l2 H, `$ d% P8 z2 f7 g  d2 R
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。& l# `7 u. R( |4 C$ |, x
    ! k" b4 U- m  x* u* K
    倍数变换$ C# C5 y0 i( ?. c' o
        ' M1 s3 o0 R, F) s# ], r6 V) t

    1 E( v; q! b7 c归一化变换' x0 \: A: R$ S" Z! u4 u: _# m' {: b

    8 F  D5 ~( M6 N* d7 T+ ^- u, \# a2 i7 w
    其中   为大于零的某个值,称  是归一化变换。 1 ^6 B+ M) T/ x8 o" k; @

    $ i5 _6 C4 \4 u$ [* g; b! ~) r' g+ J" o7 E' a6 k  J4 F
    极差最大值化变换) e3 D) f# t1 g2 w/ ~/ I# z
    0 R. p5 n9 m; C, K1 x2 A4 w/ M
    & J) `( p8 _: U3 j
    8 S% s) Q  c$ o) G5 V# c+ W0 N

      j  @! N, ~- L区间值化变换
    / G6 j0 D3 K) A% p6 H
    ' v. ?2 H# f2 @4 v+ w( T3 y% N
    3 s" x) W2 H3 F8 G' |% D7 B                  ,
    1 H( Z( P, t0 Q6 v( g$ n; b; c
    - O. n4 D- n- {! x, J  S# @* K1. matlab 的mapminmax归一化函数
    # e. ?1 j3 \2 z) S- @9 `) `9 W函数用法:
    * D0 |+ Y: N) ] [Xn,Xps]=mapminmax(X,min,max)$ D8 j0 V, k8 U1 T

    ! Y# i4 @, ~; P; X' m# q说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。0 ~0 X  |  h" Y. i
    ; y! |) j9 n, A, u' c
       (2)min,max规定X的归一化范围,根据需要自行设置
    / T% v9 j% I, _" }/ M) Q+ c  E5 ]( I2 ?' }# j$ S: C" r) t6 w
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用       J. B5 w2 S) @' J/ V7 q* l

    . O1 K1 h7 I  s, [# o; A6 N 调用方法:- t& I; C3 w  `. o4 p5 {  w* F- L
    $ O: O( G  e% D( b+ \& ~( C
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    * R  T' }; B' K
    5 X8 t4 m$ z1 ]/ o* N% |X2=mapminmax('reverse',Xn, Xps);%反归一化: k$ i7 v0 H$ N/ ~2 Z$ T
    3 a# ]* k- I# \1 A+ }. w% r' H
    x=[1,-1,2;   2,0,0;   0,1,-1]2 I& h8 [6 ?& z0 _0 ^5 y1 K
    [x1,Xps]=mapminmax(x,0,1)5 }8 ^! x- R* O; v
    & E+ d& e# t3 [" z

    & r- i- V4 a, G1 x* F
    ) i6 [( Z8 V& {. R+ y3 K$ U, Y对于python中的axis=0 和axis=1的问题
    ( w- E7 ]# j. b 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    ; r0 }9 z& U& D, l0 S换句话说:
    & n2 @( J( g* H& \7 ~& Q: l0 t( k/ P, ~
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    / m1 ?) F" Q; E2 @0 L使用1值表示沿着每一行或者列标签模向执行对应的方法2 k8 ?& C% O: n2 ^9 Y; Q& g  m
    & I$ J) Y( B& N. w. [( _. N
    % h; x! n  L  E7 _* ?$ G

    " W: f: G9 L, U, V- epython的sklearn中 scale函数
    6 }2 ~+ T8 i  I; L1 标准化,均值去除和按方差比例缩放' r' O0 V* L: K! k" S! @$ }
                  (Standardization, or mean removal and variance scaling)
    " r- l; J! }3 E
    , V0 j8 S, Y. U) S7 u3 E0 F  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。8 B, a7 C1 ~1 C4 }3 \8 }; p/ ]

    % `7 s' f# g  k9 M0 R6 H8 Jfrom sklearn import preprocessing : Z; y5 G1 h+ p+ i
    import numpy as np  
    ( x0 _- p" d( a- S! HX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    7 w* b. A# x' |) AX_scaled = preprocessing.scale(X) - z: F  o( I7 l  F* m

    + g- n6 k% J' p" I2 ?, {#output :X_scaled = [[ 0.         -1.22474487  1.33630621]- o5 Q9 N7 w8 f" H( h1 _* Y' v
                                     [ 1.22474487  0.         -0.26726124]
    9 `: [3 l, [; s3 I5 f8 @: M                                  [-1.22474487  1.22474487 -1.06904497]]- h! Q8 P6 O' _7 I/ b0 {
    #scaled之后的数据列为零均值,单位方差
    0 \  z8 ]0 u$ y' ^! HX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  8 a4 F6 g+ N. ~2 I& v; |( q. |
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    7 B4 ]+ u/ I8 m9 u8 Z4 M8 H/ ~* j# ]+ |8 ?, b

    " b) g2 J  d1 `, ]4 z2 k! [0 u0 f) E; L8 \, c
    StandardScaler   e" d$ {& m- D6 s) E! t; K$ A
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差); z( c6 Q% C2 q: i, D0 {

    5 H  r: N( Y6 @from sklearn.preprocessing import StandardScaler
    " i  e+ H+ H4 Ox=[[10001,2],[16020,4],[12008,6],[13131,8]]$ A" u9 ]' Q7 ^
    X_scaler = StandardScaler()3 L" B' V7 x% ~7 o, |8 {; ^) J5 G
    X_train = X_scaler.fit_transform(x)
    ; h0 l; z* v* i" H+ J% n  lX_train4 G; ], W  U4 r0 K0 k
    #结果如下8 y! w* b2 O& m) v
    array([[-1.2817325 , -1.34164079],+ ]: g, t( p- H3 F( u) s9 f9 ]4 g
           [ 1.48440157, -0.4472136 ],
      E# j% t6 ^7 L* i2 B$ l0 e9 t1 M       [-0.35938143,  0.4472136 ],
    3 Y+ v" d% N5 E8 n4 D       [ 0.15671236,  1.34164079]])
    7 W# m* A( x) F- O8 I8 Q- h8 e5 Q/ c' I, }9 G- ?

    ! x) O  A+ j  a! K1 s+ F
    ) Z( C; v# j' F, N

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。1 F3 t1 c1 T( x9 m: J
    from sklearn.preprocessing import StandardScaler6 W: _" t6 T1 \& z, o8 X: b- @
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]1 Q- L+ D; v8 A
    X_scaler = StandardScaler()
    ! o1 ^6 M7 E) KX_train = X_scaler.fit_transform(x)
    , N# [$ N+ O, Y( |0 ~X_train
    1 z" ^' M; G1 T3 W#结果如下( M2 X2 d( C5 N. u
    array([[-1.2817325 , -1.34164079],) y8 R+ A3 Z2 P! a8 m
           [ 1.48440157, -0.4472136 ],* P: P/ e# W1 D$ Y" q2 G
           [-0.35938143,  0.4472136 ],
    4 C& p* H. |9 h       [ 0.15671236,  1.34164079]])- [, e. A4 W' b

    # Q- E5 E2 ~6 ]5 `/ @% h' cscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)! l7 o  y9 x0 ~* T" n) \: p/ Z
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  2 A( R+ K+ d3 e
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    2 f. c5 t, e6 l/ l3 p9 g6 e#测试将该scaler用于输入数据,变换之后得到的结果同上
    3 l% f- N7 o0 y& vscaler.transform(X) 2 G, I/ n4 ^4 Q5 e3 K/ ~- M
    #out: 9 P3 {; y( a( h8 [; j8 D( L5 L
    array([[ 0., -1.22474487,  1.33630621],   n7 p  l7 K: r/ I( N
           [ 1.22474487, 0. , -0.26726124],
    . g2 t$ t6 u; A# a  s       [-1.22474487,1.22474487, -1.06904497]])  : M; p& F; _# [+ ~% d
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    % a" p. t7 V' Z4 ?# s6 k' l# out: array([[-2.44948974,  1.22474487, -0.26726124]])
    4 v& j  R4 w5 c' e& {: l2 b& W4 J9 F' g0 J' ]5 u: V: M, k
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    & L% i' x; L8 `' a. Q" F* y! a4 U $ K! U! l% \+ M) Q# K( ?; d
    " ^# G4 j. e. Y3 u" A
    2.1 MinMaxScaler (最小最大值标准化)
    0 T& E/ w$ E5 }& |0 q 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  3 P" z9 o" u3 K/ R
    + k; ~7 F. A* x! A. c
    from sklearn.preprocessing import MinMaxScaler
    & B6 F6 T' t) e9 ax=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & M# l/ a% |9 p- X6 j* P' [min_max_scaler = MinMaxScaler()
    - n: i1 H$ D+ Y& v4 ZX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,4 B0 _5 ?7 K8 E. h6 W, i
    2 i3 h: _; m- o: I, R
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    . g* N  K" d6 n+ U0 x! i3 P2 yX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    4 @5 V; p' k, Z5 I6 `( E  v9 b5 }
    MinMaxScaler的实现+ Q/ \2 x! {9 _1 M
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))3 I9 ]3 T% j, g0 V3 Y
    X_scaled = X_std / (max - min) + min# G3 Z+ Q% S0 {4 l
    - ?# k8 o- p8 M
    这是 向量化的表达方式,说明X是矩阵,其中
    . E3 m7 L" n) ?  s4 {: s1 h$ f, [- P8 n9 `5 k5 s
    X_std:将X归一化到[0,1]之间- f( w. F3 P2 ]6 F3 M
    X.min(axis=0)表示列最小值
    0 |+ m- B  O: |3 a  Gmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围* G% b( j* N& p$ w$ y# z4 a) a
    * y( Z. H0 y" ~$ ~  G& N

    , b( H' _8 q3 @) V- `2.2 MaxAbsScaler(绝对值最大标准化)
    6 R  V0 g% f9 n' S- z         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    7 U0 I) C7 f" z' A* ~! _0 _8 E7 e/ B$ t  n  h3 a7 o1 n
    X_train = np.array([[ 1., -1.,  2.],
    - U; N1 e' A+ H; I5 j! A, S                     [ 2.,  0.,  0.],  @- t7 P" i5 k& f3 n
                        [ 0.,  1., -1.]])5 N/ T5 I9 X5 G3 ~( n. l- j
    max_abs_scaler = preprocessing.MaxAbsScaler()
    ! r8 Q4 ^2 T* [+ a4 NX_train_maxabs = max_abs_scaler.fit_transform(X_train)4 `& H6 L4 K6 F! v$ y
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    " e) b& [  n8 SX_test = np.array([[ -3., -1.,  4.]])
    3 M+ z3 i7 l; ~! K5 G  mX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]]): [+ Z, q' j5 {% P
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])& i' d) H2 F7 l
    7 S2 G* e( k! P, L+ r! ^

    + w5 D5 _  D$ M( i' g& z7 r7 ^' W
    ! D+ O$ u& f0 w0 T$ _- R( X; V4 {" U- I' M
    $ \) w$ a/ f* @" x7 x

    , ?" J5 t# X2 D6 C( H& w( e9 E) V9 Y
    0 _& i6 k# X3 m
    . S9 Q6 V! X# Q9 g( e

    " V! ?2 Z' l3 i; @( W9 k————————————————
    $ Z( }  X7 c% ^+ Y6 A+ j+ ^版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 ^7 Z+ S- l# }2 x/ t
    原文链接:https://blog.csdn.net/qq_29831163/article/details/894202236 D# v! c, G! S" F9 {( ~/ P
    / N8 N. _3 P; p! p5 @( [( U
      `* J4 B0 n7 c  g! c
    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-8-1 07:51 , Processed in 2.111810 second(s), 51 queries .

    回顶部