QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1995|回复: 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。' p: l: L/ D% }3 q

    $ l" G% j; f  x$ J# l当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    4 I9 i( L8 E) {% O% l4 [! b当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    7 h5 K& A+ m5 Q  t% o数据变换的目的:
    & V  n# Z1 }6 L# Y  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    / V8 k& {: a# n) P: o
    # Z: A: t: X+ }7 N 定义 : 设有n个数据的序列  ,则称映射
    / G. y4 Y1 O. A# H" \, h. u( R! P* [$ {" V" w% r  G
                                           
    4 T: V7 t: I2 K( y+ J# n# Q: }. x
              为序列 x到序列 y 的数据变换。
    ( n7 g$ r3 L/ h9 F1 S3 G6 E, \8 n0 W: Y
    6 F! Q: T  K; w9 ?5 P4 c- Z数据变换的七种常见方式# S' M9 \- F. Y+ r( K1 j+ r/ I9 k# {
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    + n, {7 i3 N: Q+ z6 V$ C: ?6 t1 X9 g
    ( Y: ^- V" _! n2 H0 K初值化变换
    * }( k% Y" Y" ]6 L
    , |) l. |$ i5 c4 L+ D0 |5 L& O# h/ C) d& D
    也就是要对每一个数据,都除以第一个数据。2 m; ]$ G+ @9 B; l  J" P, N5 l) \

    . h4 y) }7 w3 t7 v均值化变换
    ; R: h  T8 `: o% t$ x- x' P2 l8 W: \. f

    : C( D. ]9 F2 o; b             对每一个数据,都除以均值。
    8 e' W4 E, V& z
    7 V  B- Q+ p8 i百分比变换
      n" t1 w) {, ^2 j, W& p- c( H% M7 D3 ?7 h5 e

    4 w9 }7 `" X& V1 U/ v2 ^, I分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    2 L% \$ _; ~9 I; d2 w0 o4 Y8 C" I* N2 {/ e! D# W* }3 U
    倍数变换
    5 O( B$ K# M0 @" ?4 T' O6 t    8 n5 W3 D3 W' m. d3 B  ~' y
    + k$ Q1 |) \1 x) [+ i
    归一化变换& M4 _+ B! c5 @+ M6 Y/ L7 M" X- ^
    $ i* x0 t! s. n% @' Q

    . m- T1 W7 H. Z9 e6 S, _3 Z 其中   为大于零的某个值,称  是归一化变换。
    2 U' m, G+ d  ]# V2 [
    + L3 O4 _; ~& a8 H% n0 |% Q" D: y* }9 W, m# ^
    极差最大值化变换6 r% |) _. _2 c

    0 g5 _, I! m8 Z* i' \, Z$ i2 v; d& o5 Y
    5 j2 h' M$ D+ s
    $ i, ^! @2 ?7 A2 m$ ~  S( R
    区间值化变换4 K7 @7 O  y/ q: }( T! t1 F
    * f; X. r& q2 O" P
    1 }6 y' v4 p2 |( x
                      ,7 [9 I# @7 Z" N1 r# e" I3 w
    - G3 q0 B0 I/ b4 E
    1. matlab 的mapminmax归一化函数
    " U: C" ]4 G/ n: \函数用法:
      X# t2 j6 _$ _/ X0 t6 x [Xn,Xps]=mapminmax(X,min,max); T0 _3 K: ~3 T- G
    # u2 z/ K8 j( e
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。6 p# t' ]; o/ U' ^. q2 x
    " H6 O" D/ x2 v( a& \$ v
       (2)min,max规定X的归一化范围,根据需要自行设置: w2 V. {0 R9 t7 T

    2 e  {$ ~* q7 R# `2 t   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     , p! n2 a+ ^( e/ F1 s7 V0 I% A8 s
      W. X$ c' K" j
     调用方法:. A3 r4 A& E$ Z: M( M/ G

    + r, a% M( w& MX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化/ [/ Z, B& M1 w( u

    8 U/ r* S- Y5 h& Q% _! ~# o" g" \5 v2 nX2=mapminmax('reverse',Xn, Xps);%反归一化
    7 y2 Y! Z7 F/ l4 a& s5 Q. e6 S$ G9 \/ M& U/ X
    x=[1,-1,2;   2,0,0;   0,1,-1]+ p; M; L( _  {1 L$ V5 G
    [x1,Xps]=mapminmax(x,0,1)  J: z- g( b4 a9 p  W3 I

    8 h: O$ u$ J1 T( i/ d: H7 P
    3 T" z0 _: e3 @
    * u# W, i: d! D% i; ^" F7 X2 |5 A对于python中的axis=0 和axis=1的问题  |, H6 `- c& q& @; d/ P9 d
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    4 F2 v0 Z% m; R换句话说:
    7 U  y2 L% x8 S0 t$ T
    , k' c+ x8 g) i+ k$ x/ q0 ~使用0值表示沿着每一列或行标签\索引值向下执行方法
    9 e% c& J8 ]- w) i1 \0 p使用1值表示沿着每一行或者列标签模向执行对应的方法" x3 P" z% c+ \! i
    3 c4 a- K# v0 `

    5 U4 J' _9 t7 E; z- E
    8 d/ K) w) ^8 y% \/ m2 v% i+ Xpython的sklearn中 scale函数
    , D) c# n1 @1 H5 n5 r. w4 A$ s1 标准化,均值去除和按方差比例缩放3 u+ T! j( J5 `/ w: x
                  (Standardization, or mean removal and variance scaling)
    4 d) U8 @: \& J' L! q! T7 `/ m- m# ^: V
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。  I% q  F9 q2 s
    4 R+ n, X  @' X$ u" x: c
    from sklearn import preprocessing
    , z7 J4 Z+ c- H. Mimport numpy as np  # k; A4 K; h% ~; [% H
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  # d# ?/ z* z/ S% U
    X_scaled = preprocessing.scale(X) 3 R/ n* g# p) X. I: q3 }* r
    & z# O8 R  R0 B: K9 E" ?% R9 m
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    5 [$ P- b- C8 ^                                  [ 1.22474487  0.         -0.26726124]% l5 E& t3 V( y
                                     [-1.22474487  1.22474487 -1.06904497]]
      d1 U0 f) X4 I! A8 ^* M; ?  ?#scaled之后的数据列为零均值,单位方差8 C6 N" G  B6 r
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    $ Y6 P1 f  O0 T: f- g* L9 n9 tX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    # S. @5 r5 {; P5 v& x
    - z- C) M) K3 K" Z% B  D
    * A- m0 ?. L9 Y9 M  }/ M' ?, z5 R( A( p' {% n# M
    StandardScaler ; U2 F) q9 s7 o3 |+ t7 j
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    " X# S' D. T' F9 w- r  G- X
    9 ]& \. W- p# D8 S& T2 G0 ^from sklearn.preprocessing import StandardScaler) l$ B" v( K4 d% q6 h: D
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]2 j* V' f, g1 F) J) D( z; P" M1 h1 k
    X_scaler = StandardScaler()
    . n3 }# J; }* x: CX_train = X_scaler.fit_transform(x)
    4 C4 k( U4 \3 U% ~& D! l) T% H' lX_train
    ! k$ k( F# C$ x/ `' u#结果如下  n, {- r: Q3 P. W
    array([[-1.2817325 , -1.34164079],3 U# A# F4 B/ Z8 w( G9 }
           [ 1.48440157, -0.4472136 ],
    ) D0 g4 b3 ^( l6 q% b7 b6 b" P) [       [-0.35938143,  0.4472136 ],/ ~8 I8 ?% H9 W5 x( Y
           [ 0.15671236,  1.34164079]]): ^- {7 |- W! C" l5 C- L, c- H8 B5 t

    9 v# I5 n( ?5 ?2 y
    , p& a, h1 Q4 o7 H" l) q! b# H5 m$ O% T, ]4 u

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      ' D; R5 e% e8 f. I# ]) T
    from sklearn.preprocessing import StandardScaler
    ; v* S0 R- T% [8 tx=[[10001,2],[16020,4],[12008,6],[13131,8]]0 f9 L- q" Z' _1 w( Z' h
    X_scaler = StandardScaler(): h0 d! g! }* w- c' ]/ l" g
    X_train = X_scaler.fit_transform(x)
    & p2 v) U: H5 `& v7 jX_train
    ( t+ R1 W/ M( T, r3 s4 A#结果如下  d0 I- h  K2 G: j& j
    array([[-1.2817325 , -1.34164079],4 P# _5 S/ M! ?
           [ 1.48440157, -0.4472136 ],
    7 z% V$ T9 l- q% ^       [-0.35938143,  0.4472136 ],7 E" X% t8 U1 e- n# Z9 Q
           [ 0.15671236,  1.34164079]])( ?: m; C* u" q. W* l0 |
    . W6 c, X5 L4 g0 f+ l
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    6 O6 R6 L% q) k7 H7 Nscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])    E$ \+ b$ y* D, r3 i; o# Z) _
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])   H0 N# u$ J% x5 I/ R3 d$ o- [
    #测试将该scaler用于输入数据,变换之后得到的结果同上& Y! e/ z: f0 {6 W; V6 \1 q, \
    scaler.transform(X)
    2 {3 Z! z* J0 y  {5 ]# G. M1 s" f; V#out:
    8 [  m- W4 z" D* F+ [! v, d! Qarray([[ 0., -1.22474487,  1.33630621], 8 {+ ?2 O+ v/ m2 A
           [ 1.22474487, 0. , -0.26726124],
    1 `# O9 I5 ]; G+ {! i3 @9 ^  M. u5 i       [-1.22474487,1.22474487, -1.06904497]])  
    0 A" z4 D7 b$ m! l1 yscaler.transform([[-1., 1., 0.]])  #scale the new data
    6 e2 ~9 u3 ]$ G7 P# out: array([[-2.44948974,  1.22474487, -0.26726124]])! H, M% I/ }# ^% U3 P
    - V$ B$ z* ~8 O
    2 将数据特征缩放至某一范围(scalingfeatures to a range)/ M' w  `, u* p8 l# L
    , B4 ^7 R. D2 E4 h6 G

    2 g: \6 X& y* p+ R) r2.1 MinMaxScaler (最小最大值标准化)
    7 R7 c4 @& J; _# o# z 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    9 B7 O4 l  z. B# `( o% K8 X! ], e9 V: H
    from sklearn.preprocessing import MinMaxScaler4 m$ L( V7 D7 A& W
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]. z& M& Z/ r! y* q, T/ a
    min_max_scaler = MinMaxScaler()" [" ~9 d2 j; g  r* k* i+ z! W
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,7 q; F5 ], N9 ]7 w
    3 b# q* K# q( B0 |
    min_max_scaler = MinMaxScaler(feature_range=(-1,1)): ~+ n% M  z$ K8 j* J& C9 F
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果0 p, }9 |- Q( s5 q4 x8 }
    # C, u- E/ `. n* |
    MinMaxScaler的实现+ }; {2 K$ f2 n% H: x. i& x
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    ) U, a- M4 a: N& x  C4 wX_scaled = X_std / (max - min) + min7 b0 G# u4 c+ c( D* L5 F
    6 }( u3 H. O' ]! f+ C: K' y
    这是 向量化的表达方式,说明X是矩阵,其中
    $ U; m  N2 u/ b5 r, W. P% _$ o* i( k! x2 J* i% Q
    X_std:将X归一化到[0,1]之间
    / _9 V; X5 g! q7 t, y+ vX.min(axis=0)表示列最小值: l( S% f9 B# K3 l3 {0 u6 h
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    ' s0 p0 o; N& |; t8 l! y4 D3 Z+ {3 Y' [
      a) }& |9 K4 Q  |, ?& j3 Z# [! Y6 n
    2.2 MaxAbsScaler(绝对值最大标准化)
    $ n% {* h2 d( n9 W  Z         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    2 I6 n: Y. c, p; x" u( b6 x
    5 p7 ]& z9 B/ ?. |& XX_train = np.array([[ 1., -1.,  2.],
    6 g( G+ d8 h* o" `% \3 v8 Y                     [ 2.,  0.,  0.],
    9 u1 h( M6 d, Z3 B2 n3 k                    [ 0.,  1., -1.]])6 M6 ^6 w' w7 H2 ~
    max_abs_scaler = preprocessing.MaxAbsScaler()" Q, u- _  |5 x& I, m+ O
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    " n$ e8 U  j* _# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    ! b3 }7 C; d6 i/ b9 _0 r  W3 EX_test = np.array([[ -3., -1.,  4.]])
    3 C7 j) ?! c+ C* R8 K. t# ?" ]X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])2 T* n% g% v- N7 h0 m+ [" k1 M
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])5 I" M0 s4 f. D# w0 H; v/ U

    - M4 h2 u3 A1 [9 q: ]
      a, y3 i2 Z( n7 Z, B, }
    * M! a( T" p  b3 U! B; V
    ) [0 q# ~) h% h" {9 a% u6 G; O. N; b2 z" M$ n; l2 ]' {* }

    $ b! g5 H" h7 t4 V4 [- Y. u- N3 e) i' b* K

    9 f  |- y. [0 g0 J) `* Z; G# p3 x2 @% o
    0 K6 V( c; s. z0 Y
    ————————————————# h$ T/ m2 n" N/ G9 W
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 z4 r1 c, B2 y3 T" ^9 C6 \$ z' L
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    ! C# ^% C5 e& C6 X# Q0 g( D
    3 ^! m4 Y: E# x: }
    4 U+ b8 k* E5 U3 x+ B
    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-6-15 20:43 , Processed in 0.861613 second(s), 50 queries .

    回顶部