QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1961|回复: 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。& Y+ P0 Q# J% j% B( c. M+ z
    : U9 E6 a0 x! P
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    5 `) {) A. C( k/ q3 P当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    6 T- ~  v* H$ F3 {: W! X3 o数据变换的目的:# t* \! X0 P8 R7 h, s! u
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。. ^- U' o: ^  O% {

    ( i: ~% U: Y% S  ~+ ] 定义 : 设有n个数据的序列  ,则称映射
      B# i6 v+ r7 _" M. ]
    1 e, X% W0 c4 A& w- G$ ?/ T5 }4 h                                       
    3 l" j- K* d- C! @5 `( G
    . a3 K) f. m" b1 g5 c. O* c0 p          为序列 x到序列 y 的数据变换。 / W% s; G/ L; ]+ ~1 ~& E- m9 \
    , P- S% }; W' h
    数据变换的七种常见方式
    9 p- _! |- Q2 E/ i5 S此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    . y, w* K& E' k$ B5 h3 i7 N4 f( G0 b8 V) E4 A
    初值化变换# r3 Q9 N# A1 l' i
    9 V8 U/ V+ `* O7 k( a, D; V6 r
    + D( L- R, C* C! F* B: }  D
    也就是要对每一个数据,都除以第一个数据。4 ^8 Z3 o% e7 N- m2 B( Y
    ; D! i& w( F" K2 x6 u) t- _- Y. |
    均值化变换# v0 z9 m1 c1 b/ [3 o/ B( E

    % r- ]' N* g7 V& e( M3 q5 a! {. c! y- h5 G$ ]5 O5 n9 y: ^
                 对每一个数据,都除以均值。
    ' r. e1 _4 H3 N6 L5 P- W
    # Q' n7 O. n. w  v! f百分比变换1 w0 O1 b: C& W9 z% W

    / }6 }: r0 j+ g2 V( C- P  h9 p6 v; N: m. i$ E
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    : W4 C( i" A" i# A! r# f) H
    & o- J! O- t1 u9 X2 `6 _& ~倍数变换; M1 H9 `. T" t5 b. p" F( p  J) ^
       
    % [" A& P4 X: B5 `/ E1 D' |* B6 ?* j: G
    归一化变换
    1 Q6 E% {1 Z1 p" |8 E! r/ h$ l
    1 u7 C$ R$ _. Z, w* E8 E3 X5 U2 ^7 e; p' j- a6 n5 m
    其中   为大于零的某个值,称  是归一化变换。
    ' ]& x# U, a0 A1 S/ j9 C* a
    ' E( Z& v8 `: b4 m& C3 E6 {) D5 ]' z6 J7 O' J( T3 U" j: p3 f
    极差最大值化变换
    ) q1 Z  Z! v/ @" U) p, b8 i0 ?$ A, |; [8 d, d
    ) {  {1 R. Z# T0 \: k0 ~- W

    : |4 g# n! ^8 W3 x+ }( _$ z
    8 r5 |  \- F( E区间值化变换
    , R/ P( c/ i1 c- W$ ^! o" l+ {/ X0 E8 h. i( L7 P$ B7 x

    % D. D0 J$ t* v( a                  ,# W# P# p* @; e! F# t2 @
    6 q3 U2 i, g6 X$ f% A4 a7 M
    1. matlab 的mapminmax归一化函数4 `! i7 N! B: H9 y! W8 X
    函数用法:5 Z! @4 `% i0 r+ o# R/ Z% d" @# R( K
    [Xn,Xps]=mapminmax(X,min,max)
      j1 m# J; W% M- j0 ~3 _5 }* z! b9 a( e8 V4 N7 J+ Q! r
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。+ p3 }- z5 |$ Y9 z

    $ X# u( z( ]1 b" P! ]$ r; l   (2)min,max规定X的归一化范围,根据需要自行设置
    , T- s. `) k) g" d6 j
    3 _. n! @6 F* n# W1 d   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     6 ^  Q% J; a, ]( Z/ f3 \

    & S4 W- \; r/ b$ o) a% J  ` 调用方法:8 f$ [0 p+ s' g- v/ Z) b
    $ e! i( g# F) p9 \0 ~5 U9 }  R' T
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    - R6 F3 S- ?2 `
    8 L1 ~3 I% q/ j( wX2=mapminmax('reverse',Xn, Xps);%反归一化1 k0 e1 b% Y! Z, j
    . X" V) }8 w& Y- U$ v
    x=[1,-1,2;   2,0,0;   0,1,-1]
    ) |) t( c: m% `2 j- W: w# u, c[x1,Xps]=mapminmax(x,0,1)
    ' t" \  ~: @" b6 |4 F8 k0 E  K  y
    # }; S, ?% g+ ]: l- N6 X
    6 P( [' N! {$ \& {2 M  W
    2 N9 ~6 H8 G( F9 d6 a0 S; H对于python中的axis=0 和axis=1的问题
    7 \3 c( f. \. C( v' i5 ] 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    ; v6 r; h: G% Y( N( D6 E换句话说:
    ; T& L3 r/ j" O' }4 g9 ~$ j
    * \3 U2 k& Z. F( q" o+ x1 Z9 X2 J' R% O, g使用0值表示沿着每一列或行标签\索引值向下执行方法' U  X& f3 Q0 j
    使用1值表示沿着每一行或者列标签模向执行对应的方法6 Y; S5 `+ H& b- E

    ' ^( W: _! x! c* X3 e' R
    0 T3 s! @( X5 \$ h: e' ?9 U8 N8 x+ q' G: \
    python的sklearn中 scale函数% v8 [2 t5 |. f9 ?
    1 标准化,均值去除和按方差比例缩放( h0 L- v7 N8 a7 m
                  (Standardization, or mean removal and variance scaling)* r/ `) I4 f2 ?' P0 |& `5 R7 C  h
    / F; k+ G( C) r. D! S- j
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。7 W- J! Q* `" W9 {9 {. A

    & \6 {. {+ M& |; d5 Zfrom sklearn import preprocessing
    7 `/ [2 v7 }; p5 Dimport numpy as np  
    + G" g" N* h/ Z. LX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  ( `9 V% V) F5 ~% o8 M% j6 l3 W
    X_scaled = preprocessing.scale(X)
    2 P+ \: F1 J# P2 k( }3 R
    - b4 `* s' c- b( b$ `#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    ! g, B) k) B* ?                                  [ 1.22474487  0.         -0.26726124]; L  |, ^9 Z  A% H, a
                                     [-1.22474487  1.22474487 -1.06904497]]
    8 p: U9 y( g$ N2 ]; k#scaled之后的数据列为零均值,单位方差
    9 _8 u5 m9 X5 Q  m; j; }3 K- s; r# fX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    ) }8 ^$ H8 ]. Q9 A% y* n5 vX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
      y5 T& e" N' c( Y8 I& M# ]$ v6 g3 n% a) I1 q! `7 `! e
    6 }. }/ K, {3 _

    1 [" h% H/ }; mStandardScaler
    ; q& |! r& W! K" h; IStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)& f; U8 i: n  b( x# {) J' m* N
    ; a9 Z7 n, H9 Q# Y% t( g5 G
    from sklearn.preprocessing import StandardScaler3 P! A2 H" o3 D6 _2 M5 G
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
      w8 U% t$ o, d' d2 L  L, P& ?- RX_scaler = StandardScaler()
    7 h  v1 d/ h- p) l. ~5 nX_train = X_scaler.fit_transform(x)
    " _. @" Z# q* J# b8 q( ?X_train
    ( V* s$ J, K$ B) [8 W# H( \#结果如下! a- f/ r( D( v4 O
    array([[-1.2817325 , -1.34164079],
    - _0 V& T, L: w% v       [ 1.48440157, -0.4472136 ],# V. g, g7 l" S9 p  r7 F' E
           [-0.35938143,  0.4472136 ],' b; A8 M& \! M
           [ 0.15671236,  1.34164079]])
    % Z- t- n4 ^  _  q/ I
    - q7 m! P; L6 E% [; v. P% n' s9 {# q
    $ C; @- ]2 D( p$ c
    # y+ M8 i4 R3 [3 |

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。2 P6 u7 H% e9 z* K& Z
    from sklearn.preprocessing import StandardScaler
      B6 s, a2 N. ^x=[[10001,2],[16020,4],[12008,6],[13131,8]]( i* ~% m& w( B$ A7 _( q
    X_scaler = StandardScaler()
    / j/ ~( G. g' P3 m) T* K* P9 wX_train = X_scaler.fit_transform(x)& y6 m$ F% V% t. q) I
    X_train
    : b+ j! p; V) G) v; t#结果如下5 p7 M4 o8 Y3 S/ Y* s. U
    array([[-1.2817325 , -1.34164079],
      Y8 e- K: f- S) O       [ 1.48440157, -0.4472136 ],1 f4 I  e( D9 O1 w9 \
           [-0.35938143,  0.4472136 ],6 _) D% e2 @$ F: m, U
           [ 0.15671236,  1.34164079]])
    # D9 l$ y! {: x, {+ s% ?# _, E! c, [
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)8 B' V. ^# M& x/ ^( {
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
    % P# B  \% U9 escaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    * z2 ?2 O: ^& t. B#测试将该scaler用于输入数据,变换之后得到的结果同上7 p- c( w# `" t( B  b/ p6 _) }
    scaler.transform(X) ) C- Z: \1 \& L  V7 d( A
    #out: 7 g/ G* p  v: P+ A: k1 @
    array([[ 0., -1.22474487,  1.33630621],
    6 u: }9 z/ E8 |' T$ d" [* L' ^3 a       [ 1.22474487, 0. , -0.26726124], 3 i$ X& P3 L: X9 G5 W
           [-1.22474487,1.22474487, -1.06904497]])  
    8 n6 Y8 l* a* g7 F7 e/ Tscaler.transform([[-1., 1., 0.]])  #scale the new data
    4 h4 }3 n# c+ T, H  b) [# out: array([[-2.44948974,  1.22474487, -0.26726124]])* p$ {  ~! |' C& Q2 Y- s. `. j# d/ J
    : @6 B4 Q, S8 }* N  `$ b
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    4 {6 M' j! H5 [! b
    ( f  S# C0 A& C" W
    8 o  M( N. O$ |9 D2 e* a3 w
    2.1 MinMaxScaler (最小最大值标准化). L1 o  P! @0 k; X( @8 y
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    $ r. J0 _% a7 k* E4 f' @7 H3 A8 S3 W0 @+ w7 P- \
    from sklearn.preprocessing import MinMaxScaler
    + H  A! A% `3 @! Vx=[[10001,2],[16020,4],[12008,6],[13131,8]]: F" \, c. X" [8 c6 L
    min_max_scaler = MinMaxScaler()
    # d! ^/ }$ j; o  V6 g' LX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,4 s2 ^  Q$ s8 b& n. U) |

    9 z7 k' r# x. Y; k4 k" Hmin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    ; q3 b# g) V7 j" d2 H5 BX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    $ O5 W  \0 A8 P. ?# ~3 I/ L9 P* {
    MinMaxScaler的实现
    " |. w; r5 K, T% x& U4 J& Y8 tX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    1 j* c7 @6 g: y; t) bX_scaled = X_std / (max - min) + min
    , p# \' q5 V) _" E; T7 i" w- f/ y. Z  U
    这是 向量化的表达方式,说明X是矩阵,其中, u! n- ]. l* _* l7 D
    5 `! q) ]- K2 _. P
    X_std:将X归一化到[0,1]之间
    0 r7 W2 M- i/ DX.min(axis=0)表示列最小值0 _* t0 [" R4 \1 X  y" b1 O
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围: _: d4 x; n" f% b/ M0 F, L# r! o
    " M9 D9 l" U& N

    ( E  b% ]) A3 H9 z* ?2.2 MaxAbsScaler(绝对值最大标准化)5 \4 O- ]& ^3 J
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。7 l' m/ c. z2 j  O
    % N3 O( S$ X" v" |. ?1 T7 i6 @
    X_train = np.array([[ 1., -1.,  2.],% k& I8 |8 g, p9 w4 `
                         [ 2.,  0.,  0.],
    2 {+ e0 p, w# J                    [ 0.,  1., -1.]])
    " F/ C/ v' k- smax_abs_scaler = preprocessing.MaxAbsScaler()1 T- M% r. m* }" i8 E
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    $ R8 N; S+ s: x" \9 Y) L# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    # p/ F$ E: Z$ C$ N+ k4 g* QX_test = np.array([[ -3., -1.,  4.]])
    ) p, S& `2 K' ~4 Q$ zX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])2 o5 _3 s7 x" `6 I' |2 q
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])" I/ `. T7 U: J

    # _2 d+ V6 ?' e" j
    % \* Z9 R( n% z1 J, T7 h$ x8 d- z% B+ }6 G/ h
    . x  N+ R8 B1 A- L
    ) M* E" E/ O- z8 J* w

    ! u! {2 ]0 a. f+ p/ H, `) I
    7 m/ R: S! X. `" ^( D  X
    ! g. K. g. q+ }' Z0 x* z; n3 U
    " l3 e, I* w' I: v( H0 C( p+ y9 D  s
    ————————————————8 `( U" v* J9 R
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; [  j+ M; S0 p8 f. Z% e/ \原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223. C9 t6 R4 H6 O/ b, h. @

    ' F, ~# W* y! L) E0 n
    7 [: T  s1 v3 o4 q/ W, V
    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-13 12:32 , Processed in 0.403105 second(s), 51 queries .

    回顶部