QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2011|回复: 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。
    , a* Z: w5 X# ^$ m, Y
    3 O5 G% t% N* n) H4 J: |5 Q当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    9 d" Z/ {) Q  |. e0 L当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    / g+ _' ?+ m! w# ?/ S" f( U数据变换的目的:5 Y% V7 ]8 T6 `: g8 y$ X7 `6 C2 u1 q
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    ! s% S: l1 O4 Y+ V0 o! g0 G
    : R+ ^! Q7 k" p  a/ y 定义 : 设有n个数据的序列  ,则称映射' ^3 V: `9 y3 k5 w+ }) \: T( f
    , {* y/ ]0 d# w
                                           
    ) q9 r6 D. V0 R4 V$ y5 G
    - j2 |9 Z* b* H# f          为序列 x到序列 y 的数据变换。 + o9 j3 f6 ^) W

    7 Y; r. |) F+ N/ t: v数据变换的七种常见方式
    . P/ [' E, K( \* k4 [此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    ( |0 g  u" [3 `/ W2 |: y% u. o5 ^' |: [/ m0 P7 k! C9 x6 S
    初值化变换
    3 p/ Z+ c& [/ z3 [; V3 k4 n
    ( L5 ?3 K( \! B" g+ i7 M0 C
    - K8 o) q  ~7 F( [9 J! k" {1 X8 K 也就是要对每一个数据,都除以第一个数据。
    / X! Q  T, @6 ^1 Y+ y9 o
    # m- A& |8 E) E( H6 l均值化变换' e0 Q% c: _' {) i6 ~

    ; @3 u0 ~% k4 N! @" J# M
    ( L5 t1 C; P3 }) S( c, f, Y             对每一个数据,都除以均值。
    9 q* \. [4 w5 \3 L
    . M- z  [/ L0 f1 U: b百分比变换+ y2 C4 X% n2 D# J( ]

    4 t( ~% M" ~3 e" Q! V
    " z4 |: y. L4 ?0 K+ G分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    ( s4 W! x# v& S. E; X( p% E1 \  {& Z- T
    倍数变换7 R4 V0 ~7 ~  G7 O4 Y4 {+ b3 H
       
    . L( P2 s: e: P, Q8 P$ _0 ^" M8 f) }
    归一化变换% t/ K9 P1 w; n

    4 t5 C, F2 y% r/ R5 d8 q: O0 j: Y2 _- Q" T
    其中   为大于零的某个值,称  是归一化变换。
    4 J) l9 B; w* v% Q, Y4 R- ]2 c0 g- L5 D% G+ b# D

    & c9 m& F' |8 M3 B! A+ \极差最大值化变换
    7 f& }7 u$ @2 C9 p
    5 W' N/ U' ~8 ^# n% \+ L- f; f1 Q$ a( @2 g

    8 G4 C9 n5 l& H2 M5 _) f1 K" S! h
    0 C& A) p0 ]: o4 w$ |% i( W6 k0 q, W1 `区间值化变换
    ; r  p& Z1 m0 X7 ]
    0 }* _7 r# w: E6 R* _- m; a* `# P3 a! F7 {, `' l6 Q
                      ,  p3 T- L4 C+ y5 y' b

    # u& Z4 ?& c' U1 D9 D1. matlab 的mapminmax归一化函数' W% C: L8 G- l' I, E2 I
    函数用法:
    4 \8 _0 C# x- r6 S' F" o [Xn,Xps]=mapminmax(X,min,max)/ f: }0 Y% T$ v

    . W4 _8 X* b1 w* B, u说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。, a! N$ `. d+ }: N7 ?; Q) A
    8 x: ]7 T% M, K% a
       (2)min,max规定X的归一化范围,根据需要自行设置
    * R/ L1 ?- g+ G8 Y4 C8 g) ?6 x3 o" a5 ?
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     ( |2 X  S+ Q5 e7 N' Q) X8 d+ i. T2 O
    ( s( D, g  e4 b0 O- u8 ]
     调用方法:
    / o3 y+ q+ x1 C9 y6 |/ |4 U8 x4 u+ q( Y
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    5 n4 V- U2 ~2 ?, i
    2 E5 M0 e1 N( V$ ]! m( i! GX2=mapminmax('reverse',Xn, Xps);%反归一化8 A- @, x$ ^) d6 Z9 Y1 P5 p' B+ l% i7 O

    7 M$ [% |2 M5 M4 ?. z1 tx=[1,-1,2;   2,0,0;   0,1,-1]
    ' m9 A( [! t% K: X2 ^' ][x1,Xps]=mapminmax(x,0,1)
    ' M" {- e3 B" i2 m2 S
    $ `* F5 V4 X8 ^" d7 U! P/ v+ r! p; B! l+ I/ s# @6 g% o& ~' Z1 L5 c) S
    2 w# h  t" |3 ]% _
    对于python中的axis=0 和axis=1的问题/ C$ C! d9 @4 k  R
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)7 y7 r# Y5 q$ e5 U
    换句话说:
    ! A5 h2 A$ w2 H2 w) i5 V3 c/ s+ V4 p3 M' ]( _! P) L7 l
    使用0值表示沿着每一列或行标签\索引值向下执行方法. M, \. V5 B8 i
    使用1值表示沿着每一行或者列标签模向执行对应的方法1 c& e& c9 s: H3 s: Q( Q- F& F
    1 i# S5 S2 X/ M. B: H* i. a9 h; s

      j; W) n" G( v# F1 ]3 H$ A1 @3 p0 x& N' w- k9 A1 y4 v, Q, k
    python的sklearn中 scale函数
    * G# R' C# F5 F8 c2 y/ D6 h- h1 标准化,均值去除和按方差比例缩放
    1 ~. K* a2 z2 o" q              (Standardization, or mean removal and variance scaling)( u% c1 X$ y! w' T" p2 x; a
    1 k  @* x5 E4 P1 }/ {8 f# N
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。- V+ S! V1 ^% x3 M9 w9 p' a7 o
      v' R: D- V9 [+ a6 ~/ }" M/ ^, p
    from sklearn import preprocessing 3 _7 L3 g; m% x4 `& D1 J+ K
    import numpy as np  5 T6 W+ i  w0 g+ Q; l
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    8 s' B' a- u) s0 T: oX_scaled = preprocessing.scale(X) ( `1 D0 E1 l& E  z1 ?9 |( r

    & Y0 z- o! I$ n# z#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    8 {- D2 b% u, C& y( G& H0 c                                  [ 1.22474487  0.         -0.26726124]
    : Q( Q0 ?4 }. S  t# b  I4 |                                  [-1.22474487  1.22474487 -1.06904497]]
    ) J2 h. R) @) |( x1 T3 R#scaled之后的数据列为零均值,单位方差  c0 w/ G3 l7 n; r& n& W
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    " D/ N: v  E8 A: [X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])1 p6 b$ O& ^$ t& `7 i

    + O* s; V8 ^* U
    7 i  i% q4 P8 C" d3 u) o& o: ~, a9 g& N! M4 M4 I. A5 {
    StandardScaler
    6 P+ {/ u+ V7 [Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差). X# E+ u' w* b- h/ \
    1 y2 z, ]0 X! M6 w! o
    from sklearn.preprocessing import StandardScaler
    . y5 V6 c' M/ ^: Z2 z7 R9 Ex=[[10001,2],[16020,4],[12008,6],[13131,8]]
    4 i0 ^1 s. `+ _& ^2 }X_scaler = StandardScaler()" Y+ Y4 j3 T$ X/ t! k2 Q: X. e" v
    X_train = X_scaler.fit_transform(x)# w$ u8 S' n  d$ W  |
    X_train
    6 n# E, z2 J5 c+ T#结果如下
    ) M+ @4 ~0 [# D/ ]5 U5 _array([[-1.2817325 , -1.34164079],4 K  N! w4 H- q8 @+ q
           [ 1.48440157, -0.4472136 ],4 _% r1 d3 a/ ^8 T& m/ d
           [-0.35938143,  0.4472136 ],
    - i& T- `* j6 x4 K8 O! ]+ _$ `       [ 0.15671236,  1.34164079]])
    + b. b7 r0 W+ t. J( q' b
    % P3 h, U& M% l7 s4 h) F% H9 V2 n  I7 K! J3 h

    $ K* W7 @& @- Q1 N* o& R% i9 F

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。! [3 Z, `4 u& U1 {
    from sklearn.preprocessing import StandardScaler
    # E. M( F7 Z' g, s, ex=[[10001,2],[16020,4],[12008,6],[13131,8]]
    3 O* d* Q  a* r- u+ PX_scaler = StandardScaler()
    5 T2 ?" Y  l6 K! X' V- E' cX_train = X_scaler.fit_transform(x)/ u8 R! X- j  i7 }) P- K
    X_train
    % A8 G7 \( E6 Z1 W8 c#结果如下
    : O4 L2 R! q. iarray([[-1.2817325 , -1.34164079],& u0 B6 l+ L( a6 d& \$ I# V* X
           [ 1.48440157, -0.4472136 ],0 p4 Y/ `  N1 M6 G! y
           [-0.35938143,  0.4472136 ],4 P* g5 C. Y/ L9 t3 W; A' Y. v
           [ 0.15671236,  1.34164079]])
    9 n7 _* A! f% i# ^8 H6 h4 J" Z- g
    & @1 C& e* {" K- G& L5 Uscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True), P6 o$ z) _1 F; P# D$ k; h& v/ b
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  % j9 G" ?9 t& f# A( L- h% x" s0 W* u
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) 6 H4 P+ z  f3 P& q
    #测试将该scaler用于输入数据,变换之后得到的结果同上4 U5 X# [8 r, g9 t
    scaler.transform(X) # G. K/ `1 D& \; n, V8 o
    #out:
    ' X' V4 b; o3 D, [( \, H9 e/ _$ b+ {array([[ 0., -1.22474487,  1.33630621], / O9 M: {% ~. W8 K! [% M2 t
           [ 1.22474487, 0. , -0.26726124], , u7 z9 f; x# M: H7 b" _& \
           [-1.22474487,1.22474487, -1.06904497]])  
    ) J0 V. _! G+ O; H# n* mscaler.transform([[-1., 1., 0.]])  #scale the new data) T2 P" f+ b. A
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])
    8 U$ H5 I* P: M/ |; }8 I' m; F! y
    ) h6 ]5 k3 n6 W7 r/ ~3 N0 g2 将数据特征缩放至某一范围(scalingfeatures to a range)1 a' R* x/ G% o( K# R

    ' ]4 g  W$ K) w
    : w6 m* ~3 N* _' P9 y" u  Z
    2.1 MinMaxScaler (最小最大值标准化)
    $ m  ^3 d+ Y4 F; S7 ^0 A 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  8 @% x- q+ D$ a
    " y; x/ ?$ l+ t. H- `# n; n! }# N
    from sklearn.preprocessing import MinMaxScaler3 G- o' o0 \; h
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & U: Q8 \( e: q7 `" |+ Kmin_max_scaler = MinMaxScaler()
    - z1 F  s0 D, H; w: tX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,' N8 P5 z, |9 V; B4 }! Y

    ( F& c  w" F. Lmin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    ; J* ?1 B8 X) ^X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果& ~) V: t, k4 h) h" Z9 H

    + W& C4 C, J$ R4 R& G( sMinMaxScaler的实现5 r) Q. q* N0 X3 ~. o  s+ e
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))  H6 _7 Z. ?, y. q
    X_scaled = X_std / (max - min) + min. ?. r4 {$ K- j8 z. f$ |6 _
    ' G0 G# Z: W7 r1 g
    这是 向量化的表达方式,说明X是矩阵,其中4 @4 W# H1 A6 G7 C: n+ b
    " J4 W5 R% c' \. q. m$ U
    X_std:将X归一化到[0,1]之间2 {% ^' D1 U7 U# |; F& f6 \; z2 k
    X.min(axis=0)表示列最小值
    3 V# C. ~) x1 O  ]5 n& y) z0 w' A9 l- emax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    6 \- y& ]6 h$ u
    4 k" r6 S# S& H
    # u- L/ S0 L7 l7 T, n. a" r2.2 MaxAbsScaler(绝对值最大标准化)
    ' B0 P# W4 _& ^         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    ' T7 O. ?( Z' q7 h( n# Z1 X; F6 ]6 u: H& z9 i9 |. i; u
    X_train = np.array([[ 1., -1.,  2.],
    3 W) ?4 ]% @: b$ }: \                     [ 2.,  0.,  0.],
    0 K. u, g# m0 x, w3 U                    [ 0.,  1., -1.]])
    2 D& C  l  J0 s' }$ x0 D: B$ A- emax_abs_scaler = preprocessing.MaxAbsScaler()
    % n$ l+ y# {" |( tX_train_maxabs = max_abs_scaler.fit_transform(X_train)
    0 ~0 P# R$ ~% l, ~# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])0 [7 A& z( q! D# @7 T
    X_test = np.array([[ -3., -1.,  4.]])/ g; j4 L: r/ n
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])$ \% x2 j1 ]1 c# U
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])( X( i7 F' c+ P9 d3 L+ \) Y, x

    / n' j3 K7 g* P8 R- }
    + q" l7 S, `# h7 V2 d7 \# |9 L2 I% {  ?1 F) a" L  c1 T* L" p8 j
    $ @8 b$ D8 }' Z7 ?) k% R
    $ l0 B' L  {( H. j# s

    " I+ X8 C. w$ ^6 `
      C  ^& o( ^( j% a, Z/ s; J
    ) K6 H9 E. ?6 [: g: o/ u
    5 g. o( u4 c$ m, a; G
    3 J! y# g" R5 D0 c1 v————————————————' f0 K7 m  ?! o! n! y% \( f
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* @4 m1 \3 B3 f. ~
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223, i: r/ O: V* y! e. Z  l9 f

    . |. H3 a) j* j6 \) P! f: o! E$ m2 e
    4 Z; ^0 k, k5 [0 a
    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:08 , Processed in 0.321696 second(s), 51 queries .

    回顶部