QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1989|回复: 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。
    $ w' o9 B2 l+ L6 G8 ^9 A* t6 _, M7 ^4 O/ `' c
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler% f* N: G; N' `1 l+ v/ X
    当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler( `) [  s7 }( @! o! M
    数据变换的目的:
    ) k3 a; h& V8 a  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。( @7 _+ \1 e; ^& N

    6 Z3 x! o& u7 `. k 定义 : 设有n个数据的序列  ,则称映射
    * M! r0 [$ J( Y7 z/ |& N! ~
    7 {* O5 j( y$ F: y& R                                        6 r7 J0 C7 j1 u, i! J7 T9 v
    1 w* @# T8 t$ f
              为序列 x到序列 y 的数据变换。
    4 _4 `2 U' T" }, Z! Q9 c% Y2 U7 U) z
    数据变换的七种常见方式  Z8 u: D4 y( V' m
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。! i2 C; k8 j; z

    $ k. _+ t5 B4 \3 `: ^初值化变换
    / u8 h% p$ |: ]1 }5 B+ v$ s7 i
    : U  K4 w! n+ @/ J1 W
    6 I0 P9 a" e  [ 也就是要对每一个数据,都除以第一个数据。( G; s: ~1 j% D8 g
    + `( ]1 O3 o7 M6 }8 S
    均值化变换+ P0 ~+ z8 W7 q) J, D7 e2 r, m% Y. J

    4 c4 |; s6 Q" N7 U: T% a+ W& F, O3 x) n" V, J
                 对每一个数据,都除以均值。
    7 U5 t! x0 P# ^' U; f
    - t2 m5 e) }* _4 a! d百分比变换
    . X3 P+ g' w' O5 D7 `5 `; h% g$ z" h5 y# _5 G
    3 l6 O; e3 \/ E  {  T. ^1 s
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。: i: G# }) k# p, N
    / ?5 c+ l/ P. V7 x; i
    倍数变换" K& f2 R4 @* Q9 Z% J* _: q
       
      L2 E: ?6 K) P- Q' l9 r  }: u) Z9 P2 d" b# j- F
    归一化变换
    8 `. s" D1 [  |& t' S. L
    5 H) i7 m; Z7 H+ G2 G
    , W) |$ l0 v& i 其中   为大于零的某个值,称  是归一化变换。 0 w+ c- V' z! ]9 N- [- `1 s/ E1 w
    3 E1 a& [, D9 D7 @& l; w% R, j

    # R4 r% y( `3 ~5 B极差最大值化变换
    ) B. z& }* W6 Y$ l* `. L
    ( t4 ^1 H' t/ {. m9 l
    " ]$ m8 x/ P0 n2 v7 X
    1 f/ m2 e& N2 p7 }5 j
    0 w2 u* Q3 @" B& E区间值化变换
    $ e; `5 A7 `" `& @
    8 Y) n. V# q  N7 |2 r5 ~* Y2 D  Y4 s
                      ,
    & G/ J6 g! ?. A+ }
    2 f; t* Q5 D* i1. matlab 的mapminmax归一化函数
    6 G5 H6 E4 {3 N8 R4 q函数用法:  `# U8 Y3 D" r. c4 e9 P, [
    [Xn,Xps]=mapminmax(X,min,max)& J# Z+ }- F: f; E, n

    $ a5 T3 Q4 G  o. ]9 O说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    0 _3 I3 E" t% E8 ~  F3 E' x+ T* C1 j1 b9 C4 d
       (2)min,max规定X的归一化范围,根据需要自行设置
    9 b+ }1 {$ S; i! k1 ]
    * M% L3 [% d( u# W6 s9 W! x   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    2 ?& I3 U+ R3 y2 {, ]- Q) e& @
    , q. _4 E) k2 h4 U- e! }% R! C8 u 调用方法:
    . T$ h1 b1 a/ S! ?9 w+ w# G3 x% c# e) ?
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    & R( ?& q. o6 g  g& ^
    , {0 O) ?% ?- P- t: Y( [/ G) ^$ FX2=mapminmax('reverse',Xn, Xps);%反归一化! D! s- \! }4 j1 d- \/ I
    7 F, T* X4 j3 G# _6 l
    x=[1,-1,2;   2,0,0;   0,1,-1]& h' T$ o- I- m3 k( a* V
    [x1,Xps]=mapminmax(x,0,1)2 }! O9 e. z) @  V6 s+ d
    & e. X3 z0 t( X; w9 L! y% g$ u! {
    6 f* M% W4 h" B8 C

    ' ?+ K0 X1 L1 }$ i7 C- i对于python中的axis=0 和axis=1的问题
    ; ^1 Z! \: n# b 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    ! g, \5 C1 G$ M" B- [/ K3 s换句话说:, ^$ a  h( t* ?
    6 D$ _/ E: N8 N$ m, H  F7 m
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    $ L9 R/ Y; d8 J5 n' H1 ~$ C使用1值表示沿着每一行或者列标签模向执行对应的方法
    # q" W( z) I$ k/ A- o* e' O9 `% m1 N2 q' [! \4 v, P+ a4 Q
    9 e! C6 n: K( R
    / G& Z9 Q$ L" n+ ?1 C3 h* a( V
    python的sklearn中 scale函数
    9 Q; a: g7 {2 O1 标准化,均值去除和按方差比例缩放
    % m- m. `& q- ?5 b8 T( R% h              (Standardization, or mean removal and variance scaling)
    & r" u) M# D. I# J; g8 v6 _: _9 _, H+ p" T" H: M6 h7 o
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。/ c3 \4 x0 Y4 Y9 K+ p" H5 a2 O

    : P! `- y  _* n  yfrom sklearn import preprocessing
    7 P; }% \: ~1 `4 h  U5 v+ }import numpy as np  ; @/ ~, k. k. k+ a0 U8 T
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    % b& Z7 Z2 P; B5 e5 u  p6 \* DX_scaled = preprocessing.scale(X)
    6 G$ H( y& {  y* U& M$ @- W  n0 I
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]) d) }) r6 U# q0 x. {0 h
                                     [ 1.22474487  0.         -0.26726124]! m# f/ V/ U: o
                                     [-1.22474487  1.22474487 -1.06904497]]
    2 B4 ~* I2 w0 b+ N7 |- O#scaled之后的数据列为零均值,单位方差
    ) L' ~1 m7 T7 ~8 GX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  ( I* a+ O1 S; P0 m9 \
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    - B$ h# k' W7 {! {6 p# ~, g* V7 |/ M9 g) M: v

    + E; q- N" x0 |0 H6 Y3 A. _# N+ r( J; i! E7 ]& ~# F
    StandardScaler
    & K& N1 ]( ], W: ~# [Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    1 e5 f, a2 ?( x- k* _( ^/ w+ q) K5 W2 d- u# o
    from sklearn.preprocessing import StandardScaler1 L, o3 Y; a, [
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    4 E1 Z/ V( v+ P4 W: _' zX_scaler = StandardScaler()
    ' d1 u) y7 o# r( H, m3 FX_train = X_scaler.fit_transform(x)
    7 }4 W/ b. x; X2 HX_train4 @4 g$ V3 c% f6 o1 `& |
    #结果如下; s6 ^% j: e8 v6 A; m& A% n( _
    array([[-1.2817325 , -1.34164079],- B( L3 h4 ~* ?  `1 N$ R9 A  q2 W
           [ 1.48440157, -0.4472136 ],
    : x9 B& }0 f) z: I       [-0.35938143,  0.4472136 ],' G7 S, ?/ E; i- ~4 a+ a
           [ 0.15671236,  1.34164079]])8 Z  ?; V0 P. q- Z$ e) F. c
    8 n5 o0 [; u" k* f2 m

    ' a. @! T- Z. y+ c6 S3 R* `7 [' P& E" ]$ U& R6 T* c, y

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。+ D* q5 r0 u. P6 f0 ~
    from sklearn.preprocessing import StandardScaler
    * B, y7 V  g2 A+ H& ~x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    / [( U* m6 ^8 ]* FX_scaler = StandardScaler()
    8 e/ m4 |$ `: d! b5 F0 _' H6 t0 UX_train = X_scaler.fit_transform(x)
      s6 k8 t5 g6 ^4 p- ^0 T/ @X_train
    4 A( T1 [* M; F# P8 [, q. s#结果如下
    # v2 @, @$ o! Z( A5 C' Harray([[-1.2817325 , -1.34164079],+ [4 W$ D9 X+ Y; @' d. p/ j
           [ 1.48440157, -0.4472136 ],
    1 Y) A3 u( a  M       [-0.35938143,  0.4472136 ],8 ]+ v9 ?+ s  q* A, i
           [ 0.15671236,  1.34164079]])
    4 @1 O6 Z* L7 n- M' \* _$ o( M7 M& S2 v& o7 w. d7 A/ z
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    2 ]- |$ h9 J6 Lscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  # M6 d6 Z3 [6 w# w, t; Z$ {
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    6 L) o" v4 s- }; O" C$ F1 B9 }' q% u#测试将该scaler用于输入数据,变换之后得到的结果同上1 C2 Y* |  O& n
    scaler.transform(X)
    / T1 O& v5 z3 l" i+ N: c#out:
    % y& v6 Z6 z% W9 A- Q6 [array([[ 0., -1.22474487,  1.33630621], 5 B* w1 G* x  m
           [ 1.22474487, 0. , -0.26726124],
    2 ], _' \: d3 k# F( \7 j8 a) l       [-1.22474487,1.22474487, -1.06904497]])  3 J* T# `, x  `* P5 Q3 f( C0 H8 `6 S
    scaler.transform([[-1., 1., 0.]])  #scale the new data9 \+ h4 h) ]- J
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])( g$ V4 ?1 ?  z4 I5 H* `1 Q( Q2 B2 {

    0 g9 V9 ?6 B  e( N) A) h9 ^7 M2 将数据特征缩放至某一范围(scalingfeatures to a range)5 t) @6 O% I, L9 G

    / |6 Y3 M- v; w/ i
    9 G8 e6 m0 C+ t; h0 o- x5 T) g# A
    2.1 MinMaxScaler (最小最大值标准化)
    3 a7 ^3 n. d0 p1 | 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  ; R, x/ @' |# H3 b
    0 P( I! Z2 ]4 N6 [0 O4 ~0 {
    from sklearn.preprocessing import MinMaxScaler
    / p* I1 W2 W) w$ N# fx=[[10001,2],[16020,4],[12008,6],[13131,8]]9 E3 C; B2 O6 w; {6 z! Z
    min_max_scaler = MinMaxScaler()+ ?/ A  o# H5 O% g6 l7 c# E5 h
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,9 I# u1 i- Q! j
    * r. E3 X0 \- y  k+ }9 r5 F9 B( o
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    " r  P( e7 N* C' T$ AX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    7 V  h- C0 L4 \! P! B, k3 S; s4 h  T$ h' X6 V
    MinMaxScaler的实现3 x6 ~! z# K( V# n. |
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))" Y) [8 Z7 R; M) Y1 U( [: |) E
    X_scaled = X_std / (max - min) + min
    * h- N, ~: x# E" L& K3 L5 x
    * e& Y& {6 Q6 c' X, T) `" k# A这是 向量化的表达方式,说明X是矩阵,其中
    * C' Z0 l/ F) l2 B8 Q" v7 W+ G( U7 F' J# {8 y
    X_std:将X归一化到[0,1]之间
    ' C0 M; ]7 i: J+ k) e1 [X.min(axis=0)表示列最小值
    / m# t2 @% p9 C- T  ]. Lmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围: S( ]* m4 E9 A( g$ p+ h

    , [5 ^; p/ K5 x' F; i# S
    2 q- [% Q; p, ]  P# l. t; V2.2 MaxAbsScaler(绝对值最大标准化): K! D8 n9 n5 T/ Q) ^
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。7 O9 C3 V4 a, H1 P  z' ^: L+ o- l
    . D1 N" y0 }& A' z' c9 j; `
    X_train = np.array([[ 1., -1.,  2.],% Q9 b/ n3 }+ c9 b# f4 T
                         [ 2.,  0.,  0.],& _; Z" v! k. I$ H
                        [ 0.,  1., -1.]])
    7 V3 z% `* N8 ~% R: wmax_abs_scaler = preprocessing.MaxAbsScaler()
    ! r% ^" b9 }5 ^) ~X_train_maxabs = max_abs_scaler.fit_transform(X_train)/ S! E4 P+ o# Y4 L9 f) {! X. e
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    " M! j) b+ B: D( u2 [X_test = np.array([[ -3., -1.,  4.]])
    * O9 u6 Z  Y+ O: n. Z. E( ?8 VX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    ( S' B9 @% k2 q  J  p* I8 Pmax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    $ a* j- V# c% |1 M
    ( W# J+ k* T; r8 N/ h. K: Y& ?# _" D0 f" F6 K4 g

    2 H: \- T3 x( Z
    0 b1 i9 v/ o& ?8 h2 ]; y) e: p% t2 Q
    , t. R6 I! D* T, _1 T4 g& ?( a5 H1 ]$ H
    4 h* C6 |/ d9 C; B/ N

    $ p: Y" m- G' C2 [4 ^+ S5 k& n! ~
    ; b* j& ]: X8 X& O, L, Z8 ?7 S
    ————————————————. C' n4 [( \7 i  P0 X5 O
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 E. a, i) ]: L8 J( `% J% e原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    & c4 g" n5 }  {: X3 e6 [
    & K% @* }( X* l% y$ s% P. _6 B2 s( l9 c  j
    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-11 03:52 , Processed in 0.448459 second(s), 51 queries .

    回顶部