QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1966|回复: 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。
    7 v3 p7 q+ Y& i* X; O! j- K8 T
    6 ]/ ?" P5 j* q5 v% X当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    8 n0 }  F3 A* ?1 V当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler$ A8 N" y$ ?1 V2 E. j
    数据变换的目的:6 s3 Z5 y$ U/ a9 x$ f0 g) j
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    0 f- S, ~2 D0 i1 d" u
    . y; E$ Q' J- r- V5 G3 d  N! o8 T 定义 : 设有n个数据的序列  ,则称映射
    9 U  N# X% c& d' B6 _
    - W9 A# @* A% h5 ^3 X                                        7 L/ w0 i" G5 E- F( U7 `& W. I4 d

    * i' p8 _1 Z$ h. u# d          为序列 x到序列 y 的数据变换。
    " E. b, m. ?  e2 x
    3 k& @+ h8 I4 l# k: j数据变换的七种常见方式" B  c/ x  N1 s( e* L
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    ( D* r; z5 `6 L! B4 g2 \) _
    ! _! L0 T0 x' z1 o初值化变换
    ) }( i' x4 c2 B  v3 s( ^
    8 |* z  Q0 H3 `& w( e0 N4 D! ~
    & {% m: S) K7 T8 H3 F 也就是要对每一个数据,都除以第一个数据。
    , Y# y" L3 B* v0 f( g! N' e3 m
    , E6 }  J* v$ B+ N8 `$ j均值化变换
    7 d. G3 g: V( D1 D3 J' i, [2 @. b) w$ q  ~# @. Z- O, [6 e6 l
    $ O: U: }, r( i6 z
                 对每一个数据,都除以均值。4 R# r* k4 C5 W, {  x6 ^% Q
    2 \  _" ^, L9 M3 t
    百分比变换
    ; }- ^& }9 y4 }4 T' N" o! `* J7 j
    ) e, T9 R1 [7 A( v9 v/ c& [0 f/ o; y+ K& M& H
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    $ E# E$ a, L2 B7 m
    8 r+ w! k1 P3 G8 N$ P' p倍数变换
    2 @: s0 `0 y6 q) M    " Q; z/ S& u0 B
    & v& U0 F+ M& n) e' Y7 D
    归一化变换
    ( g+ H* a2 L8 r* k( h
    # `: s' A' Y; U- a$ r; C/ |3 o, {4 E$ Y5 ]# O- C+ f
    其中   为大于零的某个值,称  是归一化变换。
    0 p- [: F; e- T  S5 Q
    6 d6 y" ]+ D2 z, V7 J; H* g5 i& P
    极差最大值化变换: p) L4 p, O; l  F4 r
      G! Z. h( g* ~% Y# ~

    * ~; f/ \& A( r1 J; t1 g8 B3 q' g, ?

    7 t, z! O1 L" w7 N" l区间值化变换, B$ m, i( v9 Z" e; Y- ~) }. P" E

    8 u7 ]! ?8 A! J- \$ p, D
    ) ]- [) r' z+ G  a$ e, |3 D* I: `                  ,
    - [3 j( Q! G( Y* y2 ~4 _9 U7 q$ h0 q7 g5 k. k4 s" w
    1. matlab 的mapminmax归一化函数7 f* a1 Z; y: s; u
    函数用法:
    ; Y. ~8 R" i7 ^5 `/ { [Xn,Xps]=mapminmax(X,min,max)7 x+ Y$ }2 T) G. p. I
    4 x  H* ?5 N$ p6 n/ o
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。$ ^8 d- \7 q: |* z& s- Q: b
    5 O" l  \0 V* \" D
       (2)min,max规定X的归一化范围,根据需要自行设置% G* C) @9 Y) b3 A
    + `" n( X5 [# L( T* Z
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    : y3 V. _4 H3 u' b+ D
    ( H2 }  B' {4 f9 O6 W2 u  |- y$ p. } 调用方法:$ ?4 E0 a- j0 K

    . s) G3 J; m- K) wX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    + a- y+ f" i# E! }. {" m: v0 h. F' `8 m5 f
    X2=mapminmax('reverse',Xn, Xps);%反归一化
    1 T7 ^5 G- |( b, o  h9 M8 ~& v9 z( a# e3 O, o, }3 F
    x=[1,-1,2;   2,0,0;   0,1,-1]
    ; F$ V/ ?: h( b0 \1 a8 |6 c[x1,Xps]=mapminmax(x,0,1)6 N3 n) L* s' C3 d% Z

    * S+ @0 U! D4 ?
    8 [% B$ ~1 e' R
    : r: s2 q# c% S* [7 P对于python中的axis=0 和axis=1的问题* O  m# v- y/ @; @6 K" [8 T
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    % @3 g7 T; f/ G- C0 C换句话说:
    . n- S7 V/ W. L0 P  `$ V
    8 V7 `" }& R. ]% ^/ Q使用0值表示沿着每一列或行标签\索引值向下执行方法9 W9 l0 Y3 R/ l$ l
    使用1值表示沿着每一行或者列标签模向执行对应的方法: a8 b& Z$ E, ]
    7 N+ M; Y+ ~/ l. H% e  Y) }
    . G: l* \( G+ }
    * b2 _4 S$ S* R" J
    python的sklearn中 scale函数
    8 X+ g4 L$ c0 g+ N7 W1 标准化,均值去除和按方差比例缩放
    - W) l% b1 W$ j) v6 U! Q2 i              (Standardization, or mean removal and variance scaling)1 h( |: J1 o5 U' {3 G( o4 |8 {
    8 R6 H8 ^7 a: T8 T/ s5 _
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。4 D" l9 @+ s8 P. n- _3 D, u

      B" T' U  V& Y" ~from sklearn import preprocessing " H7 c- R& R2 Y0 y; Y3 o) a
    import numpy as np  ( @/ ~% N" b, h
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    - t* B: `3 o$ G4 aX_scaled = preprocessing.scale(X)
    + E7 P  m, V  Y) o1 v; p% ~" r9 y, U1 m2 |) {! L; Z0 s' }
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]8 h% I/ G& T) ~; P
                                     [ 1.22474487  0.         -0.26726124]
    5 ?1 y1 y; F+ d. o( O$ |7 _                                  [-1.22474487  1.22474487 -1.06904497]]8 j$ d( z, o  X$ D1 n, n  B" b0 l# E
    #scaled之后的数据列为零均值,单位方差" p  J0 ~7 G( ]/ ]1 S% X1 z& b
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  7 V; G2 y! ^" Z
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])$ {* G: R( {8 ^4 z& Y/ N, O3 q

    . u. N! B0 C& Q& J0 W% r4 v% k4 I# e
    1 \) G- m6 h( d. [# Q% w: g- V3 M) f: Q4 I5 D$ ]: A  p: H  l1 t
    StandardScaler   C: S3 {: O8 p" i0 j+ _2 ~# H
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    1 X/ r! V2 W; o; d# Y5 F% a0 k* e  K+ @* C% {# Q* C
    from sklearn.preprocessing import StandardScaler
    4 w6 U2 L3 H. w; U  _, G* s8 yx=[[10001,2],[16020,4],[12008,6],[13131,8]]  b' Q7 T* F- F* Y% [& c
    X_scaler = StandardScaler()
    , L# F0 d3 I- ~7 g0 ~$ wX_train = X_scaler.fit_transform(x)% C, U# ~  B7 J% K
    X_train
    9 l" H1 y7 P2 J4 {#结果如下
    : d6 m) r. G0 rarray([[-1.2817325 , -1.34164079],, P4 @, R# W" P
           [ 1.48440157, -0.4472136 ],
    # g6 [. Z" X  W* e1 n       [-0.35938143,  0.4472136 ],4 \# w7 |% M- O( N
           [ 0.15671236,  1.34164079]])
    # S5 u( d# U- x7 i9 |
    ; R, B& S# V4 |9 g8 d/ H& ~8 h$ U
    ) ^; M- A  u7 b! I; x* T3 i+ L8 e1 ~+ h6 w" g- L- Y

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。2 G* m( k/ C7 L: }0 d% s
    from sklearn.preprocessing import StandardScaler
    ' i: U) u$ [" T# Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]6 a# ?' T  w5 [2 K
    X_scaler = StandardScaler()- o( p# v4 G9 S4 ~) A  \2 \
    X_train = X_scaler.fit_transform(x)
    ; T: Z# L5 L; e1 s' ?X_train
    / K( R; N2 O$ N1 o4 H( ~# n5 \#结果如下
    " p# M. L4 O' u  v3 _array([[-1.2817325 , -1.34164079],1 C. x5 k5 r5 b# d: u! r
           [ 1.48440157, -0.4472136 ],
    & F2 @$ i1 z, o8 d       [-0.35938143,  0.4472136 ],2 Y+ Q8 Y0 w' ^
           [ 0.15671236,  1.34164079]])
    ( p3 W& d1 L8 M" `" m. C) |
    ; L3 J/ n2 a7 q/ L/ @# Hscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    6 L2 ^! _" f6 Y+ z* ^scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  3 y9 w" ?6 H" ]
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    ; T6 h" u/ _/ W9 r# m2 V- b#测试将该scaler用于输入数据,变换之后得到的结果同上
    ! [1 d- G, Q) i( Lscaler.transform(X)
    / i/ \6 f9 d6 Q" t: s#out:
      {4 ~& T, p1 i  J2 y& v5 d' Tarray([[ 0., -1.22474487,  1.33630621], 5 L+ M  [$ P. o; W  s) t
           [ 1.22474487, 0. , -0.26726124],
    , p. j$ m- Q! \. I8 H, a$ m3 I       [-1.22474487,1.22474487, -1.06904497]])  * L/ r. W" }5 C7 x
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    9 k) v% i/ V4 P, c2 ]# o# out: array([[-2.44948974,  1.22474487, -0.26726124]])3 n& ]2 k- r8 i

      W8 F: a2 R+ r: j5 M! d# ^2 将数据特征缩放至某一范围(scalingfeatures to a range)
    8 w% i0 B( V; m; S
    + |5 }6 \- ~3 [! c, O
    - ^  T* R  i. m7 g6 _+ b7 Y: Z: f3 j
    2.1 MinMaxScaler (最小最大值标准化)( }% H  t) I4 m) U! h
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  ! U  w$ U1 P1 |8 n% `9 y
    / Y% Q# w4 H" x' Y: _5 Z  Z  @+ t
    from sklearn.preprocessing import MinMaxScaler. Q3 C$ p9 z+ m% h
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]9 @" I' z0 W9 u2 S5 A* I" w0 y. d3 z/ l
    min_max_scaler = MinMaxScaler()' n9 F, D3 V5 g9 f
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    : T9 A6 ~6 ^. y; n2 M& b/ ~
    " }' Q' Q) J# fmin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    " C- j& u0 t! T# m- fX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果  ~2 o8 n; R; e6 x! v% T, f  {8 E) ]
    * o5 y6 ~1 \- Q- e& ]
    MinMaxScaler的实现
    & I1 G+ E" S3 w$ E8 N( HX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))' @/ o) }( F: h0 v; v0 ~
    X_scaled = X_std / (max - min) + min7 a/ g. G. }1 _% l; n! F
    ' ]* J5 q- \) a' h1 S' k* n
    这是 向量化的表达方式,说明X是矩阵,其中+ _' C! k% _9 N, S6 f0 }% }1 l& a
    ! S4 h* H; ?4 s4 E0 J, {5 G
    X_std:将X归一化到[0,1]之间" X3 p) x1 p1 Y5 A' x
    X.min(axis=0)表示列最小值9 F$ s  q( N) S) ^1 E
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    0 j9 a& M) ]' r4 G
    , u7 S& X" ?+ l  Z
    . y: ^8 t  @' U/ W2.2 MaxAbsScaler(绝对值最大标准化)  |' ?" `# ~/ A' g
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    ; y" P' h9 y$ |, {' h9 a, r% Q
    ) f* C( K+ ]# \$ p  U3 y: a) N+ vX_train = np.array([[ 1., -1.,  2.],( g0 N, ^, H/ t9 t) Y
                         [ 2.,  0.,  0.],: e9 L5 L0 d; S5 n. J* e9 a0 r
                        [ 0.,  1., -1.]])
    : h  g' C, v% H5 _5 Nmax_abs_scaler = preprocessing.MaxAbsScaler()* g9 @/ V$ k7 k* t0 P% l5 L
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)" s! {: D- L8 X" a& ^
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])5 ~* U* k2 D$ x5 L; I' ^6 B: _
    X_test = np.array([[ -3., -1.,  4.]])* G! @* {4 ]/ w0 t2 ^) \4 J
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    + L+ d2 k! D5 o# n# X( M/ zmax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    ) T1 w6 `6 y8 ^/ q0 m* P6 E; _6 g5 }- A
    3 g5 E) N2 X8 W; d
    , ?! `- C3 I& W9 z% W& D) i
    : u6 f2 Z: o4 Z! l2 a

    ! u! s# m3 v' [; t; O' a9 U2 \3 g7 U2 N* c% {

    ' M' o% N- Y! h0 W1 Q+ O
    + m  i/ T' X: N$ ?4 H
    ' N6 E, |7 w& q2 S: c7 U. S) |$ ?) K) v: d" D* q
    ————————————————1 t/ L1 p# R/ S( }- x
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / X0 Z9 I4 {1 ^+ `8 ]! l, z原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    % Z7 Q4 Y/ Z# ~5 i6 U7 f7 i3 t3 c" d4 ~+ K( I0 q" K& i
    5 R$ i. u' h; W; 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-4-22 05:26 , Processed in 0.465657 second(s), 50 queries .

    回顶部