QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1691|回复: 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。" z) [* e4 `; @
    # q" Z7 k$ j! u6 s
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    , Z! _, C# _2 x2 k6 I当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler9 R; ?. k  A, Z: z4 |
    数据变换的目的:
    / e- Q, b& k) O, F  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    # i/ g" Z: J0 b5 x+ \$ |! l# ]* d1 Y4 {( @9 n/ X1 i
    定义 : 设有n个数据的序列  ,则称映射7 v, i3 \' b. ^0 q% b, ], j2 e" Q
    ; o+ \. E" V% k: U- O" N
                                            3 s- Y9 F2 h4 G& A4 l

    + K8 m9 y( q* v# S; C1 L+ ^          为序列 x到序列 y 的数据变换。
    # M8 Y- H) z& q& x2 L
    , R. ^( Z  j% ^( N! ]2 z4 b数据变换的七种常见方式6 d; }+ {: G% R* I& D& E9 V4 n  ~
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。! a$ k1 u2 @1 M5 P

    # Y, E: j; q$ B3 K6 O& G/ \初值化变换
    * C1 e( X2 p5 T* N
    4 J- ?! C6 w' V( f( `# u) N
    - y7 J3 ]& @. }% d0 G 也就是要对每一个数据,都除以第一个数据。
    5 L) X# x# N5 g! j( T$ ?/ S6 k: |. C! ]5 C/ b& |2 P
    均值化变换  V" i& W3 m: H: K$ z1 i( ]* x$ E

      l' K8 E* ~+ a
    . K5 \- Y- u& X0 F1 x/ [( L0 B             对每一个数据,都除以均值。. D( O% a- P; j
    3 T$ A0 D: f7 L- a$ ]
    百分比变换. C# A, |" `. D. a5 M; v0 x
    , S9 J5 f( d5 a6 X' H) ?- j

    & z2 [& o; ^" e& r7 H$ ?5 [' p分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    + P4 c8 C+ |$ }9 q8 z
    ' b4 x: y) c  N) T- ?# m, t3 n: [7 |倍数变换; [$ A" Q* m4 q, @6 Y
       
    : H6 I& K) c5 F3 S6 _7 r2 D( F( p$ k* p) U/ T& }
    归一化变换7 ]! C  @' y( F. s" l. N1 d

      P+ y% t1 D0 l6 L: I: i% ?+ H) W
    其中   为大于零的某个值,称  是归一化变换。
    0 o; C0 X3 z  Q$ Z: [* U7 @
    & A- h4 j5 |$ y& _; i% G
      s/ {4 D0 z. R极差最大值化变换
    $ S) d- w. ]* n5 p0 X8 Y, |% E( m- U) u
    , c4 z0 ^* J7 q2 M% I6 E' o
    " f3 ~6 p2 c" _0 D

    # B0 ?6 L* i$ W$ T0 B: f2 x区间值化变换
    0 Y* A8 F( H7 U' l% r# }# B; |* q0 ^

    ! s6 p, F# y- I* U2 W1 V. v                  ,
    - c  K& D, U6 `; M& `" Q7 W2 x$ k9 e7 k# l# _2 ~+ ]+ D. P
    1. matlab 的mapminmax归一化函数* p4 s' H/ W( B& q5 u: a  ?5 C- C
    函数用法:
    7 f  c: C$ G  z- L  i [Xn,Xps]=mapminmax(X,min,max)
    2 F; o$ y7 b5 o$ @3 {$ J( u
    / Q# i, r- P, O( o" ]0 u说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    # U/ a& Z: F* k( t/ I/ ?# ^, R( a" ^: K1 c: z7 p
       (2)min,max规定X的归一化范围,根据需要自行设置
    2 ~0 `' Y* Q$ a' q
    ' q+ a- J2 p) X/ i   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    0 [- J% G1 M( @5 Z1 o/ z; \
    3 {! S; U8 d; s% T! Y- { 调用方法:
    $ O5 c0 T2 v4 b2 {" ^, M: Z5 p# {( `  m( d: [0 V* T
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    - E! v# T: h# u" |4 F
    3 V! c$ N  M% Q/ C* ^* d! j4 l1 hX2=mapminmax('reverse',Xn, Xps);%反归一化0 Z" a& n9 d: m# X' v  o3 y
    2 N) s+ ~$ b( k, H0 D9 ^" j, V
    x=[1,-1,2;   2,0,0;   0,1,-1], e8 C7 u0 N/ O( ]1 a$ R1 ]
    [x1,Xps]=mapminmax(x,0,1)
    " z6 W) V# w4 S# Y+ E& b5 i# p4 I- z8 a& L+ V/ V# P6 o
    $ t. Q  p! Y0 g6 Y. d, C- R% a
    ) A% z1 T9 `( G1 \
    对于python中的axis=0 和axis=1的问题& _# W9 T0 I/ _+ L; m
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)& z! N4 w: _1 H2 \3 S4 o" ]  U
    换句话说:
    1 J5 X4 _) c6 ^2 O) ~2 ?3 o8 o* Y' u5 L3 d/ |5 }! t3 L0 C$ w
    使用0值表示沿着每一列或行标签\索引值向下执行方法6 h3 `- g$ G' s# R: m
    使用1值表示沿着每一行或者列标签模向执行对应的方法
    & k* ^& S+ [, }) K1 [% ]! o* L) g! O& T' g1 I: _' S- [$ u0 o: N( S
    ! @( J0 W9 E8 e) S7 P

    ( r. l9 g4 M7 V) Q6 g5 q* Upython的sklearn中 scale函数/ z5 y8 F! D3 V% E2 y
    1 标准化,均值去除和按方差比例缩放
    4 Z1 A$ h1 s; V0 k3 t              (Standardization, or mean removal and variance scaling)3 x" r, y1 l- Q

    / ?6 E' a( |1 G. T8 T6 ^5 D. O* X  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    : i! D# `8 j0 Q& N8 U' ]; R& ]8 M4 H
    from sklearn import preprocessing
    $ V3 ]( Q4 v4 P9 ^import numpy as np  * |" [5 K6 G* n; M
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    ) T) }/ z* Z) x6 e  R+ k5 a9 X' \X_scaled = preprocessing.scale(X)
    ! @* M5 T5 I$ \0 \, }- U" r2 F7 R; Q8 M+ s
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]% I+ d/ s  \0 ~' N8 s  y, J! ~+ X
                                     [ 1.22474487  0.         -0.26726124]" \9 y# D' ^% h+ h  O
                                     [-1.22474487  1.22474487 -1.06904497]]" b# L! X8 ]; O, J$ g) Y" D% n
    #scaled之后的数据列为零均值,单位方差
      H$ ]! |7 B' W% R3 ]/ C/ _X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    8 d  [  Z: m; V- Y3 |* }X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    $ a, }" V& ~4 [& |: |  j- u% b1 W# m2 i( }7 S

    8 E% a' M- Z( Y# h! z4 r
    1 ]; z$ J0 g) |& xStandardScaler
    ' G' C0 y9 j5 P6 hStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)! Z) ?4 v3 q! ]" j

    5 V3 _* p7 p. _- cfrom sklearn.preprocessing import StandardScaler4 J8 j5 k2 R  c4 ]- J
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]& q+ C( z$ W* h/ z, Q& y
    X_scaler = StandardScaler()
    4 g9 t5 B6 t; ~) B+ VX_train = X_scaler.fit_transform(x)
    ( ^, Q# I: C% ~8 D. _' U/ E$ yX_train
    4 R  H, N: p* {9 N) X4 K& e#结果如下5 _/ R0 Z( Z, }; Y7 |9 d
    array([[-1.2817325 , -1.34164079],' z( A9 \6 ?* |7 v6 f5 j. Z
           [ 1.48440157, -0.4472136 ],3 ^  d  Y# T4 y& g! @) \
           [-0.35938143,  0.4472136 ],
    3 l6 U2 k) ^; S" K5 j1 y       [ 0.15671236,  1.34164079]])) A: U+ m' o* J& Q5 T
    * B0 _4 W- s# }! |
      f( ?% R, V, x6 {$ W" Y
    5 M2 d( i# c- ?! m" N& m

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      1 s% \6 \' Z7 l3 _% m( a% W/ C
    from sklearn.preprocessing import StandardScaler+ E' f5 u4 i; w. d
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    ) D, Q+ u7 F" Y2 b, |& @' SX_scaler = StandardScaler()! u0 {) p3 b+ t% @; k7 c* B3 X4 ~
    X_train = X_scaler.fit_transform(x)
    2 w* y3 C7 n% g0 fX_train
    " q" f: ^/ z$ n! e. p$ E! f, Y#结果如下) P* C' x1 _: F
    array([[-1.2817325 , -1.34164079],
      \5 W3 `2 o6 a       [ 1.48440157, -0.4472136 ],
    . I$ A% W8 k* y9 H. I7 m' }6 p- G# n       [-0.35938143,  0.4472136 ],5 E. F  p6 e  Z& x
           [ 0.15671236,  1.34164079]])
    , @. i, h! V- f' ~$ Y1 F* }
    ! U- L$ C/ S2 J  P: x/ ]  Q7 f$ bscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True): x5 V6 ^. i$ A* v: G* p
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  7 |8 I1 n+ e3 j+ P' s9 @( ~. K
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    , K( k5 C4 z. e1 s( |#测试将该scaler用于输入数据,变换之后得到的结果同上
    % W4 p. t9 {% Z1 ^( ]* n8 Jscaler.transform(X)
    0 J8 a7 `  S+ {/ W#out:
    + g" M# ^$ M5 J( [9 z0 barray([[ 0., -1.22474487,  1.33630621],
    , T# i# v0 o1 n/ r% `" ^; o       [ 1.22474487, 0. , -0.26726124],
    $ z, }4 P% ?2 Z6 J       [-1.22474487,1.22474487, -1.06904497]])  ) d$ B6 P* H+ x, g# q
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    ( @- G* c, h# e6 B* m5 t# out: array([[-2.44948974,  1.22474487, -0.26726124]])
    / ~: c3 k$ |) {5 H% V6 t  [
    " J' _# z' K( x5 q( Y2 将数据特征缩放至某一范围(scalingfeatures to a range)* G0 G8 e0 @- U

    . U9 J" K. ?! o: Z! N4 r, c
    4 k: a$ I3 H  I% t
    2.1 MinMaxScaler (最小最大值标准化), K1 ^% p2 C$ f' O) t+ y
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    1 Y% V* q! f: j- |1 @7 C  ~" o$ c: c# [: Y/ f) c
    from sklearn.preprocessing import MinMaxScaler' {1 i. j6 `0 O& N
    x=[[10001,2],[16020,4],[12008,6],[13131,8]], O3 L6 ]8 f- z  s8 I7 @6 r
    min_max_scaler = MinMaxScaler()
    5 G- r9 D* z& `4 ?' qX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    1 N2 i: m4 A5 ~" S7 |; x. b" J5 T6 |9 y8 R/ r9 E! E
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    / S* z' G% b5 C1 Q  Y7 M$ |8 Q- hX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果' p5 O8 M3 ~# d* E

    0 V* A. p0 f- K, K$ Q4 O5 pMinMaxScaler的实现  V' ?1 l3 w) j
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))  o$ s. W' t- P9 U- b
    X_scaled = X_std / (max - min) + min
    / e# Z* e  i/ }" T& {* x) _' g2 m: A! u  g$ k
    这是 向量化的表达方式,说明X是矩阵,其中* S. b$ h# n7 P5 |! J

    ; x* P6 A# I1 L4 f! M1 @X_std:将X归一化到[0,1]之间
    4 W& g1 a6 ]- EX.min(axis=0)表示列最小值7 ^& |% D1 E7 J( F
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    ) f/ X. |3 o! T; K# g
    . d3 c: D# |/ D; H" i* l. v3 V0 t3 t* |$ U
    2.2 MaxAbsScaler(绝对值最大标准化)
    0 W: N! n: F! _3 k8 W( K7 V: Z+ {         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    / U& u: ~- G4 u% F4 T. M% x. k; @/ O3 r0 B3 x" o
    X_train = np.array([[ 1., -1.,  2.],9 H+ W" b# w( [  z, V, I
                         [ 2.,  0.,  0.],
    8 _- q6 S# @# x2 x/ e                    [ 0.,  1., -1.]])
    9 n$ a9 {6 [5 E0 _8 P- T" }. s$ _max_abs_scaler = preprocessing.MaxAbsScaler()
    ( i. M* {- W3 {X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    . ^  Y; D: x2 }0 [  |0 S. v' X# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])% ^& Q9 z! ^9 ?$ ?6 c
    X_test = np.array([[ -3., -1.,  4.]])
    % B/ u, V1 _$ ~. V+ N/ [! y) ^0 {' nX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])7 t- X& c. P8 x4 @- I  m. v( ?
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])3 @7 p) S+ T' X3 b  C

    9 k( |9 |+ K1 C. T% ^; c3 B: h* }; D$ \+ N9 K) L
    7 P0 K5 D! `0 U+ o5 |9 K
    , d5 Y5 i8 g* }

    / \! }. b9 H0 o- y6 K: A7 A0 b& U8 E9 y# g9 q* Z
    : ~9 d" ~  s" E9 q" J
    % }  P' _+ t+ K& K) B$ J: R9 |! E
    % R: S/ ^% ?/ k( q2 u- }
    9 j6 J) X$ E4 N5 r5 k8 O) g
    ————————————————
    & q, [; P6 a  g版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; f8 }$ f5 @9 S+ }5 b2 j
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    5 p* {3 z; i$ ?( m: u5 W' m5 b. ?: ?; ?7 Y# W

    7 U3 Q7 H, [3 }* E$ q7 H2 f* ^
    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, 2025-5-30 21:00 , Processed in 0.935503 second(s), 50 queries .

    回顶部