QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1963|回复: 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。
    9 ^) i+ j3 M* i$ i. D8 o  W: P$ h1 ]- s9 h7 o
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    ( e6 e/ U# g( T/ s2 U" X( y当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    ; e( w6 H  M% r+ t数据变换的目的:$ F$ D8 T( I2 q( ]8 \
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。! i3 Q% ~' o4 s$ N6 ]) G

    . E5 r3 H$ ^# h  u; C/ L" x% I 定义 : 设有n个数据的序列  ,则称映射9 r3 v+ J+ i) T0 c3 q9 v( z' E
    , L8 U5 u. H) t  N+ k  g6 h2 b
                                           
    9 C; W! o  D; R) o
    : c* ~& s9 G) Y8 f$ {  e, @          为序列 x到序列 y 的数据变换。 * k' v% V8 d# q/ T
    $ ?( c7 l, l  V& M. I
    数据变换的七种常见方式( t2 ]% x9 w) F# n
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    : n! \1 ?. G  i2 _# ~0 \
    ; h4 j/ @$ y8 s3 B+ A; L# x4 a3 j初值化变换
    4 |& l: I: z6 @+ q2 T( N) f+ l2 @! q5 K( Z* N& h& J4 ?

    7 s& r: V7 D9 t4 j/ U/ j 也就是要对每一个数据,都除以第一个数据。
    # X* f9 }) G9 l) K. W5 r9 ~8 }+ U0 Y, ]4 C" w' N
    均值化变换9 B. `/ K3 S; d( e% m' U+ f# j/ E
    + Z4 f; Y1 _6 g. q8 ?2 a
    * u) q1 y- H2 s1 ^& \; k
                 对每一个数据,都除以均值。3 v6 r! ~8 G$ Y6 [  K

    . b) H$ O* l' I; ~! w% `& D百分比变换
    , t% V4 F$ T' e* U! d- s; M- o0 T6 J
    6 o6 o- ~3 ]% m4 {
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。. Y! E$ G6 l# D/ r- ^' E
    & ~+ r2 Y7 L) Q# r8 g
    倍数变换
    : X3 M* }5 N' G; }; W) s2 I8 }! A   
    9 |2 Z+ b8 o2 ?+ P7 V5 Y3 {4 C, F$ m# ^! x1 d
    归一化变换
      ^3 l; F! b7 {
    + W; f# c  W6 M! D* w; o# U9 o0 W7 s" V
    其中   为大于零的某个值,称  是归一化变换。
    8 Z- [2 P3 v! \" e# c! i
    & s* h3 F* c; s- N
    7 {5 o4 N3 [* Z- {: V/ O! Z极差最大值化变换
    8 [6 w) I5 u: B
    4 L9 e6 _: [" ]5 ^: V& ~- D1 A7 f* Q, i8 P4 k9 W: B
    ! Z/ \8 A# ]2 T) C1 k1 Z/ r0 T

    3 o8 V' f. `, Q; V/ j7 T7 V# r区间值化变换8 I$ X  p8 @( Q1 A; V* v/ `. w/ _

    2 i7 O. M% E6 I4 G  N( A6 G$ x
    / r2 ]5 u# y+ \1 j! s                  ,
    2 V2 X: _0 T; c  P% s' [2 D) w) U
    & f2 q0 D2 h& K, @+ {1. matlab 的mapminmax归一化函数2 d7 S6 U) F  k, Z0 w0 e$ x
    函数用法:
    3 b) t( {0 ~8 t* X0 y [Xn,Xps]=mapminmax(X,min,max): S) t0 m; S* i1 I% t
    5 Y/ N0 J: b  l0 r4 b
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    ( G* o' ]" J- `  V# _& }0 g) [5 r2 T; ^9 L6 D: U. s0 @
       (2)min,max规定X的归一化范围,根据需要自行设置
      V) J* o9 T3 O/ t* h- [( Y3 K
    * I( W0 B. Y! @1 B* \: F   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     ' Z( {" N7 [7 u9 f
    " I$ z6 V+ O2 J5 ~: j( c5 ]! x8 F. P
     调用方法:
    & L: S, c1 T  ^$ b3 s: `1 s1 r4 b3 c' N2 E5 T0 m3 F
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化. \% d" ], @% }: ?  S% ^5 O7 `& v

    $ k$ C- F- d: a2 v0 VX2=mapminmax('reverse',Xn, Xps);%反归一化
    9 ?# z- E6 z* C4 A# v: d" K; ^
    * E: [. M* [- j. q/ L( {x=[1,-1,2;   2,0,0;   0,1,-1]
      N% @3 [  A0 M. m& R[x1,Xps]=mapminmax(x,0,1)" z3 u8 z! k  ?

    - `2 g! O! }, D9 J9 w
    9 H0 O  R! K# c) C0 r8 E1 l
    0 Q3 ^: U7 q+ V对于python中的axis=0 和axis=1的问题+ G6 }, I2 Z$ x7 m
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注): F/ D9 `: s; d- ]$ z7 |; T0 ?% t
    换句话说:4 d2 M  x  q7 r
    ' W2 n. r/ j" R1 u) D1 A: ]
    使用0值表示沿着每一列或行标签\索引值向下执行方法; X# R: H6 H, ]4 A) v
    使用1值表示沿着每一行或者列标签模向执行对应的方法- {7 U" ?4 v; I, }2 T

    + n- W& k& K: I" F1 G# ?5 O! P+ K7 {. D- y! O: h* Z( j4 j- W; ^
    6 I! u: G- d6 w( E( E6 g
    python的sklearn中 scale函数& a# V. j8 A5 I! ?
    1 标准化,均值去除和按方差比例缩放& Z, P! M8 c3 L% v
                  (Standardization, or mean removal and variance scaling)9 f  D% d/ Z& N

    . q' d: O' f. T6 j1 x  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    8 O4 i2 ^( u5 z4 M
    - ~1 X; `/ H- V7 P& Dfrom sklearn import preprocessing
    ' {: e9 o- T+ |+ r' Kimport numpy as np  & Z4 q, Z  N8 a  G1 ^1 y, Q
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    + _. C2 B# g7 L, RX_scaled = preprocessing.scale(X)
    , J! N0 }  L7 W5 q7 [, i4 ?1 J8 e5 d. W3 |/ r
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    1 p! ?9 Q! q5 h, y                                  [ 1.22474487  0.         -0.26726124]# S3 `  D+ M0 K/ X% m
                                     [-1.22474487  1.22474487 -1.06904497]]# ^5 }- d& v6 x
    #scaled之后的数据列为零均值,单位方差; [3 `/ ^! o: g* h. H
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  ; T$ H4 w5 K4 U+ q  A7 T7 c; b
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])5 h% [) h) V# j8 _

    / }) f% b" a7 k! K6 _
    ; y5 Z0 P% y9 {4 z9 l/ H2 `3 R* f* ]
    StandardScaler
    3 Y2 y5 D4 v1 TStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差): a& `5 v# P+ \+ a# C, {
    8 _; x& W6 f8 T& K  H
    from sklearn.preprocessing import StandardScaler7 K& v1 @1 {; l; r+ X
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    0 o3 H. k  M& CX_scaler = StandardScaler()+ t- h( s1 \3 C$ b
    X_train = X_scaler.fit_transform(x)# E# x* A5 q4 g0 e
    X_train9 q1 z& e6 s, H$ r
    #结果如下
    0 U5 l1 E) s) g" @2 O6 @( narray([[-1.2817325 , -1.34164079],
    ( a: n( h: E' Z" L( L, l       [ 1.48440157, -0.4472136 ],. w4 T* t6 |$ n5 ^; M
           [-0.35938143,  0.4472136 ],
    + {/ ]8 C7 z6 i2 v  a; F7 x; q       [ 0.15671236,  1.34164079]])% r4 B. q. |% l  J* S- k4 i

      r6 B9 N3 ^& g8 L* ?0 D6 J' s$ _" s! L
    . z0 Q* d4 {' q9 Y, ^; l9 ]

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。. M' V+ z) [; q) y/ x
    from sklearn.preprocessing import StandardScaler! q' c2 G6 ?: [* @
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    6 ^1 ?6 r" x3 i& H5 j9 NX_scaler = StandardScaler()
    / Y, w$ |) h4 e, X& d( H' r0 GX_train = X_scaler.fit_transform(x)
    * S7 C) S. j2 {, v' Z) K6 oX_train0 A. j7 p) q, v" x! I3 S* L1 k! H
    #结果如下
    1 U$ F1 B! H  O- j7 X0 j) jarray([[-1.2817325 , -1.34164079],
    * G( f  F7 |& {7 z       [ 1.48440157, -0.4472136 ],& _" w' ?8 o- N% B+ ~( F2 D7 i( w
           [-0.35938143,  0.4472136 ],4 e: w( p3 P5 S  m4 D9 c" V0 O
           [ 0.15671236,  1.34164079]])
    ! c( N) e, S) a: M4 R7 g) X" J1 y* f% B0 Q
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    9 L0 k+ ^6 i3 Z& Kscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
    $ I1 q/ N3 P8 B- ~3 N1 O  nscaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    6 a; q1 l. Z7 q# J#测试将该scaler用于输入数据,变换之后得到的结果同上
    & g& C+ u: r+ {7 Iscaler.transform(X)
    ; H6 |) N( X! G: {#out: 2 |2 R! a7 M, A& B4 o) R
    array([[ 0., -1.22474487,  1.33630621],
    % w: O4 j: y9 z) G4 m& {1 o       [ 1.22474487, 0. , -0.26726124], 4 p* L2 l* V. r
           [-1.22474487,1.22474487, -1.06904497]])  ; D: w- S, u" I( C. [$ P4 L- F5 R
    scaler.transform([[-1., 1., 0.]])  #scale the new data! b6 D9 v/ @% T+ K& g% q
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])
      C$ `- ~+ I) Q. m4 K7 g" z; Y/ v) b0 A5 x$ `+ A
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    % T8 F& F7 {3 d3 e3 p9 ]
    2 R2 q3 x# s2 B
    5 E& u) V& l3 |) }4 G) ]) W
    2.1 MinMaxScaler (最小最大值标准化)8 b. e; M3 I  f4 C: m
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    " ^8 P+ U( z8 a. k7 H2 a
    3 e' s, R/ Q! e9 y7 N# `from sklearn.preprocessing import MinMaxScaler7 y# w! g0 Y( s, k% E" Y1 c
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    : M6 N2 Y) U1 F5 B' k# D) c/ Rmin_max_scaler = MinMaxScaler()
    1 f7 v& U/ j5 _7 m% V7 M. WX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,& |( k" W( l" z/ _. X6 v% i! k

    ) q; }2 i8 ^! E, {" I& Jmin_max_scaler = MinMaxScaler(feature_range=(-1,1))( G# t* @: c1 u' Z( t1 r
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果3 k: z+ n7 u8 o5 z
    + r6 a- H; N1 F! V# `/ ]
    MinMaxScaler的实现* v/ g2 i, `9 f( z- [; v( p" ]
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)): H4 M. |- ?/ `/ O, G% l3 f
    X_scaled = X_std / (max - min) + min
    7 B: Z; C. e8 f' D/ p  D% e) r% I0 f: a+ P
    这是 向量化的表达方式,说明X是矩阵,其中
    * C7 I- Q# B5 E* t( C) `0 e0 e
    7 }: j, t' x1 v  o1 D' T# V& \) `% ~X_std:将X归一化到[0,1]之间
    # H) }2 r* o- [0 e* W: B& y  JX.min(axis=0)表示列最小值+ E( a' ?2 x& w  V% o2 I8 H
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围% v" W( V% ~+ r0 k4 r- |% V6 V

    * E& N+ G3 |% ?+ b( c. F" Z( I& ?+ w7 e6 Y7 S: K* o
    2.2 MaxAbsScaler(绝对值最大标准化)
    % D# N, m  s8 T9 n+ c, s4 b: R8 ~! O         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。3 m4 J/ e( r" I( \: G" E: Q

    ! z5 y5 ~4 l' zX_train = np.array([[ 1., -1.,  2.],
    # a, ^1 s6 u6 T6 r: D8 p: E6 i! I                     [ 2.,  0.,  0.],
    4 I- @; ]$ k5 }" g$ ?9 ?4 Y                    [ 0.,  1., -1.]])
    . A3 s4 M* b$ k7 q& y% M+ Zmax_abs_scaler = preprocessing.MaxAbsScaler(), A4 q  x2 j& ^" j. F
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    8 H) u/ N( t' k# y1 ?4 L& _3 q: l# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]]); i( g4 J5 g1 J& W
    X_test = np.array([[ -3., -1.,  4.]])$ j( g% i2 T% h/ L
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])
      I2 F7 L: x. B# `% z' z( \max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    . z4 }. a$ A% D+ e% C' \, U: ?1 c+ U  a5 ~
    , ]' a6 y% P; Y# `  a1 v% J' j
    : Q. o3 O( Y6 E- {, o& D
    4 I/ H& b, `2 N& M2 k- _
    # X% D1 A# y$ U
    ! R( N/ z' S& g& v

    % Q4 j. I7 W: }9 y  `% b3 m% a. A0 I) H- O
    + k/ {# W8 S+ H2 O+ W: o

    $ a8 v. W+ @1 w0 @4 k- C————————————————
    ; c& g) Z. Q; a, K- z版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    * s5 ?, L+ M6 s$ A3 Q+ d原文链接:https://blog.csdn.net/qq_29831163/article/details/894202230 ]  c& ]7 Q: l/ D
    6 f2 i. F# @+ M7 J9 X& O6 {( P

    , h: J% U7 B  x) b0 k
    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-15 05:02 , Processed in 0.432829 second(s), 51 queries .

    回顶部