QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1926|回复: 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。
    ; r( f3 `; w, p0 a4 {8 G  X" h* U/ n6 r/ l1 F
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler0 I+ ^: y- H! J9 N
    当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler7 ]' X6 y3 I; p4 a" T
    数据变换的目的:- L# m+ d: k6 ^5 x. v# g+ Z' Z' c
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    9 k1 w# m# ^, W7 i" a9 e& T( B0 ~. `. s, r2 L, _6 _1 M
    定义 : 设有n个数据的序列  ,则称映射% i* d. [; ?5 j5 C9 t( |
    2 {0 ]/ k3 m" ]/ U. q8 x6 `
                                            6 A8 A+ O# L) F, v

    * M, P$ ?* x; [( @5 ~+ f9 h          为序列 x到序列 y 的数据变换。 0 f6 l6 D. ]) `2 N- u5 }- j
    3 T5 E& e1 U4 L! n
    数据变换的七种常见方式, v* b5 h  E# ^9 ^- q2 R
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。6 [7 K/ ^$ g( Y- e

    ; ^: [2 j% q! Z+ v0 L初值化变换4 M1 z  ]% i* c, Z
    & }# B$ \2 V& g, x

    3 m- ]6 k/ W6 p0 D  ] 也就是要对每一个数据,都除以第一个数据。
    2 O1 w9 U8 }! D6 ]/ K; _: u
    1 K: q7 H% h6 v- k% w, Q1 l均值化变换
    ' |. h4 p3 m% o6 L& J! t+ {# R# j  E
    2 i& z6 @; p0 Q; C) |7 H1 {8 m1 X
                 对每一个数据,都除以均值。% f# M/ C2 w: a! E" w0 R
    1 k5 O$ o  ~  V) ]3 Q
    百分比变换
    % i7 [" u7 ?+ H8 \
    + q- a/ G0 v' c# M
    . e( a( S' e+ m; t5 t$ I. ?9 z& z分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。  X# P9 X! ]# C2 Y1 b. |7 X
    - k* \: I/ W3 `
    倍数变换
    . g0 R. D- A$ h( k$ g& ]   
    ) s# h0 `" u. ^; @! B% v8 F# Q/ ]+ v' i
    归一化变换
      w, p) {; k9 a7 t% o
    ; P. l; |% ?+ q
    ; v8 G/ n" y& r2 [2 a; E 其中   为大于零的某个值,称  是归一化变换。
    ; P; a$ X! u+ [) X$ f
    / H4 u$ c* w  ]" P! c  M7 e) N0 V, m9 p
    / W) ~3 k8 L$ R极差最大值化变换! K1 b5 a6 Z5 A2 H( b& w
    ) H3 x5 N( W0 f# H  R5 P! K

    7 `  x0 Q; e# E- H* J% |0 k, O: h4 t" l7 h

    ; n( K# U' u! r( L! Z9 ~区间值化变换
    $ C4 J' w( W; D; Y$ i, `: Q1 H1 R: t. [" K
    9 E7 K4 a$ m) F4 c0 x# Y$ A: y
                      ,$ T6 E. Q/ i, p
    7 O: ]# b& N7 ]+ l+ w, Q9 X( H' [
    1. matlab 的mapminmax归一化函数0 u* Z! Z7 e7 X' [+ Y9 n
    函数用法:1 V* U5 C% H3 e
    [Xn,Xps]=mapminmax(X,min,max)/ z& e# x! |* _

    7 `; b; Z( X* `/ d. N$ [说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。4 G; G. f! J6 g+ o# v

    2 X+ J; v/ G7 L! g, b* R9 e$ {   (2)min,max规定X的归一化范围,根据需要自行设置
    7 D2 D' h# w5 Q5 ~+ a
    . X/ P' q2 S% i   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     / A" V; E9 u2 N  k7 [
    2 O6 _% P8 M# O- }7 _8 ^# d
     调用方法:" X+ x& T, n# N3 S& s

    - ~) u- Z  @  @; H# N( I" fX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化, U7 V9 G, S' n6 l7 D: w' _
    1 [; R5 h& ~3 A
    X2=mapminmax('reverse',Xn, Xps);%反归一化' t! e/ S! X# C( A5 Z) X3 W& B- w! ]

    * V9 y2 v4 X# Z2 H" gx=[1,-1,2;   2,0,0;   0,1,-1]
    # |7 {7 J& E& ~4 x7 S9 Q[x1,Xps]=mapminmax(x,0,1)
    9 {7 O7 _6 {+ ~4 ]; c: t! y
    / E$ n/ V. C* b( Z; J
    * V! x3 H+ B- n7 ^7 p& W0 w! p5 O( U0 v4 ^0 k! p2 ]% s
    对于python中的axis=0 和axis=1的问题
    , T- h/ E3 g' I# |* X, I" C 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)8 u9 Z+ I  ?6 u9 C7 x
    换句话说:
    , O) I+ I3 S' [& q/ `$ P6 C: \
    . A$ s9 r% ~1 u" @- \* F% R! z使用0值表示沿着每一列或行标签\索引值向下执行方法# R/ b. D8 l4 W) B2 ]/ G
    使用1值表示沿着每一行或者列标签模向执行对应的方法
    ; }! l. J- P4 `7 V& O4 {6 }8 S" u' U: @, @* N# E' ~* C( {4 n
    1 V) p7 M3 S6 B
    8 j8 E1 g: r. q+ ^5 L
    python的sklearn中 scale函数; ^4 q  c3 [( [3 l) }% l
    1 标准化,均值去除和按方差比例缩放* u$ {' T7 j8 Q) n# e& n2 G
                  (Standardization, or mean removal and variance scaling)
    . m: [" z, m0 N9 d) \. Z
    1 s6 n1 R+ ^" e! U" _# N  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    + z( G3 w# ~" S  q
    1 w& a" S2 m8 K- G" _1 ofrom sklearn import preprocessing
    4 U0 q1 m! n0 l1 G* ~import numpy as np  8 A; l1 K  G% u* N
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    ' _. a% u$ d6 r  v8 LX_scaled = preprocessing.scale(X) ' x- x! T7 J7 R. ^; P: ?: X0 J7 e

    - c+ ^; ]1 B6 b9 V7 U2 ]0 Z7 |#output :X_scaled = [[ 0.         -1.22474487  1.33630621]( |4 h) h7 ?; P( m9 _% W
                                     [ 1.22474487  0.         -0.26726124]
    4 U4 |2 j, G; T! e# y                                  [-1.22474487  1.22474487 -1.06904497]]( K6 S2 c& N& L$ E) Q# n
    #scaled之后的数据列为零均值,单位方差
    4 a5 u; y" g; ^6 ^4 n, H& Z' Z; AX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  5 |. y- n, J* Z
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])9 p; Y4 R3 y6 [1 Y1 {/ W

    * C# k6 q4 j) P& Q4 u( f
    ! y" Z5 s$ _/ P" `& h- ?
    " Y; I6 W% Z( W' U3 P8 |StandardScaler
    3 q% K; }+ V4 c& IStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    8 S9 H7 J) H3 `3 r3 `5 R$ i. P( K! r* T+ P
    from sklearn.preprocessing import StandardScaler+ c9 N- |% Z: t: S" I, D  R% a" `) x
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    0 v2 q5 v6 q3 [8 u3 `, q4 E7 fX_scaler = StandardScaler()# n/ o* H7 X  R6 L4 o  z* B
    X_train = X_scaler.fit_transform(x), k* a5 s: g, q9 F
    X_train
    " ]( j% q8 D6 O. c+ A#结果如下
    + W6 U( F/ _% xarray([[-1.2817325 , -1.34164079],
    2 k# x- `% y  B! E4 }6 d0 h4 f       [ 1.48440157, -0.4472136 ],# I3 I( D" M  R8 _
           [-0.35938143,  0.4472136 ],
    " X5 w/ ]8 ^6 d; v       [ 0.15671236,  1.34164079]])6 s6 X- Z- i5 m0 e9 C
    * o2 P1 w+ Q' I7 ?1 y4 X

    ' _, A2 p* u3 G( m8 I0 i9 V+ m$ \: T# n: t- o

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      4 Z' |3 G, h+ r0 j
    from sklearn.preprocessing import StandardScaler
    8 o! ?) ?+ t. Dx=[[10001,2],[16020,4],[12008,6],[13131,8]]$ \9 E2 e% p6 s
    X_scaler = StandardScaler()+ @& M) j9 ]( Y/ s3 N% q' p6 V
    X_train = X_scaler.fit_transform(x)1 b# Z0 K* ~: c# _9 ?
    X_train9 D! |) T- C/ r( Z- a' J  \  @1 d
    #结果如下! h6 @1 T0 Q! |8 I2 Z' \
    array([[-1.2817325 , -1.34164079],
      v& A3 I1 }  y5 E0 X. `- E0 V       [ 1.48440157, -0.4472136 ],
      _, o( n9 s* b* g, ^, W$ W2 E( W       [-0.35938143,  0.4472136 ],- L% {+ n/ D- n- |& Y
           [ 0.15671236,  1.34164079]])* d! W1 H. v/ I
    0 O1 s0 j2 i0 J+ g: O) C
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)* e, u' o7 W" J; G2 J0 }( X% z
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  $ A9 z, K# ]" ?
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) 5 e+ Q' M- H, W$ B
    #测试将该scaler用于输入数据,变换之后得到的结果同上
    # a8 n# K8 k* Q/ Tscaler.transform(X) 8 J7 g- |0 x5 ~0 \3 f0 h- Q
    #out:
    / e/ Z# S" {7 ]9 Q/ K9 P4 V% N6 jarray([[ 0., -1.22474487,  1.33630621],
    , e3 X4 s! {; J6 O8 u       [ 1.22474487, 0. , -0.26726124],
    - T  n) n4 I1 m0 {' n       [-1.22474487,1.22474487, -1.06904497]])  
    ! Z9 r# \) z- X( j/ g, xscaler.transform([[-1., 1., 0.]])  #scale the new data5 L8 B0 Z4 k& x
    # out: array([[-2.44948974,  1.22474487, -0.26726124]]); V! U; s- }. n

    / z: q& ^& d$ T  j! C; P2 将数据特征缩放至某一范围(scalingfeatures to a range)0 b3 K+ u$ z( m$ v, F( O- ]7 L
    3 c7 L4 |! }# x1 p+ L
    - T$ U9 Z' H* o+ S
    2.1 MinMaxScaler (最小最大值标准化)
    % v6 O5 w* L. \8 g" ^ 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    % J9 V6 m# \+ i+ |4 T" q& Y; f" D7 i
    from sklearn.preprocessing import MinMaxScaler. ^! ?! D8 x4 B4 d" p
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    * e6 ~/ a$ y" v& y* V# D  cmin_max_scaler = MinMaxScaler()
    ' S: A( R" k' ~X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,3 C. i6 d- }, F" T; Z  Q$ Z

    . J; V- C. H& m( Q6 u: umin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    - }9 o, r' t/ R0 X0 M8 M5 oX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    ! w! ]2 u9 r; b  b) D' i- ~0 x
    : [* L6 h6 T8 h2 ~MinMaxScaler的实现) y& f0 g/ L+ X$ j) @" y
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))) ~* ~/ ~9 K$ {8 q5 s" a
    X_scaled = X_std / (max - min) + min
    * d- s% H7 r, c( m7 a/ S& O) ]: ]! _
    这是 向量化的表达方式,说明X是矩阵,其中0 |, t, h3 \5 A3 R6 N
    6 W4 C; m& X2 S* X3 j5 p/ _7 C1 B. o
    X_std:将X归一化到[0,1]之间
      o- G! _  w3 r3 iX.min(axis=0)表示列最小值: k6 ?* `1 A1 s* d) }
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    6 q" j2 w$ x+ d' Q. K' g, |! ~! r
    , Z3 }% k! H  P1 l$ J
    4 N. D! |' Q+ a9 @+ H, @2.2 MaxAbsScaler(绝对值最大标准化)! O8 c( I* z3 c" _# k
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。5 Z* x5 B( M* |

    ' F# y' O3 e( cX_train = np.array([[ 1., -1.,  2.],8 X1 i0 b% f6 E) j
                         [ 2.,  0.,  0.],# ]2 N9 b4 F9 _4 A3 n/ j
                        [ 0.,  1., -1.]])
    - J3 V* V* K6 m, tmax_abs_scaler = preprocessing.MaxAbsScaler()
    7 X2 u! ?5 ]- S: M* s  O0 iX_train_maxabs = max_abs_scaler.fit_transform(X_train)
    % S- G; D  x3 j6 m, {, e# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    4 k( ~% h7 m( H! W9 W: c- r/ uX_test = np.array([[ -3., -1.,  4.]])
    1 P9 W3 U. ?! C2 C" e: V+ R  YX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]]): D  k7 u5 E$ n
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])* a2 u. U+ L3 X  `- Y- O7 o

    ( z# t! v0 m5 E! [) X% C: h
    ! }; T% e/ K3 x) T  h% r# D* u, J" r. ?! _; l; Q7 E
    9 Q: ~1 ?& _( @( W3 I7 G$ ]+ }
    * v/ C3 s+ M( k: f. [1 @4 l6 t5 ~

    2 a5 {" o6 c, `: {( S2 s
    5 ]: Y; S& z- q3 j9 p6 [) R: N7 |0 w( ^9 z! M' W
    & G9 c0 w0 ~9 M9 C
    0 Y6 n$ Q# |, g0 b) o8 D( w
    ————————————————+ R/ w* I8 X$ k; I3 @3 B- I
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 @2 A/ E+ L  @原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    , c0 ^! [& m  N% m4 W" I
    ) a, |# J4 \0 Z; R' r" R9 D% I: n' N! X% O2 [" m' [
    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, 2025-12-25 09:09 , Processed in 1.720617 second(s), 50 queries .

    回顶部