QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2018|回复: 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" M; B* W% y* x0 |- T7 k- {" h
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler6 R* H' _$ f/ g7 y0 b
    当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    / V; `9 o0 w8 e2 F  K4 y数据变换的目的:# `0 `/ v0 E  K5 L# P4 ~
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。+ p2 K" X: ?/ g7 J: T
    1 ?8 s$ d) D  L* T6 H2 O
    定义 : 设有n个数据的序列  ,则称映射% j( |. M, v* E5 K" ]9 G

    % ~5 Y; d) S- l                                        1 C2 I) \) L* L3 |4 a
    + j) ]$ X  q6 r& k
              为序列 x到序列 y 的数据变换。 ! z7 K% b1 \! o% r8 |
    1 u* G1 j9 {, f$ ~  ~
    数据变换的七种常见方式
    , O- M' }) t3 l此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。) L+ U0 c8 W! w6 s5 }5 [1 z
    9 L+ @; q: N6 ]3 d- y  v; T& u
    初值化变换
    + Z5 i2 g0 ]* q  ^& U1 x$ P
    * z2 U8 s8 d* h) v6 ~
    ! G3 f, K3 n& z 也就是要对每一个数据,都除以第一个数据。+ S# l& c4 |. U6 Y% W2 A! q# D* \
    4 l% _" R; W2 U1 l' |6 K" N8 k
    均值化变换
    # w+ z! H3 Y) V
    3 M' |% G) d6 h* d9 G7 u- {: S& c8 b& C
                 对每一个数据,都除以均值。( w9 n8 v$ K3 N
    : W0 r0 [$ R/ V/ a$ t* ?- B
    百分比变换  W/ J3 a1 ?# m) u; j
    : ]. f# f4 }( q0 t5 ?

    8 F# A3 d. c/ w5 O/ s+ o分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。) x7 [3 y7 v# a

    7 U4 u# f' E3 H4 E4 W) n/ V, p# Y倍数变换0 B6 c# H4 Q9 c8 T6 q; B. N
        1 w: j3 w! p  t- @
    " t, x: B8 n5 [
    归一化变换# p- y$ _! A) j- ?& \
    ! y- C8 q7 p. a

    . Q7 |0 z$ V# G9 o  I8 j 其中   为大于零的某个值,称  是归一化变换。   A* N" }( L; ?$ i) A1 d4 X( Q
    / _* p/ j( G2 w( s

    - e- `# n5 R! s; [1 W6 `) O极差最大值化变换6 p9 a9 }5 q( x) j! S
    : v; u% K3 }+ c$ h

    * o7 T" Y$ ?. g+ X* s2 N3 G& q7 @* M# r& b4 z- A8 }

    1 Z( @& S1 e: E$ V9 M. m区间值化变换& M2 t/ f4 \) U8 V; p& F

      Q  F2 F7 g4 A& Q: ?* A( H- v2 b- T& d8 D' J3 y
                      ,+ s0 \9 J! e/ @5 B4 s. f

    : F* h# Q0 ]. K$ ~/ J' _1. matlab 的mapminmax归一化函数
    ; K0 K- k8 B$ |7 w8 I* m% y函数用法:
    % F7 N/ _! K* y9 s [Xn,Xps]=mapminmax(X,min,max)
    . v( o# B5 H- d+ e) u) o. U; ~( r) K8 w# Q- u
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    # b* U9 s( c0 F* J0 A8 U$ d9 O0 |/ D2 G1 T' q
       (2)min,max规定X的归一化范围,根据需要自行设置
    # W: t. L1 Z6 P
    % t# R0 _) C( Q: }0 j2 s   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     % u0 D% i; V9 i* _; S  {# H: y5 p7 D

    / t, h% p* g: ^! E 调用方法:6 @: s/ X$ o5 T$ }9 u. F. T
      _1 F9 h9 K2 J: ?! {9 H
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    6 g$ l3 O1 A7 ^
    6 r7 Q2 \& q8 m2 Y! oX2=mapminmax('reverse',Xn, Xps);%反归一化
    3 A5 D) f2 ]7 s1 X3 D+ J8 b" v: N& ^* y; ]. J+ F# q' q
    x=[1,-1,2;   2,0,0;   0,1,-1]( q# W# T" l6 ?6 ?
    [x1,Xps]=mapminmax(x,0,1): K) A! Y6 O- q- l; h

    5 l( ^1 Z7 D$ W+ y% N
    1 R& J0 R7 w4 ]5 d: l, l" r8 \: s0 }+ H4 X
    对于python中的axis=0 和axis=1的问题
    ) f- g. @8 ^$ T7 r8 N% ]% `$ t 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    5 O7 j& C: |; }& \% E+ I# x% L换句话说:
    2 B6 B9 B6 i- r, q$ i3 J% d+ `$ R- }$ K+ n
    使用0值表示沿着每一列或行标签\索引值向下执行方法9 ~( F  s) x" x! v/ R/ r
    使用1值表示沿着每一行或者列标签模向执行对应的方法' u0 |+ g, }7 A" U5 M: G) Z$ B: a
    $ u9 ?! ], y0 D" \4 R8 c; O

    - f' P  O& D' i. ^; v7 ~. U
    0 P* d4 a. [7 \0 t7 X6 _* B, v$ fpython的sklearn中 scale函数. K. ~' S( N/ c) R" @- ~) S
    1 标准化,均值去除和按方差比例缩放) q1 r, J# H* a* i2 d
                  (Standardization, or mean removal and variance scaling)
    & d7 T" x4 ?1 @8 f/ ]& f
    3 E8 [- ^$ H. E  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。3 L5 X& m  t8 }% g, J$ G
    9 w( s4 p2 P8 V( F8 g3 ~! n
    from sklearn import preprocessing
    ! F2 ^* y& ~( R/ K: v# {import numpy as np  0 M& P* q- V* i/ w
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    : q6 N) r5 T' B& n* E' _6 Z0 [X_scaled = preprocessing.scale(X)
    7 ~. t3 z5 _2 U* }  Q4 ^+ S- r  N* X. R! ^, d
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]
    4 Y+ _; W2 R$ E4 ?                                  [ 1.22474487  0.         -0.26726124], g9 \6 l) }1 D" A4 V% P$ i+ k
                                     [-1.22474487  1.22474487 -1.06904497]]
    8 {$ q- \5 m! c3 O#scaled之后的数据列为零均值,单位方差
    ! D7 e! X/ q! {) k1 o2 D3 fX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  2 h- q0 h- T2 W  g5 E$ l
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])1 x1 u) b3 W- n2 y4 u# U/ ?0 i

    ) `/ v& ?2 J+ B9 _) q/ |% i. e5 |# a4 e; P, \, O
    ! v% ~7 n+ ^+ x* y! ]
    StandardScaler
    - `" l: @8 E$ j! ?; Y6 s6 TStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 E3 W# V! N1 K- F5 I& I* b" u

    ) G/ u% J* j/ ?# n/ V% j# G/ _from sklearn.preprocessing import StandardScaler
    3 G! o7 o2 G. Q! r7 A! K6 m. mx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    : v: V% B8 M- |# b( P; p  f  wX_scaler = StandardScaler()2 m4 k: y9 T. J8 Y
    X_train = X_scaler.fit_transform(x)
    ( b9 U4 m- a7 xX_train  F" N* b& ]/ F+ |! Q, M$ B
    #结果如下
    ) L- i3 t  H% |' narray([[-1.2817325 , -1.34164079],
    3 L3 ]' E/ G( P7 H2 y1 `2 I' ~       [ 1.48440157, -0.4472136 ],
    - ~  |2 p7 U; Y, Q& l       [-0.35938143,  0.4472136 ]," y1 Y+ o5 z8 [
           [ 0.15671236,  1.34164079]]): B/ O: w6 W5 _& J. U
    # S4 K. E; V, t
    1 r, p7 p. l: G* M

    8 D) L( n5 f  T# R6 {% |4 h7 x

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      ; D8 b2 p7 {$ c) X6 Y/ m6 }
    from sklearn.preprocessing import StandardScaler
    " ~$ @5 u$ f! i: d# Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]
    7 \& N# |& T5 s9 s4 E0 D# VX_scaler = StandardScaler()
    ! I/ m$ O5 m- g+ D0 {X_train = X_scaler.fit_transform(x)# ^& R# f/ G- ^1 ?! _
    X_train
    8 l, F, C0 [1 N  L1 f#结果如下
    ! i/ A) W9 ~! m6 Z8 Marray([[-1.2817325 , -1.34164079],
    6 Q" T1 s5 x% ], l       [ 1.48440157, -0.4472136 ],& l/ o9 I2 ]' A0 u: o* L9 A
           [-0.35938143,  0.4472136 ],! J8 K" v  {! Q" A% V
           [ 0.15671236,  1.34164079]])
    4 U" l0 @4 n) s9 s- G5 c
      V, {# @# D, t; F: [1 oscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    " Y, B: G( `$ U0 z) nscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
      |6 g/ }6 b$ }5 V9 x. [3 Fscaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    , k: D" x$ z; K) P$ w#测试将该scaler用于输入数据,变换之后得到的结果同上  D3 a# Q. l  V/ T6 @2 @+ y" q
    scaler.transform(X)
    9 F6 a1 f6 ~) l, z' e3 K0 O* \! u#out:
    % Q8 {) q$ O  [. L+ _* X  harray([[ 0., -1.22474487,  1.33630621], / x1 J9 P; K! w/ B$ D5 m
           [ 1.22474487, 0. , -0.26726124],
    & U5 `7 [, Z4 ^2 E; n1 j       [-1.22474487,1.22474487, -1.06904497]])  
    + b( N0 |" [0 a, i6 g6 R9 |% h" p# _8 m7 wscaler.transform([[-1., 1., 0.]])  #scale the new data
    / R) U. E+ N7 x* i2 _# out: array([[-2.44948974,  1.22474487, -0.26726124]])( A7 v2 Z2 g+ H3 u' G( q

    8 {2 i% @3 f9 C9 Z1 P6 _2 将数据特征缩放至某一范围(scalingfeatures to a range); h$ d& w5 U* M' L' g
    4 K/ _9 h/ \) C4 f6 s+ Y

    ) V& u9 i$ a# `% q( b& j2.1 MinMaxScaler (最小最大值标准化)$ `2 Z' O# E1 l. f0 d6 Z' T
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  ) `8 f4 G" w" T+ t+ ^

    $ m# q+ U- T+ }& p# V$ g0 V$ q& z+ ffrom sklearn.preprocessing import MinMaxScaler# l& f& Z0 ]+ R0 S- U6 {
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    * P% |: J* D# S  Amin_max_scaler = MinMaxScaler()
      M8 F& }* O" E9 K' VX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
    ) ]& p: P  G0 n9 I$ ~' ^: |" M7 c5 V- `
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))3 v# m3 `. ~. J) F  W& F- a6 z
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果4 b$ h0 |; e0 h" ]1 P
    + _  j' Y2 K0 V* X! C7 w
    MinMaxScaler的实现
    3 K9 r' E" }  n; B) j7 I- MX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    / q5 g6 V8 ?4 q, ]% C8 rX_scaled = X_std / (max - min) + min
    1 d  q1 G* v0 o8 T- U& _  q  s8 D
    这是 向量化的表达方式,说明X是矩阵,其中
    ! a& d" V  ^* H$ U9 M' I7 y
      j5 V' j- c" b: h4 I9 f* JX_std:将X归一化到[0,1]之间
    # k+ H- X* K. cX.min(axis=0)表示列最小值% P; F9 y, ]  X2 x! `3 v) S0 P
    max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    # O+ u/ h, R" u% M! ~: x
    ( j8 ~& J# m% }7 O* F6 |2 t3 k
    & w9 b1 u4 d4 J- f0 C2.2 MaxAbsScaler(绝对值最大标准化)
    % `7 P' `* H$ g) m         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    0 ~, }4 g- G" {3 U: j" d9 I0 ^& I
    : T6 _8 I0 Q. i& BX_train = np.array([[ 1., -1.,  2.],5 C' j6 O% W9 @& {3 E# u) |
                         [ 2.,  0.,  0.],
    / Y- z8 h+ `8 J8 a- T                    [ 0.,  1., -1.]])5 B6 {+ N9 @9 j1 Y: f) A
    max_abs_scaler = preprocessing.MaxAbsScaler()- N9 O$ d* p! ~+ X6 g  o
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)- ~2 J3 j- V( n& x' Z
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])+ L- o( \: G1 h' c! ~% Y; M
    X_test = np.array([[ -3., -1.,  4.]])! `, y' t& X9 \* U( ~( s
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]]), S' ?" A- k: w: C; {- P% g
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])" z3 {* P3 @! b7 v" s1 v! N! P' v

    ! s; l3 o( t- L. y% w7 L' h4 E* L4 A5 H+ m0 S* Q; o+ t/ h7 b

    & l0 x3 g1 ^0 F
    & h! r2 R8 o2 U6 n/ r
    5 _2 D( \2 L6 W! Z2 ~% ^$ C( D( m" J+ o: q8 @$ r) U$ e
    6 A3 M4 k, H* @4 x$ ~
    ( }, @" X" [; v' J' o6 C$ p
    8 h. V" b# j- n% P9 o! n
    " ]/ P# Z1 t7 `
    ————————————————5 ^/ v3 |1 B1 e4 W/ t
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 R% p. `  n& `2 L# N. L0 m8 M原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
      K3 ]! H$ U$ o5 T- R
    6 R* H# S2 l$ w+ h3 w5 [, v: G& H4 t: f4 c  Z! V
    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-8-1 14:55 , Processed in 0.392816 second(s), 50 queries .

    回顶部