QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1958|回复: 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。- M6 ]. Y! _) c' X. F# O% `0 L$ g

    : S5 s- f8 y3 y3 ~( s当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    . S: y: Q  J% }/ F  }3 j, s+ M7 {当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    0 i2 a9 @% W! m  D1 ^1 K: S" G$ l数据变换的目的:
    4 `2 ?4 X  n$ g9 b  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
    " K8 B& k! e* x' b2 w1 Y3 R( b/ ~& Z2 @% @0 i* e0 b
    定义 : 设有n个数据的序列  ,则称映射
    7 M/ ?1 ~* w# E2 u8 g
    : B$ X6 o# ?: f* ?1 V3 Z# y- p$ [+ }                                        4 U1 @; d( r- L0 q8 ^, i

    " Z- m; Y/ U8 L7 s/ W, p6 o          为序列 x到序列 y 的数据变换。
    1 T8 V2 @  \# a& @
    - F4 b( y1 S2 h) O数据变换的七种常见方式' i4 D( k; z$ R1 ?9 V: R$ P: [7 N
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    / S$ z' R+ _# p
    * U2 m; K# m% W/ T1 N0 w1 i初值化变换1 s2 X, Y* ?  |" G* c* f0 o

    ( L5 t% X* `8 {8 |. N9 L* {! F2 ^2 y% @& `7 e
    也就是要对每一个数据,都除以第一个数据。
    6 M% E+ b. X$ M" {) \- i' J* l( O5 h: m' r6 f; E, A$ n
    均值化变换7 I) x  C3 H& _/ n# W

    # g% `6 i; X! F/ H7 `$ @0 \1 Y5 b9 X6 T# e  y. q9 s
                 对每一个数据,都除以均值。* o6 J" o0 W- y* T4 T  P
    & R0 w. C' L6 D
    百分比变换
    % \7 Z# `- [5 m0 D0 R' W) G8 \( Q; h1 j" E! G. @! Z8 Z" b
    ; n: o6 `" w5 C) C! q
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。0 Z  J8 p, {" i0 a( w  \  ~" r
    ) v3 K4 ^3 u7 c/ ^
    倍数变换& {) w0 i/ Z8 ~4 `* e, D
        2 B  f" |/ R! P7 I: ^& x, @

    1 q7 Q4 \- s* \2 a  O! v归一化变换0 b8 T% G0 j" W+ K# A. y
    8 W6 c3 S2 L' Z5 I

    $ |! E! l  U' T0 v! O+ h9 t- i" u 其中   为大于零的某个值,称  是归一化变换。 3 C. y9 @5 f% J- N& _5 u# p2 }- U
    . {; V: K3 }0 J: o% S

    * H$ O1 U4 P4 H$ N8 v. I: c极差最大值化变换
    / j% R' D# \9 y5 x0 q1 k
    8 }0 M% f1 \; I+ n8 G# f5 W
    5 D" j' N" E6 M& c' w5 f' U7 M# |- H6 h+ e7 m7 B& t( }0 [6 h5 C; {
    ) X9 M* i* s8 S4 o5 Q
    区间值化变换
    2 \! q# `" `4 c3 F! K
    . U: D( X, V# `7 {) t
      B( @( v8 m3 o7 _                  ,
    7 g1 U. d! h/ e. d6 W. q4 `+ |3 g
    7 O! T8 I$ M& }4 X& M: Z+ d1. matlab 的mapminmax归一化函数
    * N. Y; [1 x* r# s/ F" l函数用法:; S. z' M7 A! \
    [Xn,Xps]=mapminmax(X,min,max); P( Y) c6 A/ Q: M3 E3 c# V& J/ c3 J
    * w8 ?) r( T0 o' A2 b# W
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。) Q* l3 d8 P0 P% y
    ; ^5 j  ]# X, A9 ^+ C
       (2)min,max规定X的归一化范围,根据需要自行设置
    ) j& H" S6 n; n, {! W$ h
    # h! F& X1 Y5 O& c2 i5 ^   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    , _1 X1 U$ c, _' i7 x5 z: P
    , b3 N! [$ G1 N! u3 s 调用方法:
    8 C4 ^3 R9 F6 r+ [. ?+ B
    . X  W; b2 Q! ^' ?3 {) EX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    $ Y9 Q! {- D* s* |- j5 h9 [/ N+ C) u3 ^- U4 r+ @/ U
    X2=mapminmax('reverse',Xn, Xps);%反归一化
    % @  K7 {* @) g+ P+ @( Z; W* U/ J6 s# g
    x=[1,-1,2;   2,0,0;   0,1,-1]0 b- Z2 B! p1 D1 n% }& T
    [x1,Xps]=mapminmax(x,0,1), C" c7 C- g5 w: w) Y
    5 ^/ S) n; e9 u# a) f

    + }; ~4 X( n: X8 B! U2 w( [- C% j1 w
    对于python中的axis=0 和axis=1的问题& x+ c+ z8 Y- n$ z* l
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    ; I7 Q  s2 T! b% R换句话说:
    + ~/ x* z0 z4 c3 g8 `9 {
    0 a0 x8 `& ^- F5 ^使用0值表示沿着每一列或行标签\索引值向下执行方法
    8 P) t4 `, e/ ]3 ]& F/ t  o8 J使用1值表示沿着每一行或者列标签模向执行对应的方法
    2 K% {6 @: H2 N2 v" S
    4 ]% Z* _9 z( `# @5 m
    & G" b% @0 ~! ]8 p# u& W. S# U, D) [# x- [2 N7 o- p4 V( N
    python的sklearn中 scale函数& m$ q0 P' a) @5 S. P/ ~0 s
    1 标准化,均值去除和按方差比例缩放
    7 q4 i* M$ V7 j9 |+ v% L  u& l) @              (Standardization, or mean removal and variance scaling)
    . L8 x  ?/ |; w! M  K9 E7 L7 R- `) S* N0 d. X9 {" f8 r! T
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    # [9 ]2 x7 x; c1 r0 s3 J6 ]
    ; h2 \: }% s! T: |- H6 z" }from sklearn import preprocessing ) j6 D, ]4 x+ @; j/ @$ a
    import numpy as np    V8 S- U; T# l" g0 j2 U. i
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  2 {) v0 `5 @( z
    X_scaled = preprocessing.scale(X) - e# e; }% J/ \% H* e1 c4 U
    ' ?6 D  X. X9 L+ U) Y
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    / ?+ Y$ c, j: |7 x; X, M2 M                                  [ 1.22474487  0.         -0.26726124]
    1 ^# D, L  t$ D1 J2 y1 P                                  [-1.22474487  1.22474487 -1.06904497]]
    0 w: |+ V# Y* j& i#scaled之后的数据列为零均值,单位方差! k" a" l/ N, G$ X  F' ^6 A
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    0 g0 q; E4 F+ }* {9 fX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    5 ~8 a" @5 L+ f- d, M4 G6 R( ~
      f( F) m" h' A2 v
    ' G( `- o& m' Z6 k. `
    StandardScaler
    " f+ k; D' w  f% NStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    , [# o  b4 `- K+ u; K- t- Z
    : R; i1 m8 }$ ?! e! }5 V8 x- c5 }from sklearn.preprocessing import StandardScaler
      p% v3 s  O' t% o# Q2 bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    2 Y; ~! a. J0 ^% zX_scaler = StandardScaler()
    # w  Q' i1 w6 h: K$ EX_train = X_scaler.fit_transform(x)/ k, s5 \' K: }
    X_train. w( l( v4 ]1 L4 i( R% N8 r
    #结果如下
    7 ?3 q  B% k/ ?* J$ e# X$ i' Zarray([[-1.2817325 , -1.34164079],
    ( S/ _/ T% D) D# C       [ 1.48440157, -0.4472136 ],
    * ^7 t, O! @' X. `4 C* b       [-0.35938143,  0.4472136 ],
    7 a0 Y; d8 }( [$ P1 H       [ 0.15671236,  1.34164079]])8 [9 x3 G& r/ ^

    6 K! P5 J4 Y: g3 x* Q( S4 W4 e) v$ ], G/ R7 K7 n
    0 G/ B% K* x8 W; l

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      ( Y( U1 b( w7 W) o% E! O0 x
    from sklearn.preprocessing import StandardScaler: n! J/ _) L" J: h& U6 o( F( t" C
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    6 ~6 a" T( u  c. \# G2 b; NX_scaler = StandardScaler()* y$ c1 |, W9 R- ]
    X_train = X_scaler.fit_transform(x). Y* A& Y" v  c4 O2 @+ Y: J: l2 h4 g
    X_train0 p3 _4 ?* D3 U
    #结果如下0 K6 M* ?- E0 C, W2 X' d
    array([[-1.2817325 , -1.34164079],
    % i8 R# d* P* p7 y- c       [ 1.48440157, -0.4472136 ],
    ( B1 A. t( I! i+ `       [-0.35938143,  0.4472136 ],
    + A# ~, {* P# T6 ]$ D       [ 0.15671236,  1.34164079]])
    ' V+ [: H% D' y( _
    : ~+ {: A+ [0 Y- N( ~0 F- |scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)8 R9 D& o8 t# P& `, b. ^, w8 K
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
    # A9 b- Z% F; Z2 m8 u! D8 lscaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])   P  p1 P$ T0 E8 ?. f8 Q
    #测试将该scaler用于输入数据,变换之后得到的结果同上
    0 R( c7 S3 `! S/ a2 bscaler.transform(X) ! O0 b7 o/ ^5 G: @* c
    #out: ) l" L( g/ T8 M2 @2 E! |4 O+ R
    array([[ 0., -1.22474487,  1.33630621], ' e9 h: @5 M5 v2 v, D. e
           [ 1.22474487, 0. , -0.26726124], + U  N! A" S) P3 [8 ~# b
           [-1.22474487,1.22474487, -1.06904497]])  
    / g- e) }0 X0 l8 S- Nscaler.transform([[-1., 1., 0.]])  #scale the new data
    * b5 p. g# ?6 ]$ ?# out: array([[-2.44948974,  1.22474487, -0.26726124]])' u' S$ B* X1 I- h
    ; t- Z  _4 M" a+ H2 V+ R3 E
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    : O' E  l. ?0 Q1 x8 S
    & M3 V) a6 n+ A, z& |. ^6 A' w+ f: g

    ) q1 @# c/ B6 @* A2 r! ~2.1 MinMaxScaler (最小最大值标准化)
    9 W: b/ E5 y# r2 Y  f 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  / G! [3 {. Y) J: i/ G" l
    " _* C1 x5 \: L* T
    from sklearn.preprocessing import MinMaxScaler
    : M7 S6 r: i0 ~$ Nx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    ! i2 g/ M$ H! emin_max_scaler = MinMaxScaler()3 m! ]0 j$ c  v0 q/ v* x
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    6 g% b( Y* ~/ S( v. X7 n) C7 O' Q# l) {; t2 P) P
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    ' k5 h( n" _. i! ?0 _' O8 wX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    8 {% W6 q! N& [% P3 }
    % J0 K' u% X( V) I. K) T7 IMinMaxScaler的实现
    % c' q8 D! t, s+ l5 tX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))9 B# r( J4 ^' \  ^9 m
    X_scaled = X_std / (max - min) + min( x! _" G# a3 S, z% u/ P, H4 Y0 n
    . q/ A- y4 R3 ]) e
    这是 向量化的表达方式,说明X是矩阵,其中
    ! z9 x% _& {! g" C% o
    ; X7 n2 @( {8 c4 f0 R' N6 l8 aX_std:将X归一化到[0,1]之间
    6 @( ?! ?9 K3 LX.min(axis=0)表示列最小值1 ^( V, ~% P" I
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    - p. h1 q3 n1 c0 J1 w& m
    ; N4 p' h" ~2 R9 ^
    " v9 W; c7 x5 a2.2 MaxAbsScaler(绝对值最大标准化)3 G5 P; z( |" z) Z1 l8 N' T/ f  i5 s
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    " Z" g* v8 i5 X
    8 O% v  _+ Q: l2 WX_train = np.array([[ 1., -1.,  2.],* f% q9 F; G9 `  G
                         [ 2.,  0.,  0.],+ }7 L5 p( C$ R. e- W8 _& D
                        [ 0.,  1., -1.]])
    ( y, Q6 ^9 Z- ~max_abs_scaler = preprocessing.MaxAbsScaler()
    / P' d/ t; Y3 PX_train_maxabs = max_abs_scaler.fit_transform(X_train)
    2 b6 d6 t7 t0 D0 o' ?0 U" ~4 l# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    ) D: h$ A5 Y7 S9 K2 yX_test = np.array([[ -3., -1.,  4.]])" Q0 v6 j  P; V* Q7 ]* N$ h' G& [
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])7 Z! A0 p7 s8 b5 S' y
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])$ v' O" [5 Z8 N8 S

    9 z* ~: z, r/ Z9 C9 ~1 B$ U! Z- o8 G  \
    2 h# g0 g3 }2 k& x# V) x2 F
    - w$ Z, Z6 B& d  ^+ f, s* y

    # \8 W3 j4 I9 Y9 [' K+ r* u3 V0 Z: a: N. w( ~; U( ]
    / R1 z9 Q: g6 g1 w4 z
    5 {( S/ q* [" O  i3 l$ |$ _8 F

      I- N% e1 q! a1 w% t/ d0 X- c0 T
    . W& Y. c2 i% A, B* P9 ~* S1 `————————————————
    ; R4 d4 r0 M4 Z版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) d! C/ I0 e$ K, p3 @9 ]. M0 k原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    % E+ j% W: `# m* E, u
    ) [  u2 m0 ~& n# X1 N( i, |: g# \( M3 I) d" h" Y/ `$ I
    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-13 06:48 , Processed in 1.023139 second(s), 51 queries .

    回顶部