QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1988|回复: 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。
    - M1 I4 S/ ^& a7 v- a3 I2 i* X+ g( E; A0 c: q( J5 n
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler0 t  V( v# l/ X! \
    当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler- \- n4 C# [5 @
    数据变换的目的:
    6 c7 Z  ]; q' H; [3 p0 q  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    ( j2 V% q, j1 W2 X: F
    " d; `. C4 e- m. I' ?# ~ 定义 : 设有n个数据的序列  ,则称映射
    : [8 B' _7 W9 O
    % X8 P" P1 n0 a& R                                       
    8 J( d$ h) I. x9 m6 S- w0 _
    5 G# Y- Y3 O# y          为序列 x到序列 y 的数据变换。
    $ I6 o# g: T* R. g: {3 t. m/ ?: [! I  r  x
    数据变换的七种常见方式5 ?6 R6 @1 ?  ~( G+ F
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。. A' R* r; }$ p2 K8 p9 z
    2 z3 ^- X& Y, C5 M9 p7 e. k. j9 @
    初值化变换
    1 v! {$ R, o2 O5 s+ P+ Q7 A& J1 N! o( L5 _- z4 o* P* w

    ) X; o% B) \! B0 ]1 K 也就是要对每一个数据,都除以第一个数据。
    9 [: ~( }& h& h6 H: _' ~; o3 G7 X  C0 V( U& f
    均值化变换
    " ^) Q+ R2 x: l5 G! N; y6 \" H% F2 r& d2 \( I. w! e
    , v! G: @. e: Q/ I; L! }
                 对每一个数据,都除以均值。/ C( U) B- @2 N
    ! b! ?1 U2 I) F& L0 P
    百分比变换- B+ I" n. U+ u# M) U+ |
    . v8 b9 u7 T& W& l/ W

    " y9 p" q3 z( c! B分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。# M, W3 k0 K. n& U5 R3 H$ L

    . ^: W* L4 y5 F5 m6 r倍数变换
    / n# L- a6 F8 F   
    # W; g! J9 T, u5 Y% y  G9 s
    + B# g. I- {  A) y% }! |归一化变换- A# O6 g! W( O" B4 ^

    5 z' @. W9 T; y+ f4 [6 ]9 U( X6 u3 m$ E3 d3 Y
    其中   为大于零的某个值,称  是归一化变换。
    ! I9 c/ |! I0 T% w  J" c: B% Z
      `6 T3 |4 F" |% h) m6 n! Q9 x
    ! V1 [3 [/ R7 \4 |, l0 d  r0 o极差最大值化变换. v3 J0 @& N4 m% y' E

    : `8 k' X, M& F$ ]3 y5 a' R9 `
    * w0 Z( i. s6 d' D1 D
    $ a; Y7 b9 Q' p3 K: ?# D( \  `0 P4 b+ O" c
    区间值化变换
    ) F. Q9 s- v$ `. e8 y
    4 N& [! j" R( \/ Y, D
    4 Y; P; c; W+ n1 q/ O; h9 N  v                  ,. j. [1 v4 P' J( q; t8 ?. f
    0 K% p. f6 {6 F
    1. matlab 的mapminmax归一化函数
    & \/ i. T" Y3 }' b: t+ I  H函数用法:( h( m: Q, p7 o: {
    [Xn,Xps]=mapminmax(X,min,max)
    6 h  B+ w. K' o+ T- b$ g, A& l. P* R+ G1 q% J# R" b9 u. j1 s# H* b5 }" J
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。# E' w! |9 _! p( T  p

    7 {& u, G  x1 E' I! s   (2)min,max规定X的归一化范围,根据需要自行设置. s5 l7 c" u% r9 Z
    4 D. }" @: s# T% d2 ^1 i$ n
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     + e+ _8 L$ L4 |9 p% L
    - Z" i8 M  o& T# K
     调用方法:
    6 U) I2 ~; t! Q0 m0 ~" J; M: y- o- \2 c6 f; e9 c% }& N
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    % G& O; ]9 _$ B$ ?4 }/ r- k( M& w
    X2=mapminmax('reverse',Xn, Xps);%反归一化$ b; s# a3 ~  z8 B  m
    0 w3 Y7 N3 V8 l8 G7 l
    x=[1,-1,2;   2,0,0;   0,1,-1]1 b# H# P% f& a6 x# ^# M
    [x1,Xps]=mapminmax(x,0,1)
    # a4 @. c/ B9 Q" A' s
    2 z' A8 z; i/ o
    + _( x2 \4 x8 d8 X
    3 t" f5 ]4 e) I- ]' \7 v1 ~# |/ G: @1 u对于python中的axis=0 和axis=1的问题
    ( W- ?- ]2 B8 R6 y4 | 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    % {) f, f: Y! P- d换句话说:
    ) E/ W# v* g7 {1 Y
    $ u( F4 v5 q1 P' d" L使用0值表示沿着每一列或行标签\索引值向下执行方法
    # p6 a5 Z* W6 Y/ J' W使用1值表示沿着每一行或者列标签模向执行对应的方法8 g/ p! X& r  W5 F; u4 k2 ?

    7 m5 z5 k' T; a& X- o# G
    $ l* F+ y8 m+ d2 G0 m; y. o, h- c- q- U
    python的sklearn中 scale函数
    ( k: i' |9 E6 F3 r  h& s5 J1 标准化,均值去除和按方差比例缩放4 I! [. N( @; W, q  B7 t" J8 W) N  q
                  (Standardization, or mean removal and variance scaling)
    # N. B# F: B5 C
    5 U+ P/ _+ Q: [" u, `4 x  m  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    ) j1 ~3 |1 G" D( f3 r! G" J+ z" @% Q: B, \5 Y+ V
    from sklearn import preprocessing ! ~) O, f0 v( a, w
    import numpy as np  8 D/ e- d" V$ t- ^' V( }6 `8 j/ [
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    1 @+ Z2 L3 t! [X_scaled = preprocessing.scale(X)
    & {/ f, X7 y- p% I3 ~
    - N/ ]' d4 a, K+ A& C. p#output :X_scaled = [[ 0.         -1.22474487  1.33630621], Z% T; }8 S0 Y% U5 |! o1 B3 u3 E
                                     [ 1.22474487  0.         -0.26726124]
    0 N8 Z' H6 t3 [                                  [-1.22474487  1.22474487 -1.06904497]]2 ~2 u6 T$ K0 X# U; O( {
    #scaled之后的数据列为零均值,单位方差
    8 C2 }0 W- T. z/ X  kX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  5 K; s( y% k3 n/ \  K
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])) c; x2 c5 G4 w3 W) W
      k- C% @2 z7 W2 q, W8 X
    9 a7 a" R7 ?! \  y8 |' ^6 i1 g% F
    ( {2 Z) l+ z, Z# u+ R
    StandardScaler ! O8 G3 J* m7 f2 N( `
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)! q, o! x8 ]* G/ [/ r8 u

    ) R) B: [& P+ X; U4 K2 n  K) o  dfrom sklearn.preprocessing import StandardScaler* K4 l! Z* h) E# r0 `5 t
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]+ n* J0 ?0 \$ c5 \
    X_scaler = StandardScaler()+ C: \+ q* Y, S) m9 F  h
    X_train = X_scaler.fit_transform(x)" f" S5 _; [) m6 u  @
    X_train
    / b' `" F1 O- n# w#结果如下1 P* t# a4 E# \- @
    array([[-1.2817325 , -1.34164079],6 f: |8 ?7 `0 q( H% \% e
           [ 1.48440157, -0.4472136 ],
    ! H9 E5 C2 G; u6 }5 @1 F       [-0.35938143,  0.4472136 ],* l5 X7 H2 U: B6 _
           [ 0.15671236,  1.34164079]])
    ; L3 m# }. ^+ H0 T% _
    7 q( F, T9 O4 I4 O# X- d1 s# ], n- _
    ! Z9 N/ u6 k( ]* D

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。5 s: L. F% F3 f, a
    from sklearn.preprocessing import StandardScaler
    8 h5 r/ E) t: {! c0 Xx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    $ b' V4 d; [- c& X; pX_scaler = StandardScaler()
    # Q3 g* C  p, ^& `X_train = X_scaler.fit_transform(x)3 H! h( M5 Z6 e
    X_train! S4 m* S/ X0 A& V  q0 R6 |9 J$ Z
    #结果如下
    6 {1 ?$ \, b: Warray([[-1.2817325 , -1.34164079],  I$ m# M2 }8 N% [
           [ 1.48440157, -0.4472136 ],! F" r5 c' f- a. J
           [-0.35938143,  0.4472136 ],
    2 ~/ ~. \  ~4 C6 I7 k       [ 0.15671236,  1.34164079]])9 q- q3 \2 C9 ?, {2 _6 A
    % G! }9 Y# u2 O+ V, P
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    - o" @7 J9 c) e+ w# i" @) c% p, gscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  8 Y- F/ `" @, }6 `
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) - [; u% ^) ?0 J6 \* t, y+ Q
    #测试将该scaler用于输入数据,变换之后得到的结果同上1 k* O8 i: `8 a* ]! H) w
    scaler.transform(X) - Y/ o* p4 r7 _1 O  K0 ^7 ~
    #out: + A6 @7 O# |: z, e$ }
    array([[ 0., -1.22474487,  1.33630621], 9 W- i3 r# }0 k; o7 E
           [ 1.22474487, 0. , -0.26726124],
    8 |0 T/ V. l# Q- b$ L       [-1.22474487,1.22474487, -1.06904497]])  & x( e+ e9 I! P2 F
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    ( s9 g: g& y& i1 b# out: array([[-2.44948974,  1.22474487, -0.26726124]]), Z& n' X8 [- g

    2 `5 f3 f* s5 M) l. a; D6 w+ z8 |2 将数据特征缩放至某一范围(scalingfeatures to a range)& R0 b" Y8 g% N  T4 N/ L6 O
    7 y! L) b& P& K' K( t+ N: y3 B6 r

    ' c& W7 |8 F' b5 d( g' l+ d2.1 MinMaxScaler (最小最大值标准化)
    " j6 i5 ~: K9 ~2 G4 D 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    , [- Z6 }! U2 }6 S
    ! b0 o) P- ]% y' s# T: p* ffrom sklearn.preprocessing import MinMaxScaler3 d2 D2 d1 B% \* F2 I
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    ' V1 v: u2 d% o* Lmin_max_scaler = MinMaxScaler()* \/ Z6 E' p4 }  E
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    8 E! C; ^; M( ^5 E' M7 |  v2 v
    5 z  ]4 H9 u. cmin_max_scaler = MinMaxScaler(feature_range=(-1,1))+ e4 H8 p3 B5 B. e. x% e* ?' a( N
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果& u/ y; s# W( D/ x6 g9 J. N; _
    . l- Z  {: B* J( m$ G5 g2 A5 r* W
    MinMaxScaler的实现
    4 u1 V- B& x8 T' z# w' p! \/ c& tX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    8 E% s' T! T7 R/ j4 LX_scaled = X_std / (max - min) + min
    ' p! r+ X2 q& ^5 z+ Y4 `; R3 n
    1 Z3 p4 E0 \& \2 P/ k! v这是 向量化的表达方式,说明X是矩阵,其中# Z  c$ w. b9 ?4 W( L8 Q9 N* d6 M& _

      ~. E- K4 t5 k1 `- aX_std:将X归一化到[0,1]之间$ `  Q, p# ?+ e) k: U* W% d2 C
    X.min(axis=0)表示列最小值1 @( U8 z) ^7 t8 b
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围8 _7 t+ ?$ V) l$ W) X2 i

    / y' `3 _5 e  k
    2 N% n7 f; m  d/ ^$ e2.2 MaxAbsScaler(绝对值最大标准化)
    + N0 Q  A) p: E4 B; S         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    / ^) J: Z. ?0 D
    ( `4 C! n/ z  ?/ i3 ~# N2 ]+ g: YX_train = np.array([[ 1., -1.,  2.],2 Z. \  t7 A8 w9 I( L1 |. A
                         [ 2.,  0.,  0.],
    / q) B3 I5 v0 m' E& ?5 F                    [ 0.,  1., -1.]])' j, \2 k8 T" O
    max_abs_scaler = preprocessing.MaxAbsScaler()5 I7 t* e9 s) r  d3 }+ j
    X_train_maxabs = max_abs_scaler.fit_transform(X_train): b; l8 Y" Q) L0 o: g0 D
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    # }3 d9 w/ \8 o5 F/ JX_test = np.array([[ -3., -1.,  4.]])
    ) D( j* S7 l2 j- }X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
    + M; ?% f$ k4 F' ~  Amax_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])  a$ i0 Q5 w# E: ]2 W: v

    9 ^  T9 @$ c  ]4 x9 r  r) ~7 Y4 R. U5 C1 A0 g: u3 l
    7 H- G1 H) z2 Q. i4 h. f
    , w$ L* P3 n, v. f5 d: l
    " ^; ?0 p0 J* P- i" ]- \, h

    4 [& I3 |8 @3 S; w3 r$ k2 D4 o/ \7 b# {

    $ v. L8 d8 u- b! ^) l5 P, R4 C% u3 L/ U* e( S1 j4 U7 J3 q! C
      Z* X, b4 u) R. _0 O: C1 h. L, E9 w
    ————————————————; N( d/ h6 `3 s3 j9 @3 X
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 q) P- h6 y1 T- z: H: {. O
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223) U+ n8 z' P6 }. S4 @. O

    . u8 j. |# c" v% n  ?* |2 N* t# _/ Y* P2 B# t! L% w
    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 02:32 , Processed in 0.452747 second(s), 50 queries .

    回顶部