QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2014|回复: 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。5 d9 z5 S; S$ x8 m( _& m- R# }
    7 \1 p( D' {7 G" a4 c, I- m
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    8 c3 A1 G  p/ l7 P& L$ ?当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    $ d# S3 \) r! Y  u2 o$ |; j7 {数据变换的目的:& u4 J+ O1 y  o3 _) z
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    3 Y6 C. [# p# U0 o- d
    4 t2 @* \6 \, c  W: q, F& n 定义 : 设有n个数据的序列  ,则称映射( i3 f  z6 J& L7 K0 @

    ! w% L6 r0 b7 I, Z0 ?                                        5 R+ W1 M( f$ H. V$ z- w
    $ }* [8 w5 r* j1 r! n+ s
              为序列 x到序列 y 的数据变换。
    : d& P1 Z: g  a: N* [9 ?" G
    3 f- ^$ h0 T+ S) s, W! C数据变换的七种常见方式
    4 T" N0 ^- k# |9 U! D& w4 D4 J此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。- L' G* @' F2 X9 s9 F! ?$ f0 F

    ' g3 ?" A6 X* w; H: R初值化变换
    # L, q$ J* t% u1 k, w$ b0 b! r  f1 c# m) h; |2 s

    - A/ D  t1 w1 J+ N# D0 D 也就是要对每一个数据,都除以第一个数据。! ^3 {3 q! c) X- T

    : X* S9 }. z/ |0 B: t" r: c6 q均值化变换, N: \8 }5 w$ Y) {# d
    $ T, D+ \1 O  P4 p( v& w0 t

    $ ^9 [! d& K( i1 x; T  }             对每一个数据,都除以均值。1 e- w  C8 q: A/ Y0 d: B

    $ m6 v& {! H3 ~6 e- f2 E# `百分比变换# q2 V/ F$ x% j/ [5 e7 z7 S9 W

    8 @, k5 {+ y) C- {/ |6 J8 z- ~4 n6 p
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    # X- i& b7 J5 W* v- z4 F8 q! t) b4 n/ A
    倍数变换5 K6 B/ p: o( l* G# A' L
        + e2 x' V2 `4 Z. E- ?
    . s& ~" z( l" W7 a3 D$ j
    归一化变换( @1 }2 V* W  }9 j

      q* M' [5 o% V6 G5 @
    + x5 S) J/ F2 K* A% d3 x 其中   为大于零的某个值,称  是归一化变换。 8 N* R6 x! l) }6 l7 W' f6 A
    . c* a" }+ X( M+ g
    : q( c! i0 {: a7 i9 c0 r6 V
    极差最大值化变换+ u7 ?! g% C2 U( F- v: h- l

    - _* y  @: `. I5 n
    . _9 ]7 S4 ^& @) Y* `3 R( n: f8 s: s8 B/ D  G- z) H
    5 h" |9 U4 S  e" H8 [  k2 [
    区间值化变换
    % l* w* m& Y8 f1 ]' s1 b+ f7 B2 @; V# l
    8 z( T1 \5 }- x1 a8 N* A
                      ,
    8 j5 J6 a* j4 q8 O% d. ]+ y. S  Q
    1. matlab 的mapminmax归一化函数; [( r- k+ M  ^" j, v* o
    函数用法:
    ' N" T- \5 P: c+ \2 O2 y! p [Xn,Xps]=mapminmax(X,min,max)& O+ ]. J1 J2 C' h- a. N4 {
    ) Q& L2 r3 P+ |
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    ' j: _$ u& v! ^7 v, J" _# Z
      `$ M0 Y( p+ d, ^" E; P   (2)min,max规定X的归一化范围,根据需要自行设置
    2 u1 ^' A* R( Y8 v( s( e2 q' \1 H* X9 ~" P0 n4 X3 ?% A0 P
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     ( M1 K" y6 {/ k+ b0 H6 c& a
    * J3 B) w( S! U$ _4 W% T4 {- U2 V2 |
     调用方法:
    2 \- v0 m9 M! I$ D1 y6 p+ p
    $ q3 S3 V! ]+ o! ~+ FX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化- j3 Q. F; X' ^; V$ x' X* \

    " g; \; Y+ c7 xX2=mapminmax('reverse',Xn, Xps);%反归一化) q  e% O( V0 }1 R
      o6 H3 [& b9 g3 y
    x=[1,-1,2;   2,0,0;   0,1,-1]2 I; p4 o* \5 U5 ?6 |
    [x1,Xps]=mapminmax(x,0,1)! V# C+ r/ ?! J* a# e6 X! r
    9 x; P8 ]6 |; m1 W7 Y$ ~
    : n& {0 u; }9 R' G
    / D  c) u( e+ Y
    对于python中的axis=0 和axis=1的问题1 k" k% e, P6 q
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)/ E+ A' Z  d, v% l2 H8 M1 l' Q' [
    换句话说:5 R$ Y* `4 z, ~! j- u
    5 I% L6 c) L' Z4 @4 l
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    8 \5 L7 {9 E7 A6 b使用1值表示沿着每一行或者列标签模向执行对应的方法
    6 ]& T2 J6 m) G7 o. e( n  g9 X
    $ t. E% X) F7 M+ p9 Q- h$ z
    1 g0 r4 `: Q3 P' W* D, g$ d1 M: j7 E' ^5 J3 o' N7 X2 t: d
    python的sklearn中 scale函数
    4 O: ]( C- ]7 F" G; A: ~1 标准化,均值去除和按方差比例缩放
    , p8 a9 O7 L7 d( ~  V& `& k. [, f              (Standardization, or mean removal and variance scaling)/ s: Z7 P6 [( P0 ]
    7 O8 x; v0 B* ?0 O  R8 X. N
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。) C& f" g4 t2 C7 v

    0 v% R# J/ _6 Q8 v0 b; |# z9 o( t8 |6 kfrom sklearn import preprocessing 5 U5 S3 c( Y0 M* W$ @: _
    import numpy as np  9 K% ], b9 E( O% z5 s0 R  F
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  3 J, l! ?, K! r, M
    X_scaled = preprocessing.scale(X)
    6 q4 ?! j! Y! E' ]+ M' U
    / C; q+ |  b2 g- T" r2 g#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    ! S/ ]5 ~0 X1 @, J% {                                  [ 1.22474487  0.         -0.26726124]& |9 ]0 Y2 W; ], m
                                     [-1.22474487  1.22474487 -1.06904497]]
    ; f( E) F  M& W/ K/ ^#scaled之后的数据列为零均值,单位方差4 t  p3 G& ~, s1 b
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  % ^, z' g, C' y% w: J' X. J
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])! k5 o, o/ Z% |3 d$ C: [5 z

    . [! T- u" P0 H4 p4 G/ B6 y; f$ S; e, |1 j7 G$ j

    " A  k# z  }% o! L3 `0 SStandardScaler
    : h8 y6 u$ o8 M* b* ~Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)9 ]9 a1 k3 B( U3 T% F* \
    / w' Q  O9 |( i5 L/ B
    from sklearn.preprocessing import StandardScaler
    4 }' m" X6 d( _7 T( L. ^  Hx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    $ x( e  A1 B( ?! F0 y' b! @X_scaler = StandardScaler()
    ) q6 S5 m( H) o8 V0 j* ^7 pX_train = X_scaler.fit_transform(x)/ m0 S5 L, \/ C+ h% ]
    X_train
    4 O" d, W! D+ T8 z#结果如下0 o8 d1 ?$ B: o2 c' C; h/ L: K
    array([[-1.2817325 , -1.34164079],/ B; J9 o: j8 v; X2 v& G
           [ 1.48440157, -0.4472136 ],! B% r! G3 d" k, e
           [-0.35938143,  0.4472136 ],
    ' H5 V: j  P8 o7 E9 I       [ 0.15671236,  1.34164079]])! w4 @( ?8 A- H# l$ Z* l6 m- u% G

    % E/ b. X) j: X, G  R
    4 S5 O& Q3 d: |+ C& ?$ Q6 T; R& ^
    $ T1 H$ c3 _3 T+ m4 d

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。) r& r2 G. M: V/ o2 L1 l
    from sklearn.preprocessing import StandardScaler
    . p+ X. i; |& i4 _  n  w+ j) E* Bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
      N' b. ]* z# C+ }  E8 @' t) jX_scaler = StandardScaler()! f5 K7 I& Z# T" G1 m- N
    X_train = X_scaler.fit_transform(x)
    . `5 f7 n) b- L+ k# j& I6 m4 EX_train
    ! v9 c; G" q# v/ ]9 ?  {& \0 x: d% \#结果如下' A( x' S: J/ V" c( G
    array([[-1.2817325 , -1.34164079],6 j. a' [) n6 u# ?3 l3 ]1 m
           [ 1.48440157, -0.4472136 ],
    ) i5 s9 x! c  b. \       [-0.35938143,  0.4472136 ],# A8 F% m5 r( g
           [ 0.15671236,  1.34164079]])+ }+ ^' n6 h6 q, B( H1 _- G) _! p8 |
    ' X4 Y- T$ w: D
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    . I& O' C7 ^& y/ {scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  2 V: z( A( W2 |. P; ?* M
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    0 k! o) B) H" l0 W#测试将该scaler用于输入数据,变换之后得到的结果同上
    7 R% t. j3 ^2 J6 Sscaler.transform(X)
    5 q* {! V1 n- @8 |#out: 1 o8 T$ q. k7 m' `4 h6 k8 Z0 W
    array([[ 0., -1.22474487,  1.33630621],
    8 ^$ ^, R; \: E7 I" B3 [% j# P5 S       [ 1.22474487, 0. , -0.26726124], + v5 q, F' p3 \& p- ?) M. V3 f4 s8 v
           [-1.22474487,1.22474487, -1.06904497]])  
      ^9 w" l: }% P% b$ d: H+ hscaler.transform([[-1., 1., 0.]])  #scale the new data
      x; O: h) B3 [4 M/ L+ U; ?/ b# out: array([[-2.44948974,  1.22474487, -0.26726124]])
    5 |; j# l. g) K) e9 P, J6 c# w9 `5 Q& ~/ z1 p$ f! v+ {$ K* i, g" x
    2 将数据特征缩放至某一范围(scalingfeatures to a range)* D, G3 Q6 ?5 S/ a) k, A  [

    + y" _5 G& W1 ?7 I/ v

    . K- o/ M1 f  ?2 f$ b( W# a; v2.1 MinMaxScaler (最小最大值标准化)
    $ b0 W* z- z9 X  l  { 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  * X4 t1 h" q1 Y) O. d

    1 v! d9 L& R6 n" m! ]2 pfrom sklearn.preprocessing import MinMaxScaler) k% s6 X$ j3 [8 a% F: f9 y; V7 J" m
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    ' x8 k+ }8 j, b% x7 s$ [: fmin_max_scaler = MinMaxScaler()2 H+ u3 _) z8 P: M
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,8 n: e0 c7 t& m; m( Y

    3 W- P( E4 w! I) D" o8 l% D3 G" smin_max_scaler = MinMaxScaler(feature_range=(-1,1))0 Y8 R6 K% w" g! G; z
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    ' M0 Q$ W& Q! b3 V" K0 r
    . y& O2 f# L9 T9 H% XMinMaxScaler的实现
    : c1 \: R( t' o! `9 B+ \/ T* SX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    - X- M4 t) B" t/ L$ P7 r3 ^% u7 I+ u5 fX_scaled = X_std / (max - min) + min4 u$ Z" j, p4 Q- n* J' G) I
    ) G2 Q/ f- L# O: C; W% e, O' R! B
    这是 向量化的表达方式,说明X是矩阵,其中/ i2 @9 m. f' t

    # y, l0 ]6 _; o# J! I7 CX_std:将X归一化到[0,1]之间9 g9 a# q! z' w' s+ C
    X.min(axis=0)表示列最小值
    - f6 p2 J% Y! [; f; y; fmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围. c( B+ U" I* r( T4 V

    * E; e7 z0 u4 d/ \. E  `) t1 a2 w2 T
    2.2 MaxAbsScaler(绝对值最大标准化)
    5 d; }6 a' ?" R# S. ?/ H3 w         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。5 Y% N) X0 \# k7 l0 a& d. ?  ~  ]$ n8 c

    4 ]* D# i# `3 ^/ rX_train = np.array([[ 1., -1.,  2.],& _1 x. X! c! q" S- ~  o& R: N
                         [ 2.,  0.,  0.],, M9 V$ t; n$ W8 S  _
                        [ 0.,  1., -1.]])' H6 }  e, E/ G2 U
    max_abs_scaler = preprocessing.MaxAbsScaler()4 I+ s( H' G4 h& E) d$ D
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    - @  V8 F1 G  f( T- b& {# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])4 N3 I- n0 h5 T4 j  x
    X_test = np.array([[ -3., -1.,  4.]])1 k, n$ q) o/ g: G
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    ' n! M/ R4 }) _max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])2 W# {% J2 s, d. ~  K; }8 _

    # G% @. D& J+ @  g! ]' {0 G6 E5 }# M/ u; S

    + E! @. f! [, \8 A# Q9 R# |; r$ q5 O$ L* ?6 M; b/ z, ^
    % ]+ n' g4 @- F8 {! a$ D& a# H. P8 p
    3 h5 I5 Y- j7 ?1 k
    7 J5 J8 R* \# x3 N

    0 i1 U! M6 b- H0 X* ~* I8 T0 W4 Z/ E- J1 s  }

    + ]+ g* @2 _4 Y% }2 T————————————————
    : H: D. H! F5 t+ s0 a6 r版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : b) ?7 h6 t4 R) y0 y原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    * a2 Y, j; G  I6 g6 {2 i& Q" ]/ ^) B; |6 |0 J4 J: q$ Y2 C
    " Z9 G" c6 c. u# A: u0 u) m
    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 11:27 , Processed in 0.419423 second(s), 50 queries .

    回顶部