QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1993|回复: 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。; X" w* L- J* {
    " [+ }& [( k+ `7 E# g
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    - J  b% c( p/ c1 \$ |- p当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler& U5 n3 h+ o" Z5 M9 E9 c3 z; e! _
    数据变换的目的:
    ' y( g7 g2 B/ E  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    ( {0 v  ^4 ~2 Z- J$ }1 [+ k2 E  T7 r5 N3 f! S1 B
    定义 : 设有n个数据的序列  ,则称映射
    7 C) L2 |: k* E+ a( \
    ! T7 O1 E: Q' J. N* ~1 o                                        1 L2 C, b/ p5 g* q: x! E% u. L

    ; A0 j+ o3 F: _6 w" f2 ~( z          为序列 x到序列 y 的数据变换。 5 z, w; d: _, i" C7 b( {5 I. Y( k

    4 c1 e# x8 q' Y  i/ b1 |数据变换的七种常见方式
    3 ~& ~0 C  Y+ N6 Q0 ?# e/ r此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    ) f; m% M9 G* h+ J; o" o# U5 Z" t  o- R  K/ r
    初值化变换
    4 v* e# o3 z( W3 \  o: s2 l7 h# o+ X8 p$ n# ?, E3 j

    6 j3 f, s" Z8 N0 a3 U' W- p 也就是要对每一个数据,都除以第一个数据。
    6 m; ~' c) B/ n0 N/ Q
    ! e- {* t$ u1 Z$ Z5 s& q( _均值化变换
    & s# u/ U, Y1 K% `- a  K+ p& B. x
    % w+ k/ O# w; t" p7 o1 A
    ( G+ [& R; [2 _             对每一个数据,都除以均值。
    $ [; a! z% |# H5 ]( A" [! d2 j7 {+ _4 j% s# y$ A8 V3 j$ W! F+ I6 a
    百分比变换
    ; p6 T  x3 g$ i, \( \9 s/ ^
    5 n; W$ H) |2 l! `+ R0 V, H2 u
    0 E: z& Q8 v8 m分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
    " x% W' J' {, g3 \" x9 R- ?  n$ a7 C$ S% K
    倍数变换9 Z/ }$ \. f8 o
        $ E) n4 g/ O1 X: d& h. W2 ]

    - S9 U0 {- ^8 Z' b' D) F归一化变换* [: I5 ?  O4 f& m9 Z
    ! s7 E, ~/ Q& [% |/ |- k0 C/ [

    7 C$ D' O# k) z: M% `4 O: }$ K 其中   为大于零的某个值,称  是归一化变换。
    ; Z6 C& O; }+ ?' ^
    ) G& P) r% r, Z6 D$ r+ b7 L
    5 z" l7 Y0 H' u$ `6 X$ @. A极差最大值化变换
    % I" D. U1 P! d# s. I' y0 n+ V: e" Z4 n' Y) K3 X1 s
    4 ?' H; `$ D/ ^8 H! c
    ) L( G! M' ]& `+ O* c3 h

    5 V: b- P) b6 o* m区间值化变换
    ; p4 e1 Z, B3 N! p, D% v! A4 g
    ' m' }7 a4 T( s) L0 _* d  T8 z3 [9 W1 ?+ T8 e/ m. E/ X
                      ,
    : M, r3 j4 \' u  {
    9 y" z$ D* }% {: @# B2 W, b9 Y1. matlab 的mapminmax归一化函数
    ' l4 o/ \5 G& l  t函数用法:
    6 S8 u: I# \  K' S5 h6 h [Xn,Xps]=mapminmax(X,min,max)
    ; m" r/ M5 X# R
    $ D* d2 W8 t( ?& r说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。; v$ M( i3 M% h+ s

      E. O2 O* n8 o. m   (2)min,max规定X的归一化范围,根据需要自行设置
    8 ~! Y  C* e- k3 m& T+ q  p6 s* d+ h4 ~" ^. `. z; w
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    " ^7 b5 c* o1 F$ G7 c1 j/ C, }' P+ S: M  R$ ~
     调用方法:' i' G7 q% l- m$ W- f+ }
    6 Q( A4 ]5 z2 k( i1 \! a
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化( b9 N7 _* C5 [
    : K8 U, V5 ?$ _! p7 Q) a
    X2=mapminmax('reverse',Xn, Xps);%反归一化
    2 T  ?' ]& F) J3 }/ C. Q. v' L# d! p
    x=[1,-1,2;   2,0,0;   0,1,-1]( r' z7 m3 w5 ]6 Z
    [x1,Xps]=mapminmax(x,0,1)
    " o8 n) u; \5 s, R) D
    - e- U$ ~7 n  C! y  Z1 M% M5 k! N4 e+ n

    " m6 r& S( p9 h0 k2 h7 I9 b对于python中的axis=0 和axis=1的问题( T' V$ L7 N% m" t( ]! d
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注), E1 ?0 G  S8 B
    换句话说:) q' d; d/ l0 [4 T
    3 T* r8 Y$ L0 r5 _8 `$ S; [
    使用0值表示沿着每一列或行标签\索引值向下执行方法
    5 B4 Y2 z+ B+ k. [" q- r* F& t使用1值表示沿着每一行或者列标签模向执行对应的方法
    2 M6 h+ J  w# F2 d. ]. Y3 x, |- x/ }! {% m+ h( ^2 z9 Q5 P4 ^. {
    2 m) D1 Y" @/ O6 v: ^: a& t

    ( T. z0 s8 B# |+ |4 z8 y/ ]python的sklearn中 scale函数
    $ |( W& a* n2 r# h1 标准化,均值去除和按方差比例缩放
    / ~! r9 Q3 z1 ~! |0 Y* G1 R0 M              (Standardization, or mean removal and variance scaling)1 j7 d( ]* J8 ^$ D/ y5 q/ m# K

    6 [- E4 X( Z, @# @$ X  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    ) H  `' p. T1 Q7 b% f5 P1 X1 i) b$ I, c" g8 [2 k4 \
    from sklearn import preprocessing
    6 a: i7 E! Y% t# u2 |  ?1 a- D* Qimport numpy as np  ' j3 h7 E9 i; X- R: ~. L
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  , k- M) |  {$ S9 {; \
    X_scaled = preprocessing.scale(X) $ ~5 g- W, M) i# E  a$ ~8 B: Z, ?
    7 E2 y# y" S+ z
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    + |2 W+ C6 {1 K; u+ W( W% ?+ l                                  [ 1.22474487  0.         -0.26726124]
    5 i9 m7 Q0 P. _( m* E2 m; e                                  [-1.22474487  1.22474487 -1.06904497]]1 W1 \/ p7 M/ ?! ]" C
    #scaled之后的数据列为零均值,单位方差
    . G8 o, ?8 q: n3 k) d" W& y, q; u- HX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  9 s7 e% d4 }6 ^  y' d& [) [
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])- |: `( L( b. f- T; l8 Z) @
    4 l2 P8 \4 `. F+ _
    ) F1 D+ V9 G) [( p. ^

    # D' E) m4 m  N3 T( L( E. NStandardScaler
    5 q( l! X( K( I& MStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)9 e3 j" `8 i# ~/ f' ?

    " [5 z6 _! R( hfrom sklearn.preprocessing import StandardScaler8 v/ A: [: _% ?
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]3 v. U, c, x$ A, z9 F0 T
    X_scaler = StandardScaler()) J: M4 ?% B: J: M. @  b
    X_train = X_scaler.fit_transform(x)
    8 ?8 h' f  y5 w* D6 ]  yX_train( B. S7 m& L$ ^9 o
    #结果如下
    # @3 N# T; h0 F# u. H  r+ c( i9 }3 Narray([[-1.2817325 , -1.34164079],
    $ q9 e% i6 A# f       [ 1.48440157, -0.4472136 ],1 G7 g, }- g+ e8 k6 ?, S- L, A
           [-0.35938143,  0.4472136 ],
    ! M' s; g0 t/ g/ N" v& q9 N. k- K       [ 0.15671236,  1.34164079]])
    0 u) e  }: h8 @# C* N
    4 L8 g- i8 _4 X' n. I
    - q5 @# |  f  V# o( k
    & _8 h9 R4 b5 [, x3 |. Z+ \

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。$ v6 }) q2 L5 P$ S% v9 @
    from sklearn.preprocessing import StandardScaler
    ; V9 X8 R( p* {* l, v& zx=[[10001,2],[16020,4],[12008,6],[13131,8]]  ^! s% b6 \8 C1 M
    X_scaler = StandardScaler()2 m& z5 b7 h- M; p0 n
    X_train = X_scaler.fit_transform(x)" E8 V, g3 }) E7 e/ ?# }; k
    X_train+ z, B- `( I1 O7 S9 g
    #结果如下
    ; n- h2 _* c" J" x! narray([[-1.2817325 , -1.34164079],
    " Z8 {/ E5 J8 }* _/ A# W# L       [ 1.48440157, -0.4472136 ],  M5 i$ L- z  L3 N, z1 H6 a4 H/ F
           [-0.35938143,  0.4472136 ],
    1 S% Z+ F0 q. {' c       [ 0.15671236,  1.34164079]])
    4 V7 m4 O/ r) g9 @5 ^5 Z, D: ]+ F: C; r( @
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True), F* M& i+ J; f& [" M
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  ( }& L9 }- }' j
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    ! P6 a1 s; n, G( U* Y6 x9 ~#测试将该scaler用于输入数据,变换之后得到的结果同上/ B7 c: R% K, [" P9 r/ u" g
    scaler.transform(X)
    * N. D# \' m9 m) e#out: 2 O) @" j) a" i
    array([[ 0., -1.22474487,  1.33630621], % K5 Q) {' M# I$ d0 Q+ {6 k! i
           [ 1.22474487, 0. , -0.26726124], 2 ]' W6 U! f- ^( s6 H
           [-1.22474487,1.22474487, -1.06904497]])  
    - Y$ r5 a" D/ q7 r5 v# r' p  C, Iscaler.transform([[-1., 1., 0.]])  #scale the new data
    3 j% h% U# b  N% d  ^7 a* s# out: array([[-2.44948974,  1.22474487, -0.26726124]])1 K& \/ e) F) `( I$ z" O" b
    0 i5 I. k( _0 U4 G
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    0 w, q# c0 [4 Q, M) z: z ) @7 l' Q% f9 u8 c# _9 h& {

    0 o/ S( `$ g" d2.1 MinMaxScaler (最小最大值标准化)& I# ]* p  v/ l3 v" {
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    - }& n6 [7 {% u
    8 }2 `& {# c2 f4 x) _! zfrom sklearn.preprocessing import MinMaxScaler, t# Q; L5 O# w
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]( ^- r/ Q; h8 G1 ?
    min_max_scaler = MinMaxScaler()5 r) U0 ?, D# q
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    # U2 o6 p5 X( L
    0 }* w) L3 T6 A9 Umin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    # {- g7 O; S3 ^0 B  W' H. @: dX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    & h# A, P0 _' z& [; \$ J4 R( ^
    : A5 e# t1 I+ M9 c$ `MinMaxScaler的实现/ H' M5 C) D* `9 B
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    # C% g0 Q# }2 p1 b3 g% S  B9 yX_scaled = X_std / (max - min) + min
    # t. I9 l3 Q0 J+ A
    ( }4 d8 W- \" r. ?2 s, z- x这是 向量化的表达方式,说明X是矩阵,其中
    " B& N: V9 ?7 g) K5 q+ a0 ~1 ?; x" R; L% }" o7 s5 Y
    X_std:将X归一化到[0,1]之间2 |! n* R0 d& F/ q8 s. A! V; u2 x
    X.min(axis=0)表示列最小值
    ! |& I) n! j$ ^7 P: Y& _max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围% Z  E# F' H" w4 \' o# q/ Y; O1 t

    * n" u2 {+ d- V6 V: I9 U( S2 c, t
    2.2 MaxAbsScaler(绝对值最大标准化)2 a# \- m! E$ P% t
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。  J5 k  s9 Q" b! L+ K

    3 v4 p; v, w) [% J( P: `X_train = np.array([[ 1., -1.,  2.],' w6 v5 Z- d7 B* R$ d& A' _  B
                         [ 2.,  0.,  0.],
    & M. s  }, B  R4 r2 f                    [ 0.,  1., -1.]])- a4 Z/ b4 ^5 i0 N3 n( N' P! |
    max_abs_scaler = preprocessing.MaxAbsScaler()* a) J! m; r+ r! P2 _+ B
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    + a" G8 A3 [. v% b# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])- `1 P0 s. C6 u' t
    X_test = np.array([[ -3., -1.,  4.]])5 B# f& J5 j  M+ l% T2 |
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])5 p9 S# Y& P. m* M
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    ! p* b. K' T5 m. E7 I1 t0 i" Y0 e- V6 K  J- o$ ?

    * X+ D8 q$ \/ A' B% M% q" A
    # i% |9 u* d' J5 \! e6 f4 e' O; a( N4 r* M" z5 K

    6 |# q# f& u6 @3 h: _8 u& p' m8 N& [; M2 g; Y; H6 R
    7 \+ ], [' }$ Z4 b/ P3 e
    1 Y8 T- r! X0 }$ n# \

    ! v" x! s2 k, d$ M  e
    3 q. l9 g0 Y- ?9 N————————————————
    & z2 H" K( ~& {版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# V0 g( P" c+ g( r1 A; D
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    # Y3 u$ T, i+ U" S& \
    2 l# `; g0 L+ ^- Z2 f' H( s4 s. N( ]/ ]9 d& 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-6-15 03:43 , Processed in 0.399828 second(s), 51 queries .

    回顶部