QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2038|回复: 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。
    ( K6 M4 X. H; Y4 M8 H8 K3 e. o( B( g1 [
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    8 d- S! ?8 `9 G  _: p4 B当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    * V% J$ w6 m  C. d数据变换的目的:
    7 ]8 u1 i% E- o9 t. k6 S, d  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    4 f7 t. W! I: y
    0 s6 j% O) _; f/ X; k) N# Y+ W 定义 : 设有n个数据的序列  ,则称映射' k: D* h8 F1 l/ c% i  d

    5 ]  v8 @& T7 J, x, N2 ?; p                                        8 |' y) }, ]/ L  r* I; j
    & e" n) I. ^5 o9 P$ L' W! \& d3 I
              为序列 x到序列 y 的数据变换。 ' ]  i& D: c0 |: z0 r  {

    ( X0 ]9 \/ S' x* K6 i数据变换的七种常见方式
    ( p- J" z* d3 A' e4 m2 q8 L此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。* }7 _6 l: f& v2 i& Z- C1 w% X
    ' R# s8 w2 r; I
    初值化变换, z6 o3 L% [5 }3 y$ P% J1 s" T

    7 p, L! b  A5 C, ^0 T: I: F0 l7 i
    ' |1 n- W* W0 g, j 也就是要对每一个数据,都除以第一个数据。8 F  s# i* f, t7 ?4 U% `5 o

    0 u6 D0 Y8 a# f, I均值化变换. v% V4 g( J% S0 o

    ( q2 y, L* a' ?
    . _$ k; Y) f# W4 @4 P             对每一个数据,都除以均值。5 a: n/ f# e: b* [

    ) k2 x9 i& K+ F9 ]5 t1 H0 B) ^百分比变换# I. U9 c* L5 z7 ?

    ' K  S8 b+ T' Y4 k3 Y
    ! Z$ d" v2 D1 E9 g分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。- z+ o5 d3 W9 _; n

    - z! u; ^2 O! v4 m" @& X倍数变换, a" d2 v8 T( [/ k4 v/ s: U
        , f* V- Z% U! j5 H% `2 f. x+ q
    $ o% {1 z: O+ G) S0 t' N
    归一化变换
    - T7 u1 p4 E! h4 Z
    % f) {3 I4 ~: Q1 l/ R
    . P% @! m; ?# b, }' ] 其中   为大于零的某个值,称  是归一化变换。 4 Y( B  \" O. F8 Z( c5 D
    " N2 g0 T* h% d: B6 Y

    ' t, w' r' K/ e0 `% P极差最大值化变换8 h8 }  `' M) ?0 [- v

    : d) x% Y8 ~- A5 }3 ^# |* _
    : E: ]! U/ p0 A2 x9 o2 p. y9 o3 F' B: y
    . K) T' y* L' c) q  Q
    区间值化变换2 v2 Y6 G1 I7 ^$ b$ A
    8 `7 [/ \. f1 H
    ! V( [. b# n' k1 N) S, N8 T8 c( ]0 s
                      ,
    7 K  \0 q9 |. k9 N& j& }0 V; g8 E2 _/ |( z( G& p
    1. matlab 的mapminmax归一化函数8 \+ b/ }4 N4 {2 d
    函数用法:/ O* I# o7 P( f4 R6 a2 ~! S
    [Xn,Xps]=mapminmax(X,min,max)
    : y$ s. x$ u& s# c" N
    0 r+ V  b3 ~0 m说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    6 F6 ]# y  y6 [4 V4 q) N0 a* Z. P# |2 U1 ?4 n
       (2)min,max规定X的归一化范围,根据需要自行设置
    5 N  E& @8 a( v' b, `. w* N( q9 R: }9 g0 L& `9 k4 ^
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    4 P3 `) |/ J2 G$ R; z" z; @7 M+ J* v/ p4 h" \6 J+ a, G, [6 r0 E+ J1 a
     调用方法:9 @  N* ]- V. C. |2 I1 ^

    5 m0 i" f# y; L. b! HX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化( C$ Q  j6 g- y8 `; W

    3 b7 y! B( k9 D  o, V9 DX2=mapminmax('reverse',Xn, Xps);%反归一化* R! [, p  x4 i. x4 Z4 B
    # J/ a7 Y' G/ P. |: T1 F- W- z
    x=[1,-1,2;   2,0,0;   0,1,-1]
    ( |' o, a. x9 Y/ N[x1,Xps]=mapminmax(x,0,1)
    . ]6 X+ M1 `% T/ G% S
    - L5 l" _, o* p% A7 w% F6 o
    . I, O8 }* b0 `' @0 o
    ' v6 q8 F$ w% J& K0 Z0 r对于python中的axis=0 和axis=1的问题
    4 e0 T( u& z& a" c2 A/ S 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注); n2 n8 i  G+ v8 R& v- }1 O6 O; C+ M, f
    换句话说:2 I. L0 Z+ U0 I3 p' g! w' S

    % ?, f+ E" _5 R$ w% x% H4 M" L使用0值表示沿着每一列或行标签\索引值向下执行方法  T/ z  I. l! A# ?% o
    使用1值表示沿着每一行或者列标签模向执行对应的方法
    . M- l( e- R- E+ m) G/ H5 F% {$ s6 h6 S' `
    6 M* v8 |# r. `  R6 w

    6 F! y) N+ A  a1 U2 t9 Mpython的sklearn中 scale函数  g& D: k/ X7 z8 W% P8 d
    1 标准化,均值去除和按方差比例缩放
    . ?3 X& U: T2 ^8 U" G              (Standardization, or mean removal and variance scaling)
    4 I9 }3 u: L  e
    1 C9 T$ Q1 K, ]' f: _  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。5 y3 `5 W; c( N" ~$ i- F2 W) T

    9 Q8 c; c3 J8 Yfrom sklearn import preprocessing 0 x2 k* v: y+ H1 k( o( s
    import numpy as np  
      x0 X  G6 \5 X/ L( i& u6 U, uX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    . b, w; A, u/ J0 SX_scaled = preprocessing.scale(X)
    8 u: A! q2 N* G; s
    . O  B6 ^- K5 E. L#output :X_scaled = [[ 0.         -1.22474487  1.33630621]) m  E) R, Y- B
                                     [ 1.22474487  0.         -0.26726124]2 Y. ^7 C  c& f$ x% C- m4 i
                                     [-1.22474487  1.22474487 -1.06904497]]
    - e# u+ S3 V# R* L, E! @/ N* ?#scaled之后的数据列为零均值,单位方差
    + I3 Z4 `, S9 |( h  QX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    0 }6 `9 e: K. H- W3 F( RX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])% b0 u2 A/ q6 q1 i0 l

    $ X* @* k9 m, {; x  _
    2 R% w& L, ^- v$ p. h5 N' l" Q# D
    StandardScaler
    6 D) x2 `, r/ N3 u, n8 [Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)4 E# L+ W' }. ?0 w$ Z. L

    8 c+ I% [" R' }7 S; `! U! S  ~from sklearn.preprocessing import StandardScaler- `% H  }, r( y8 F4 a( u
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    8 Y/ E- O. a+ Q  H7 w# x+ D/ r4 b1 BX_scaler = StandardScaler()
    : W$ L4 D. d) J* vX_train = X_scaler.fit_transform(x)* E! D& A( }4 i* j7 ?* T! A! K
    X_train
    ; H% X$ x$ n1 M/ l* B- @, k( d#结果如下
    , T0 p! a( t# N% ]  Xarray([[-1.2817325 , -1.34164079],
    " G( l; I1 d+ y% v       [ 1.48440157, -0.4472136 ],! V0 _& n! |3 u: a3 A% Y% k
           [-0.35938143,  0.4472136 ],: Z; r' M+ T, j( r( o, R
           [ 0.15671236,  1.34164079]])% u" m8 v* ]0 G3 y( Q7 C8 X% B

    ! U8 e  m5 L( [2 _: S
    / ^5 n0 k' ^; I' v8 _  j- ?2 B+ u! h: P3 J& f, I7 h4 I

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。0 N/ S& A$ Y  w# k! B
    from sklearn.preprocessing import StandardScaler$ T% D! c, z; ]0 O2 a
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    : C' H5 M* l: n: KX_scaler = StandardScaler()
    ' {- W3 x0 r9 e6 UX_train = X_scaler.fit_transform(x)+ q. M4 |5 L/ X+ \
    X_train
    & H: r+ m4 _/ I2 I' u' H, C( Z#结果如下
    , X) W+ Q8 w6 b- n$ oarray([[-1.2817325 , -1.34164079],
    8 x' b  l  |, d5 p       [ 1.48440157, -0.4472136 ],
    + V1 t: T0 ~0 p1 [       [-0.35938143,  0.4472136 ],
    ' p" |2 y# t7 j  M7 E       [ 0.15671236,  1.34164079]])
    : u# T; ?, E2 h1 U/ c5 ^1 g; i8 t) d9 l- A6 R& r" z0 J
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)4 g9 U! Q- @6 ^  ]% w- ^$ Z: V3 A
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  $ y' h4 W, A) S! \
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) # S8 l+ _$ ^  [8 ~2 v
    #测试将该scaler用于输入数据,变换之后得到的结果同上1 Q9 Z) R) P5 Q# X
    scaler.transform(X) , L7 n) v5 {, o. B
    #out: 1 e: o& K. f$ J/ m) w
    array([[ 0., -1.22474487,  1.33630621],
    5 _- o7 R3 O- \; _" }) }       [ 1.22474487, 0. , -0.26726124], + s- s" d0 t: O: o# J( l
           [-1.22474487,1.22474487, -1.06904497]])  
    # u$ G& }+ q" E# ], yscaler.transform([[-1., 1., 0.]])  #scale the new data. G2 o3 R6 i9 A0 [) p  A
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])( m# h8 b3 P! h7 M
    , K+ r1 \& L4 y2 d3 ?4 \1 m+ _7 ]
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    2 F- a( K, U& C3 j3 l9 s
    / \) M& q; C0 d3 Q" U! U$ d

    6 }; q: d$ p& h2 ]5 w2.1 MinMaxScaler (最小最大值标准化)
    / F) a+ K# D+ I; M3 H1 f 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    , D5 R7 a1 h! s  P0 b
    , l0 c% U7 v$ _+ y  w3 ofrom sklearn.preprocessing import MinMaxScaler: d2 w3 H: b9 D
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]8 r8 m' ], d- a& ~3 l
    min_max_scaler = MinMaxScaler()
    2 h5 h/ ], g5 E+ d* U) [* ?; mX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,- b6 i1 ?  M+ X3 @  N
    / o6 s7 c9 \, ^5 N* ?6 c
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))  N0 K( V+ j+ N8 b
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    / \; c$ m7 C  X# ~
    ) z8 R' X, e6 E4 l& r5 U, IMinMaxScaler的实现
    7 @1 M1 a2 W( s. c6 u" C6 d1 hX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    ; ]- C$ O  a' _9 M8 a5 V% ?X_scaled = X_std / (max - min) + min
    ( ?' y) ^! @' e6 o$ m
    3 \& |6 j1 p, v' ]" D这是 向量化的表达方式,说明X是矩阵,其中
    4 O" O3 F8 \" F& @( r' K: k6 h
    + y" N' o4 W& U& YX_std:将X归一化到[0,1]之间) `* `5 a, Y6 O8 j
    X.min(axis=0)表示列最小值
    - m! t2 B% ?; D( P  _' Nmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围) {$ n- ]1 z2 V+ _, U
    : R6 z4 j; }; n1 k: [3 i

    7 B" }4 B& D5 B" v2.2 MaxAbsScaler(绝对值最大标准化), U& X" o9 M4 W( A% ~# p$ o
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    * k2 L$ V6 b$ m# b
    4 V& J) d- V# \$ w3 ]6 P6 KX_train = np.array([[ 1., -1.,  2.],# a( o$ U3 L% M2 f" X
                         [ 2.,  0.,  0.],* F& ?1 u. b$ S2 q  ~1 q+ m
                        [ 0.,  1., -1.]])+ s& x1 [6 y- U  K( Z% O6 o7 c
    max_abs_scaler = preprocessing.MaxAbsScaler()$ V8 G& x2 G2 s/ ~6 G
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
      h" j' k! |& V: Z1 A4 E# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
      ?. B5 G% O5 W& J0 }) Q9 _' TX_test = np.array([[ -3., -1.,  4.]])
    1 V( S/ u% N6 {% E9 NX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    + t* S2 |1 l1 Mmax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])3 m; A1 N$ v7 e& _  }
    0 n  ^. P# J& q) H" R" L

    , F% `: S9 H1 q/ ^2 k7 W8 O" L( t) \- K  v* ?! u1 u/ C$ S
    8 L/ z. `: w- b0 @

    $ q; ]5 L0 O& A! c* D" E: P3 Z# L3 }- e: U* l; Q. }; h
    . \) i6 r9 f% d* E4 \6 u
    + l/ `/ d3 a- S& s; {- x
    ) H4 g2 Q1 }8 s( N/ l& u1 k" @

    % {( }' ?( t2 c6 b0 M( Q* t' d————————————————
    . d: q( l1 o/ s, X0 b, z4 t+ P版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# s6 x0 F* G$ {7 B& c8 l3 O
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    7 V% I" A1 y0 L
    ( S: K) k: u5 g5 C* t! M( V6 s6 M* h. I1 |4 j
    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-9-12 23:35 , Processed in 0.563487 second(s), 51 queries .

    回顶部