QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2016|回复: 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。& f* I, t2 b: v+ H1 j5 J. Q7 e

    4 U9 e1 ]9 W- f# U当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler3 l0 U9 u3 t; c# L
    当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler% P, l) f7 i  U! n! V
    数据变换的目的:
    / [) p) W( i" W  C/ V  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。. H3 ^" ?) g5 U+ C+ b2 }  _
    5 B* |) r6 }- ?9 @
    定义 : 设有n个数据的序列  ,则称映射9 [3 W2 U9 P  g3 V" A9 B4 u

    , L2 t2 @8 N: s                                       
    & u+ R6 e& n% K. x
    + u. n8 `  M& k2 ]  g/ u0 K          为序列 x到序列 y 的数据变换。 % {7 s2 P* w6 [- v  p5 w& o
    2 A; d3 X) Q0 ?+ Y2 e5 W6 r' P
    数据变换的七种常见方式0 G5 @9 t+ o; l6 }+ e
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    , K2 s) \$ a+ d& Z0 c9 u
    ; ~2 ?' @' V6 C$ t初值化变换6 `4 B+ p$ N0 @
    3 t& S( Q, G& r1 P

    0 n0 {* v2 ?: g4 ~: @ 也就是要对每一个数据,都除以第一个数据。
    2 T! u* K& b! H# ^) x$ O7 I% q, |7 |! e2 @' |9 T. a
    均值化变换
    ! ~  f$ K/ `! i  l! g& `: w& j$ s7 L3 m

    1 j1 H+ i% P7 `2 k. o             对每一个数据,都除以均值。
    / T  ]5 Z# \. s3 I, `! C( N0 ]3 L
    ( D( ^( J" O8 A, U! h+ X5 W百分比变换# A  G& \! I, ?3 @$ o# H

    ; x; T" N, p1 `/ w# t5 p4 @
    # K1 J+ Q" b8 S( ^# |2 `分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。; F8 u" x/ Y( _
    4 _; G* r6 U- a2 E% w) S8 ^
    倍数变换5 J: W/ l& H5 s4 x* ]
       
    * F7 o( W4 o- y& \# d; _8 E$ _/ L1 z4 M9 A7 r" H* j$ a6 w# {
    归一化变换1 j! H4 H9 A7 @* z; E3 Z
    0 d& @0 l0 d; ]$ w' w$ f
    ) Q0 U+ y. P+ m7 z8 Z* f
    其中   为大于零的某个值,称  是归一化变换。 : h  ?3 \# s- M/ m$ z7 m
    ( s7 C5 Z5 g, p8 ?1 t

    . _9 U# R3 q6 }5 `' v极差最大值化变换  |& b: a# x) f! a! Z: S2 i
    ! k1 X9 `( q! K4 ?. y3 M; ~! p3 Q
    9 \4 o0 M  |/ n0 e

    ) e( x. s: f$ T/ U
    " c5 v9 @- ~+ j7 ^" s# i' v) w' i区间值化变换. x( W% v5 K( S# e

    . Y! T1 p' w& @# O8 G
    ! }! l, @! z4 W- b  {. G                  ,( B& K: H% E; n7 s. {% g& x5 ~& Z$ I
    5 h" O: e% E! V2 J2 i" ~0 A" B
    1. matlab 的mapminmax归一化函数
    6 g7 Q1 ]3 s/ l! Y! J2 |  u; `4 \函数用法:$ ~( h: U' Z+ V
    [Xn,Xps]=mapminmax(X,min,max): H8 ]) y( K6 I3 c  h0 ~
    3 J7 A. t3 r$ P5 S- }1 h5 i
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    ' i( v0 p" r0 E0 r
    & l5 L1 F6 e) p. J2 o6 f   (2)min,max规定X的归一化范围,根据需要自行设置# o' ?, e% ~( j; {: t

    . Z" r% D- L! \. W2 n% `0 l+ w+ M   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     
    7 l0 E/ m+ H6 {5 @# p+ t/ {
    ; o% ^2 ?* w  `. g( ]2 V% S9 S 调用方法:9 M$ ~9 `. \+ G

    ! u. t7 t. h6 M7 ^* z) H3 pX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
    . r  l3 F4 [7 \$ h- c2 w3 V: }# {. n8 t0 a
    X2=mapminmax('reverse',Xn, Xps);%反归一化
    - Z. M" b: I, u$ L# }5 n  F0 o) _5 u, N7 @6 W! C$ b5 w
    x=[1,-1,2;   2,0,0;   0,1,-1]
    2 s# u3 U) z2 {, E9 ~3 c) c[x1,Xps]=mapminmax(x,0,1)
    ! w+ Z3 r% i, C
    & n  a0 n# f& n9 o5 z0 w$ w( J& Z+ l0 l( m6 r

    4 g) w' U& i4 t. ~" s% ~$ L: \对于python中的axis=0 和axis=1的问题
      A7 L" q7 u, ~5 P3 r1 S' n 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)/ U& }) _( t; L: w* t+ k) o) c, P
    换句话说:( H: o% a- r, t$ R

    / m0 f5 U  t3 z& [  I1 z使用0值表示沿着每一列或行标签\索引值向下执行方法3 A, m" L' t* A/ G+ B
    使用1值表示沿着每一行或者列标签模向执行对应的方法7 N7 h4 l( {! d: F7 |* d5 V3 B9 h) [
    5 `2 K7 C1 Y% A+ ^/ Y6 p
    $ B, ]% Z. G0 Q

    0 a" Z3 x3 s3 n' s) x4 A; c5 J6 tpython的sklearn中 scale函数8 @. r; b+ b# z1 ?  D4 ^
    1 标准化,均值去除和按方差比例缩放
    ! s+ g7 u4 E: g- k" s              (Standardization, or mean removal and variance scaling)
    , g. c$ A( H, R4 z% E# G5 @7 A- y
    / `. {7 Z. Q, C  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    ! G  v' t8 o3 U$ r* y. @; Y
    0 ~% u% n6 e7 J+ A" ^8 M9 ifrom sklearn import preprocessing - u. Z$ H+ e8 a/ D7 R- V1 C
    import numpy as np  
    ' ?1 c2 L& U0 TX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  - U2 v1 Q" }6 r9 J! |0 R
    X_scaled = preprocessing.scale(X) 2 o* i/ i8 {) y

    4 N* E: V4 v. \& t#output :X_scaled = [[ 0.         -1.22474487  1.33630621]; `" c: W8 P1 C, T2 H9 Y5 w
                                     [ 1.22474487  0.         -0.26726124]) d& A+ b( Y2 F. K
                                     [-1.22474487  1.22474487 -1.06904497]]1 n+ T0 n; o& f0 R$ I6 A. R6 U
    #scaled之后的数据列为零均值,单位方差
    * J8 e5 o: U* L5 h, \X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  # f! T# U; a5 }! `+ H7 v2 i
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
    % m8 i/ D7 O4 @7 Q% C( X# H" m5 }2 T" \) J. t; P
    6 j3 l, j8 t1 @$ z
    1 ~5 l& G% o% c2 u5 h+ N
    StandardScaler 9 C1 l1 T# Z- Q4 g
    Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)" T) Z6 N5 a; e1 h9 V" l1 G

      N) M3 X7 Q- Wfrom sklearn.preprocessing import StandardScaler; l( N8 u& [( V; r1 K7 T# h' r
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    " }1 u" u# F# j8 `X_scaler = StandardScaler()
    5 [; T0 p" H% j9 a8 Y! DX_train = X_scaler.fit_transform(x)
    ( _9 O& m4 d7 L/ u! T: K# [6 K; AX_train
    9 Q! x$ U. Z1 P) b$ j" h#结果如下
    ! o5 O/ I/ i! g, I8 z- j3 Q5 Xarray([[-1.2817325 , -1.34164079],  f4 d8 j' y+ Y# ?* \5 c6 h% |4 x
           [ 1.48440157, -0.4472136 ],+ N% z% g8 D3 c2 s; P2 o
           [-0.35938143,  0.4472136 ],
    - D# K. t$ I. e       [ 0.15671236,  1.34164079]])
    , F0 E% s1 ]3 ]4 R' i) Z& X* e8 _. G$ R7 W, Y  p1 E
    , s2 s3 N4 j1 T# _) r: Y
    . L3 m$ B6 C# ~9 B

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。6 f/ N" r2 l& y% i  ]
    from sklearn.preprocessing import StandardScaler
    8 r5 R) G  X) [# cx=[[10001,2],[16020,4],[12008,6],[13131,8]]3 g' L! n+ `7 b; p% e
    X_scaler = StandardScaler()
    # i. E4 D2 v1 o$ {9 r0 g+ z3 CX_train = X_scaler.fit_transform(x)* S5 Y0 H  j' N
    X_train
    3 O) Z6 N/ S4 D* e. u9 ]#结果如下3 O6 _) f6 X3 o$ M8 F1 f
    array([[-1.2817325 , -1.34164079],% `1 {. M8 g) j% i; X/ a* M
           [ 1.48440157, -0.4472136 ],
    9 S+ e5 l2 M. t7 _: D! S       [-0.35938143,  0.4472136 ],6 D" h' Q+ Q, G' V7 \
           [ 0.15671236,  1.34164079]])1 Q5 \6 o+ \9 B0 H2 i' \
    1 m) J7 t- S+ q- m' w+ k6 I
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    1 x# W6 U4 B6 F1 ^) W: H* Rscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  
    0 [# e3 B! r8 j2 D6 Oscaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    9 h' i4 P3 y# ]; ^. D& X" ~8 `#测试将该scaler用于输入数据,变换之后得到的结果同上# b& [4 m2 d% B5 G, I
    scaler.transform(X) 7 i# e; j& t: r9 N5 {. U6 t
    #out: / b3 h7 |+ k7 N, t+ Q3 a! c
    array([[ 0., -1.22474487,  1.33630621], 6 w/ D/ M: \3 D, G! A
           [ 1.22474487, 0. , -0.26726124],
    ) S2 Z3 i1 L1 i7 l2 M, [       [-1.22474487,1.22474487, -1.06904497]])  
    . k! w8 V5 W- i& n7 ~$ P9 ]scaler.transform([[-1., 1., 0.]])  #scale the new data
    : A0 }! ]: ?9 H: h( N# out: array([[-2.44948974,  1.22474487, -0.26726124]])
    7 s& s8 _, W# ]; ?' z( `& [- s- G: G) _; I# r* s
    2 将数据特征缩放至某一范围(scalingfeatures to a range)$ @5 `) n( m8 {1 E7 Z( j5 r
    * f" ~! [. d+ }3 i: u0 C4 X2 S
    ( u( [9 c) J8 N2 y6 O4 z
    2.1 MinMaxScaler (最小最大值标准化)( i2 ~5 c* \! C/ }5 ]# S% c/ @
    它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    3 D# ?; I' z/ {9 E. V2 M
    # R0 e7 _* G" Gfrom sklearn.preprocessing import MinMaxScaler) L4 W# _3 ]( ]& Y+ M9 }
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]# M  M7 ^/ C  l; Q0 ?& H
    min_max_scaler = MinMaxScaler()
    4 _7 B1 I( U, B' i- G& jX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,: [9 F0 \0 h1 B" O

    4 Y, b5 k, p8 I' a8 t/ R' Hmin_max_scaler = MinMaxScaler(feature_range=(-1,1))/ H8 G0 J& _2 o; y7 _
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    $ k/ E5 c  j$ `) r3 A
    ( e5 W5 p4 |+ ]0 N+ D0 BMinMaxScaler的实现* `5 c  m( V0 \5 o# P" Z  s
    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))% Q/ b( z: p9 a" [
    X_scaled = X_std / (max - min) + min
    7 ?* `- H3 I) I- H+ d# F, M; f& F& a
    这是 向量化的表达方式,说明X是矩阵,其中
    ' V" |" R9 P, @; k: L+ Q
    6 a! _/ S9 X/ x  A" uX_std:将X归一化到[0,1]之间
    & b* X) g' N. @, _/ b8 Q( zX.min(axis=0)表示列最小值
    ( s- }7 _9 A/ [max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    7 }0 l: g1 v" l7 n/ o5 u& q: ^% ~( W) @

    4 {) H- D2 c1 O( E" W9 a3 G) u. m2.2 MaxAbsScaler(绝对值最大标准化)
      U2 J' B5 [6 |, y         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。+ K6 m- |/ |, B7 M4 k: [3 O  ]

    0 [6 L/ a4 E& U0 K3 nX_train = np.array([[ 1., -1.,  2.],
    ; b- H9 C: l6 l9 ~: R- D                     [ 2.,  0.,  0.]," D* b8 v+ C. J: L/ ?: R
                        [ 0.,  1., -1.]]). U, _9 w0 m& i$ y9 y, h. c6 _
    max_abs_scaler = preprocessing.MaxAbsScaler()6 E5 f7 d7 X7 _/ B6 }' w; B
    X_train_maxabs = max_abs_scaler.fit_transform(X_train)2 Q5 l: ^( J3 c! Y: S5 {
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    0 b2 ]0 }3 Q: H0 ?X_test = np.array([[ -3., -1.,  4.]])
    . V* p3 C* D1 z1 @' yX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])& S" E  }2 o7 O* b$ b$ O' u1 c  F
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    ; E# V/ J& ~$ z1 w
    7 X: U4 L. z( m+ b8 f7 ]5 C9 j% f
    ! O% g  R) ^  V
    - R( V- v& l( g# o( p) W: q+ a
    % D/ B! @4 {- h* Q. Q
    & X+ F) |0 u: V) p
    / J; q0 A6 Z" X# T% u, ?/ q+ x7 c& S" _

    ( l8 Q* g- O/ ^! X
    % {2 t) p, u5 v+ Q9 b% N
    6 U1 {, b: v5 G( N$ R; Q) Y————————————————/ Z5 W: `$ s# q( a
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* V* N! r4 k: b) [( W
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
    : E+ t' W* y+ ]1 b1 U
    , u8 J$ w. G8 d$ _
    ; `0 L& n: Q$ F" |
    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-31 07:13 , Processed in 0.399665 second(s), 51 queries .

    回顶部