QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2012|回复: 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。
    . k; w6 H5 z" g2 H/ a  D: S& C* |- b& o
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    % j8 H- B! L' N$ H  u* Q7 _/ T! W当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    5 g# Q3 O/ R6 h9 I8 j) w数据变换的目的:1 n* I! z' A4 f$ o) P& {
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。+ b9 g7 W4 f4 S9 Z  t. t& G
    6 j$ y) G6 ~. P5 O7 I7 F
    定义 : 设有n个数据的序列  ,则称映射  a; H8 l# S, b9 I3 T
    / {& A# E! L4 Y+ u: Q
                                           
    ; j7 ?, _3 u; ^! R
    1 u: [0 J  p/ C" ]# ?          为序列 x到序列 y 的数据变换。 $ V" p2 P# y( p( x6 r
    2 B1 o' h6 F$ ~* v0 G7 y& j
    数据变换的七种常见方式" N; U& J5 ~4 u2 H% q3 e
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    1 C  S9 S( a3 s. C$ U) r/ c  e9 M1 X/ f. Y; R
    初值化变换: @. A$ x' W; s% }

    1 E/ J- S$ t7 [4 B
    5 x- C' ]2 ]  i; T1 ]8 j4 P 也就是要对每一个数据,都除以第一个数据。* Z5 ~7 E1 \% q$ B$ @
    8 d  d, `2 `8 y
    均值化变换; i0 k% I6 `+ L3 \
    2 r. `( v8 T* b# i

    7 M. I0 N/ t6 \             对每一个数据,都除以均值。( \" Q0 O. p- Z' h4 W

      u* M# J! [( Z  \百分比变换
    2 b! o  n& \. S$ M+ n! E* n+ K, K$ o
    # t% I) p1 a1 c! W# ?# g
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。! `" R# N& _$ [5 l& z
    9 Q6 B% V3 F1 X8 O2 J9 l3 _+ y
    倍数变换
    : R$ s& q8 o. j# W- E   
    8 R) Q  l% n$ i; }9 Y  R0 ?2 {; E1 L8 s
    归一化变换, c+ t3 c. m, R5 Q7 X8 q6 J( }
      {9 M& }" C' Z' b: W3 h

    $ ?* h( w) b" b9 k- x 其中   为大于零的某个值,称  是归一化变换。
    : D1 c7 r3 p* B1 L$ U8 r
    2 N1 I$ n! c2 x) W3 T/ E& i! R+ D8 }+ {3 J1 ^
    极差最大值化变换: Y% B; A) ^) U; G, y- o+ u9 i
    + ^& R5 ]+ Z* d9 b0 }: z
      R4 y) D2 J8 C5 U6 @( E
    8 u% T. G! {) M

    8 H4 w8 J6 ?* p区间值化变换
    4 O% V) e8 V6 i4 A- U0 r, F) b7 F$ f% m# a
    0 b4 _# S$ E* N  g/ `
                      ,/ N- R9 V3 P; a
    & J. o9 v7 ?; ~2 [
    1. matlab 的mapminmax归一化函数
    ) H/ e" D- \8 @" v4 W# {: `9 P函数用法:/ W7 w- y" Y/ `( \4 ^1 d
    [Xn,Xps]=mapminmax(X,min,max)
    4 V8 F' R. `6 K4 j3 i- n# ^" K
    ; i; i0 _0 N$ f" z说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。: ]. L) y# q) ^2 S% G# o
    ( u" @0 R0 C, f) b) x
       (2)min,max规定X的归一化范围,根据需要自行设置, D; ]' H# q2 h; f* q3 t, h

    : a/ ~7 c4 t; d) H) t( o   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    # j  c, Z. g# O' g
    & [, Z; @! y. r7 @2 K2 Z/ H* Q 调用方法:3 o% k& q8 ?/ y+ P% C
    $ X3 B! y* \! {6 I
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化$ U# K4 }$ o" e3 k, Z" X+ H
    0 L9 H; ?( l! |6 q
    X2=mapminmax('reverse',Xn, Xps);%反归一化
    # j8 j# I$ I1 f1 y' `- r# j6 r: J8 _- G! n- H2 L  r
    x=[1,-1,2;   2,0,0;   0,1,-1]
    " u7 T" s- r. X8 m& z[x1,Xps]=mapminmax(x,0,1)
    % r3 c+ \: B4 ~% w1 Y. t
    1 E0 n3 y& n) l. Q9 I" @- w$ }, G8 j& Y, d4 [  E* I
    5 {: p2 D/ k$ E  L4 H( L" o! {: F6 ?0 ?
    对于python中的axis=0 和axis=1的问题8 @: [- X2 o1 r) J
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)2 M% J) K4 p# l# u8 u3 t$ C! {
    换句话说:
    . q' Z4 B1 q  u+ [% I' L' u
    * T! _) y. _0 M: a1 l  Q) u使用0值表示沿着每一列或行标签\索引值向下执行方法+ L0 X7 j' x$ Z: M, ?, t0 m7 Y: R
    使用1值表示沿着每一行或者列标签模向执行对应的方法4 K% I4 @7 C/ r8 C) {
      @/ A3 D' ]% `# N' L& `
    + C8 ?- N& V6 s% Q# w/ z4 R7 k

    " l0 \# ~$ d" N  n- G+ cpython的sklearn中 scale函数4 P; }- v( e, P
    1 标准化,均值去除和按方差比例缩放
    8 L8 G6 {0 }( j) q& [              (Standardization, or mean removal and variance scaling)+ w1 Y- d5 ]) q4 h- ~5 O

    3 C6 V. O9 ^; V6 U& z  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    7 m: C  f/ }8 u4 I, ~
    $ b/ y' H' j3 Z( l( mfrom sklearn import preprocessing
    9 R6 @. o' j: b! \1 ~  _import numpy as np  / v6 M  O& Q) B7 Q9 |0 B: F/ Y
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    . ~2 g7 y' a" d" j& wX_scaled = preprocessing.scale(X) # l9 l% [+ u- L
    3 u3 b8 P- p- s* `
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    9 l/ ?. O: \$ f+ D" u+ J                                  [ 1.22474487  0.         -0.26726124]0 ~6 T, O- I8 l$ Y; E+ f
                                     [-1.22474487  1.22474487 -1.06904497]]
    6 u# S, w" L: V8 C! O: v0 t  n#scaled之后的数据列为零均值,单位方差1 Q( Y& Z6 W" k, n( k, z4 Q
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    : @# C& R; N, K. H* @7 wX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    " x( f- J% b5 _9 c6 _6 S, i
    4 ]9 B+ w  g: O- R
    + F  \5 r% d  y3 Y3 V6 \" \* a7 M
    ( e$ t/ ]  J9 Z8 tStandardScaler ' ]* N( \+ A- Y; C# y- F
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 a" {6 l+ r& e5 o! {, b

      B1 C' A7 s' }' Z7 Sfrom sklearn.preprocessing import StandardScaler9 I: s( @3 q& Y( z7 ~! m
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]! G  ?# J$ r- w0 M. K$ ~
    X_scaler = StandardScaler()) v; r4 K. \& x: `# C
    X_train = X_scaler.fit_transform(x)8 ^+ x8 O; C8 l+ `; O4 ?" R; ^
    X_train1 Z: k) N3 R6 l" y
    #结果如下# k: }( n0 T0 S1 a9 f
    array([[-1.2817325 , -1.34164079],; w5 \8 g. I& b' ^: k/ C1 l
           [ 1.48440157, -0.4472136 ],+ G. G$ |/ H! [/ U: o% G
           [-0.35938143,  0.4472136 ],
    : F( u- b% u8 @/ g8 z       [ 0.15671236,  1.34164079]])' {, A' e+ W0 S8 R' {9 \! L$ c
    ; K5 U) E" E3 F3 G& Z5 N( N. T3 l1 V

    ' x; {5 q  M; l4 ~
    ) n  U$ @% z) c( E, L! U+ E$ I

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。( c7 J* l; ]3 r/ A# o4 _9 M, g
    from sklearn.preprocessing import StandardScaler
    3 b8 V$ `6 r1 v6 _* Nx=[[10001,2],[16020,4],[12008,6],[13131,8]]  W) P2 f0 ?6 o; D' T* E1 ~, m
    X_scaler = StandardScaler()8 @* G- `, P$ H8 n- \1 Z# p
    X_train = X_scaler.fit_transform(x)( q- C# W, Z9 u3 Y  b' Q3 K
    X_train
    . u, h7 W7 _% i3 V, [0 i#结果如下
    & ?  M% B: o* }1 N0 X/ warray([[-1.2817325 , -1.34164079],
    ) _. p2 Z& z; p7 P" W7 L       [ 1.48440157, -0.4472136 ],) p1 A) T2 G- T6 K' b4 C
           [-0.35938143,  0.4472136 ],: K) K. s2 x5 L8 k4 O9 p1 \2 u
           [ 0.15671236,  1.34164079]])
      `$ p* p7 K0 f) u
    6 F  W8 |$ Z, G1 {scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    2 {' D3 q8 h9 l# H- f  Jscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  : g7 w! m: l% W4 |4 u+ b
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    , e/ J* y; G8 e+ F) x#测试将该scaler用于输入数据,变换之后得到的结果同上  B6 N! _. K3 N& S- `2 Z! X. k
    scaler.transform(X)
    : Q$ M8 B3 J# }; ~#out:
    ' t4 Z0 t; Y1 T; X; b5 q' zarray([[ 0., -1.22474487,  1.33630621],
    ' z( S3 R5 w% U5 W8 v* ?) G4 G; U       [ 1.22474487, 0. , -0.26726124],
    0 y2 f0 Z6 Z8 D4 b+ K! q: R       [-1.22474487,1.22474487, -1.06904497]])  * I# P, w, U6 P* R4 e4 T0 B$ H
    scaler.transform([[-1., 1., 0.]])  #scale the new data2 K7 W$ q$ \3 O; ]% ~
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])) O9 B6 x) o9 e' v: N* D
    ) [! K8 v% S0 c( K6 Y* h
    2 将数据特征缩放至某一范围(scalingfeatures to a range)9 g6 ^. D" P# u+ N

    0 l& j! X, a7 q  s8 {; |

    / [! a- L) F; N  J( P9 `# y) x2.1 MinMaxScaler (最小最大值标准化)5 G1 ?5 F4 Y! v+ c  N" M' o
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    7 c# V# T, r8 k. g& g, v) [; ~: o& n" U
    from sklearn.preprocessing import MinMaxScaler+ ?: ~: {5 T1 T$ t/ C
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]8 C6 x* ^/ n0 ?
    min_max_scaler = MinMaxScaler()
    ! A. O" d- J9 I! b- u: v4 F# XX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    " t0 W" u  U( p7 n3 i- ~' |4 N5 i* {( w; b3 l
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))6 f! S  u$ v: W: H3 z
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    : z1 y( m( i* }0 s( J3 |  L8 F* \( j. F+ V* p$ `, f
    MinMaxScaler的实现
    8 O% Y  S% W- {1 S8 mX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))  O1 f; ]; W. p" u* }. U
    X_scaled = X_std / (max - min) + min
    3 n9 D" E$ a5 b% P' m6 S0 a! u. R: b" T" M/ @
    这是 向量化的表达方式,说明X是矩阵,其中. N+ `( \, q# s! Y' [: K- {- k3 x

    ) P2 K0 x/ U( |  g( SX_std:将X归一化到[0,1]之间
    1 @) W' @9 z4 l- yX.min(axis=0)表示列最小值7 X2 R* @+ Q% [
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    ( a, }  p  i0 N+ e
    . H5 r$ A5 T* x! T6 t; \' _0 P6 t, S; W% ]
    2.2 MaxAbsScaler(绝对值最大标准化)6 t( r1 Z; }* r: C0 E
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    7 x1 z3 {; n; M# |( E; e3 u+ R$ {2 {9 R2 E
    X_train = np.array([[ 1., -1.,  2.],+ C7 r, l7 C$ n. z, s& x* G/ y
                         [ 2.,  0.,  0.],
    3 T' E6 R1 y* Z1 O: F/ T/ f                    [ 0.,  1., -1.]])
    / Z5 V$ k1 }, n7 {; q+ Rmax_abs_scaler = preprocessing.MaxAbsScaler()& s) V% e! J( F- E
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    6 T& o& P! e" b5 c# C# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])6 S- L: }! v4 W, k. j! k+ X4 L
    X_test = np.array([[ -3., -1.,  4.]])
    9 @3 z( ^. A% M4 j- fX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])+ q/ G& T. x( B7 K, I/ J2 M
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    " J( Q/ @% ^- `% n+ J1 H3 F
    ( x) k  n' V6 T3 o( ?2 o$ g
    4 a4 v. P- P) @, J
    ( a& F; N: R# _: A! s4 u2 Q9 R/ F7 @0 g6 ~1 o

    8 @2 p+ B+ H( l2 r. _6 \* [& f3 T+ P- _- p

    4 r' H* C9 z* y! b5 q- P  I
    & n, c, Q6 y( Q# g9 g
    / V. O/ L8 v! G* Q9 F% F  o9 L) r
    1 G: C  x- p/ P. R) V9 ]) q————————————————: l/ ?7 @( |; D) D
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% L! _# n( c  |
    原文链接:https://blog.csdn.net/qq_29831163/article/details/894202233 g1 s; x. x8 n8 J% X) Y
    5 L: Z. i, [! t8 j

    . J& A8 R* |( r
    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-7-29 08:23 , Processed in 0.384971 second(s), 51 queries .

    回顶部