QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2015|回复: 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。
    ! W1 o3 ^8 p2 s$ ^1 f
    4 B& D) R& [: V1 x" h当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    3 Y0 m% h. l* @7 J3 w7 d当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    9 j- v* ~0 r; i9 U) K6 F  t. o6 ]$ ~数据变换的目的:0 ~( u5 J2 q5 a' ]. D
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    ' w8 f, l: B' F+ ~+ H; L' c6 B0 P6 K. u
    定义 : 设有n个数据的序列  ,则称映射  z9 d- q* @2 f: l, c7 ?' [

    / Z# }# ^0 I7 [. d+ l                                          \& u1 a# p# P: `1 z( Q
    : O" n7 g. |4 i& s4 s8 W2 ^; Q
              为序列 x到序列 y 的数据变换。 ; ^; \: H) a( H) ?5 Y

    ' k! t3 I7 \5 ]) ~& a% R  _7 |, f数据变换的七种常见方式
    5 e& D2 n3 |. v! y* P此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    ; R, Y5 |1 |; ^5 I+ F8 h
    7 u+ D( k9 X- D9 A- h" B. l初值化变换; _6 P' p! }& R  P% G: H3 Y
      V, W. _* J$ k
    : Y" V2 L8 M! a4 D5 |" c; ~: ?' ?
    也就是要对每一个数据,都除以第一个数据。
    8 a  l9 ]. q/ W7 n5 _
    ! w) ?1 b0 a. G: J! j- Y均值化变换
    . P# A$ E3 R5 J) f% X+ C) z& @; N0 l! F) l1 i$ p( l
    5 p* t# u7 x' ?1 h
                 对每一个数据,都除以均值。. U& @8 c9 f7 J+ K' B
    0 |: {$ e6 ^6 {# i
    百分比变换7 m) X+ |' i  l8 u; l' d: O
    6 E8 S* }' E8 l
    & L: u! t4 M% ]3 S2 ]
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    ! c9 w$ y* W7 Q7 J6 f% W% O: `* R1 l1 w! h' p1 @
    倍数变换' s; V6 ~9 p: U; x" q0 _. Z3 r
        5 o# b( W; a' S& x) v

    ( [; h% j$ _+ e: w0 u归一化变换% V: Z3 v% I5 `; e
    0 S- E& r) q- M. U, l

    7 l6 d: G: h% | 其中   为大于零的某个值,称  是归一化变换。 * m  ?8 k7 B' q. U$ p6 f
    ) i4 Q$ }" X" l4 P2 v+ L
    1 [" `/ X3 K# G2 c! x8 B8 ^( Z
    极差最大值化变换
    - K: s2 B+ w* ?1 D- _
    6 e# K) K- A& i: @: G  q  S7 y7 M" |6 B) \! ]: r/ B! L  ~  {: m: a3 i
    ! N( W5 R  d9 \

    4 p/ N7 M: [) v1 x, m+ X区间值化变换
    ' g1 p  q7 D- J( v8 k: T- [
    - u& u. o3 `* U9 o: K
    - _) ?' |3 l7 `. S                  ,
    ; D! j' ?1 O% Y) u# T4 ?
    / D: Q# i  P  r9 `  A  l1. matlab 的mapminmax归一化函数
    6 l/ K6 Z1 D5 U* V函数用法:
    ! B( \% S' ?# @0 { [Xn,Xps]=mapminmax(X,min,max)% E- o! E  C% _  n9 H) o
    3 V8 l8 Y8 j! T6 U& q
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    + b3 k3 u6 K5 O) D6 |3 M
    1 t5 Q2 ?9 d( `/ @   (2)min,max规定X的归一化范围,根据需要自行设置0 R: `5 {0 d- T/ A! R% h- n3 ]

    6 X1 G" X/ W- {  ]3 {# q) V& n   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    1 h4 A& Y  k& l" A! @$ Y
    , s5 E% Z) j- O$ M8 W 调用方法:
    + p& A4 d! |# i# _; w3 t- D( ^" s( G5 D0 g  N
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化4 S- ?* i, V/ ]1 {

      ]8 A( B1 B" e: e1 G, QX2=mapminmax('reverse',Xn, Xps);%反归一化- {/ Z' q# x& O: `
    + I6 E2 w8 x& s
    x=[1,-1,2;   2,0,0;   0,1,-1]
    1 K/ {/ U* `( W, e* A& d! ?, @[x1,Xps]=mapminmax(x,0,1)
    0 W- U" t3 Q" Y* v8 U3 c, e% l) `7 f* N$ }. v5 M; x4 P  H# b4 r  D

    # k7 i# ?) ^" M3 r7 U$ z1 Z) v, H3 ~9 Z( ^: k8 _$ H! W: E6 N
    对于python中的axis=0 和axis=1的问题
    " U; \9 D5 B4 F4 D& B 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    6 Q7 Q" N8 P8 a& I* Q, V- s( {换句话说:
    7 ~6 ]) ^) h" z# ]3 w4 i/ h2 y6 b: ?! o. ~
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    5 i6 n2 {. [* ]+ M& Z" X. U; V: |使用1值表示沿着每一行或者列标签模向执行对应的方法
    ' a1 C* E7 r  A7 ]
      D, b5 S  L' r: z" i0 g
    # C+ A6 o8 p1 N1 @; l) N! K& S; F6 }
    / V# M2 J$ O4 v7 Vpython的sklearn中 scale函数
    3 M3 T. H8 u% H1 s+ }7 P1 标准化,均值去除和按方差比例缩放; N, J. F; Q$ [! o8 Z; O
                  (Standardization, or mean removal and variance scaling)
    # U! B1 j6 i1 ]1 l& Y: @  Q; k- I/ b, m7 ~# r& U
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。4 `, c  g) S# p# f1 m, `
    5 n" V! P4 _0 O% u  G8 \; m8 @
    from sklearn import preprocessing
    2 {- {4 B; t) v( g; F8 b' ~( p- z) A/ _import numpy as np  
    8 g9 b5 C# v% ^4 F% J$ XX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    ! r& U' N6 b1 DX_scaled = preprocessing.scale(X)
    . {8 i8 f$ q; P. N! m: i' }& Z1 D: K, i+ s
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]. }' e( B* y( o- }. Y
                                     [ 1.22474487  0.         -0.26726124]+ |2 t8 [) t: j% W: G5 ]! l
                                     [-1.22474487  1.22474487 -1.06904497]]
    + s* z/ Z$ r5 ~, h, j#scaled之后的数据列为零均值,单位方差4 s0 Q; T5 P3 j  a
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    : Q6 @5 s8 h4 nX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])7 ~/ l7 I, T6 }- p- G

    / y! N1 f$ u& P  K& H6 E8 }! g: F' o
    0 v0 q7 d, a+ t/ u( b) Q2 n1 y
    StandardScaler 5 a, h# O% I2 K. R- n" L) ^
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    ' \! `$ A4 x/ R% O& R; J) ]% b! h
    + p' V% R3 M0 {4 Z5 Vfrom sklearn.preprocessing import StandardScaler2 t( V5 b: O5 f/ q  g+ M: C: [
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    ) q& m! x) x, i8 M# u0 h2 mX_scaler = StandardScaler(), S5 L8 C) V& P* l1 f- y$ w8 g0 E0 g
    X_train = X_scaler.fit_transform(x)' m- O* c2 F! V' g) S4 P, H# F( c
    X_train
    3 @9 G4 q  o; t) P7 C$ E3 g#结果如下# g8 H- ~2 @6 x5 J$ V) w8 T' q* O0 q
    array([[-1.2817325 , -1.34164079],
    % O  M1 y/ ]% M# F       [ 1.48440157, -0.4472136 ],
    . S, z" T+ P9 r% r! j; ^       [-0.35938143,  0.4472136 ],: Z. F4 ^1 Q- c6 J& M
           [ 0.15671236,  1.34164079]])
    * g7 _( F3 S. T7 G6 ]+ @$ r
    1 o! L1 ~# D1 E( V2 `- W1 R% Y' ^5 i  {
    ; R4 Q: [1 J7 {% K

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      . @7 B4 g3 O4 P0 f1 S
    from sklearn.preprocessing import StandardScaler5 m5 H8 U' D5 f' \* G; M! |# I
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & g9 ~5 Z/ G- w+ B% t' ^. J2 nX_scaler = StandardScaler()
    4 n" X& Z6 T" n, Z- NX_train = X_scaler.fit_transform(x)
    $ E8 E# u1 x1 Q( A: v8 rX_train
    % M: Z5 p1 u4 ~! l#结果如下
    & I& }+ C* w. E. U# V6 T  earray([[-1.2817325 , -1.34164079],
    # D+ I. ~! f- C8 }* \       [ 1.48440157, -0.4472136 ],
    8 \; v9 O+ P' A2 A       [-0.35938143,  0.4472136 ],: @* f$ W3 l1 S
           [ 0.15671236,  1.34164079]])6 i7 r) k  S( r9 ?" J) b3 @$ n
    3 d% Y+ A( A3 ]6 o1 x1 x
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)# _$ j1 b. J4 V# u0 v( E: Q
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  , g4 u6 l6 B5 q' R# u
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) % G1 k7 t* }" e5 e+ b1 ?
    #测试将该scaler用于输入数据,变换之后得到的结果同上- r4 b( F4 i& n# _0 F& w; B: l
    scaler.transform(X)
    7 K; [; t& H. K( c5 w#out:
    + @( S& Y/ T; x3 ~( Oarray([[ 0., -1.22474487,  1.33630621],   Y0 [- o0 W& r2 }
           [ 1.22474487, 0. , -0.26726124],
    3 h! r  n8 F; Z) A! C* z0 \- t2 g       [-1.22474487,1.22474487, -1.06904497]])  + x* m, T/ G0 L0 G2 k! b
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    . K& M6 R/ h6 ?$ F& Z1 |* d# out: array([[-2.44948974,  1.22474487, -0.26726124]]): |3 V# e" m3 z" L  s
    $ f) Y( @1 @+ d3 P
    2 将数据特征缩放至某一范围(scalingfeatures to a range)1 c* m7 R& c- o3 c
    * R( D$ i' h6 t$ T: J& d- s0 o+ q3 I# l! q
    ; @. U, v( P: p0 E& Q: y
    2.1 MinMaxScaler (最小最大值标准化)
    3 f" ?/ x7 ~6 a0 Q3 C 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  # k* `4 U0 A0 [) b' M
    . w9 B9 W! L6 O- R
    from sklearn.preprocessing import MinMaxScaler
    9 L( s/ q$ y# o$ ~4 L8 bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    6 W; T* e/ {( I" p4 s) S7 K2 V" o/ fmin_max_scaler = MinMaxScaler()
    : z& D$ L+ k4 e3 t" eX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    ( N9 A% m- X9 G" S8 }/ R( \7 B" S. H7 j: I0 e/ k& \* a$ P* {
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    6 R" a- b" r& w( @& f* q. \2 wX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    ( S8 `3 ~0 Z( f" V1 Q
    & H! i8 {3 V5 v1 G# ~* N: sMinMaxScaler的实现
    - U! z, l  n6 `& [1 xX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))5 k& _' U+ a$ Z* i2 e
    X_scaled = X_std / (max - min) + min/ s5 M) d( |. ]5 k

    8 {' x8 a' H3 h5 R, Y$ m, `这是 向量化的表达方式,说明X是矩阵,其中" w. i! a) [0 J) x, P. M1 \2 M
    / ?- Q( r: A/ D9 }- E/ D
    X_std:将X归一化到[0,1]之间% g; O* }5 @% |2 E/ A; {
    X.min(axis=0)表示列最小值
    - T3 q$ W" }8 C+ w7 `) _2 H5 @max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    . n% }' `1 A: `/ X
    1 I4 W6 k- [3 H
    3 u) @6 h3 [2 Y9 T! b2.2 MaxAbsScaler(绝对值最大标准化)
    4 U$ F2 ~1 y" P0 H% e4 X/ K         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。. j& a' z0 Q* C3 _* Y0 I5 f) O$ r
    1 d' j7 o) D; q
    X_train = np.array([[ 1., -1.,  2.],
    / D6 |& s( n& K3 }                     [ 2.,  0.,  0.],
    9 b( q" n8 J* d: r                    [ 0.,  1., -1.]])
    9 J: m+ v1 g) W( g; imax_abs_scaler = preprocessing.MaxAbsScaler()
    9 F: p* i9 J+ o" C# e; [( XX_train_maxabs = max_abs_scaler.fit_transform(X_train)7 q' }+ _/ X1 ?& v
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    8 |) _0 i1 J- f4 _: jX_test = np.array([[ -3., -1.,  4.]])" ?: R: E$ V8 ]! Y7 J$ G' O  |
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]]); J" t; F* ^1 M* D3 s: d( t
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])4 N; r. R$ R4 @- {5 t  Y* j

    ! T1 x, ]( Q( X; q! [5 ?: w7 f' }7 j2 q. h6 z
    9 q; q$ M1 W: C. ~; ~4 w* A

    7 D' w* p( H! ]& h1 w# N
    - G, H- S" G( X2 _
    . H* E0 f' t/ t* G9 f
    + ~1 b. P/ M# {; D( ~* r/ k5 K1 X4 p
    9 k; D% k1 E7 J7 W! H# ~1 o0 P- I% X/ V. p4 e$ a% a$ u

    , i+ T: o, j8 L0 y3 T————————————————# d) f5 j. ~9 A8 b
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / @) B- P$ k7 M2 G, ~( M; c# s原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223: M( `: Q# H2 R$ E* u

    ( P7 f, c3 V" n- L3 B5 ^
    # p5 \  ~* N& m# O
    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-7-29 16:15 , Processed in 0.435802 second(s), 51 queries .

    回顶部