QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1959|回复: 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。
    4 U6 f/ O  k* f3 R: \) g; z6 {- w$ c. P  T& K
    当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    + U! l% M8 z- ^, {! ~当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler. j. V7 I6 Q7 Z2 z: i7 _
    数据变换的目的:; D7 m' O0 }4 a  [, I# S
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。. p. k- |# r! w! ~: U
    + i$ Z! m. c) W9 c
    定义 : 设有n个数据的序列  ,则称映射! S# |) L! J0 G
    % _' c, Z( I& v! E/ v7 }
                                           
    8 d/ I) @5 n: V; h; g% B+ R  z! w) R, ^" \
              为序列 x到序列 y 的数据变换。
    7 B. O  E, s0 W; [+ u3 \6 ?7 W+ P; t5 F- M7 z
    数据变换的七种常见方式
    8 Z/ c& [) G8 T7 B/ q& o- x. {% y/ E此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。, _1 z- Z. g3 j3 V: c
    . A+ d# k/ |, K0 O3 Y1 D
    初值化变换
    0 d& I$ K/ P2 R$ a3 l- _- b8 k7 x' J. `- ]3 T
    ! f9 e0 c" \* y
    也就是要对每一个数据,都除以第一个数据。
    9 L- K. ]3 U/ L
    $ w+ _  N& ~, \' K+ d. w% g均值化变换- N" |0 H  T7 l$ l8 V
    2 `6 {0 H# x* V3 H6 C, C
    . H7 u( I# _- U$ @8 y9 F: Q; r! f
                 对每一个数据,都除以均值。) u7 t' v( A  e' F

    , S! \  V# ^6 W$ x4 y* N# f百分比变换
    ( N- K# l. F/ U! \/ z: t0 N" ]. @/ U/ T  x4 M% G

    # v% ~4 a- N* J5 d. q- |3 K5 x分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。3 ^9 {0 H3 b6 E2 W) R' j1 i6 X

    # |; t7 s4 G3 q  b倍数变换/ U9 P8 k% |: p6 m; w8 H! ]
       
    * \" D0 K4 b7 f! T- n: c  x5 O3 X* a6 F( Q1 Z& N. G4 O/ |
    归一化变换7 J8 _$ F: p! @5 a- w% W( U9 t/ M
    " l" v# ]6 R4 O

    5 Q. N% j& N  k3 H* V$ i 其中   为大于零的某个值,称  是归一化变换。
    ' k: ?: l3 ]4 ^/ Q' Q
    + o9 @: \6 o1 x: B8 c7 g0 G( o5 e) n' E) q# f1 }2 r$ R
    极差最大值化变换
    ( C6 C3 J* B6 v. \3 |3 `  r  _' P2 C5 a
    2 `( }& S: Y! x% q  X. p

    ! ]- m+ `& a) Z) O/ H
    % c: }* M* y3 f  h( y区间值化变换
    6 ]8 R" q  ^3 D% ?4 H8 Z3 R/ P7 ~0 j
    2 U" g9 i! B4 u1 ]- J5 w
                      ,0 |1 I0 T( K5 ^! [; r& h. E

    + U0 \, [; o. d$ ]2 X) @$ `0 i1. matlab 的mapminmax归一化函数- z% V: W  I- k" q4 a
    函数用法:7 |( p7 m7 f( P$ G
    [Xn,Xps]=mapminmax(X,min,max)0 ]6 Z7 w6 W6 S) o- f/ l; B
    . }8 u- _: Y5 I+ s# n
    说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
    ) B( n5 }: q- i" \" X) u: \3 j+ v" q
       (2)min,max规定X的归一化范围,根据需要自行设置3 v1 ^: @! L& ]. m

    " n7 @9 u5 s9 e, A   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     , A, c- v+ P9 s% O  \( h1 K' }
    1 R# J. N! `* B( x- U) M
     调用方法:1 q# A) S) s% u+ H

    7 Q+ L. M3 [" N1 f/ z7 B) n; v- cX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化$ k) b2 y; n8 L4 }; D5 l

    # k% p/ L0 O3 v4 E. z# WX2=mapminmax('reverse',Xn, Xps);%反归一化
    ; }) f0 f2 |* N/ U1 Z0 [
    0 Z, W4 `1 u0 t% K: W. K2 ]8 Sx=[1,-1,2;   2,0,0;   0,1,-1]7 c1 w1 D- s, c" F/ v
    [x1,Xps]=mapminmax(x,0,1)
      v4 O. R, z$ ~% `" L& ~4 v
    % z3 h  y7 {2 g9 J/ L
    ' Q$ @; a$ H$ F
    , _9 h) |8 ~( A1 \' @对于python中的axis=0 和axis=1的问题
    . s- f2 a; G( u& F0 X- i 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
    ; R: ^/ O) i5 W3 d' k换句话说:
    " Z! y& b6 A6 @, E
    3 H* F0 |; _0 A$ n2 B' @使用0值表示沿着每一列或行标签\索引值向下执行方法3 B3 R& t8 H1 p) F
    使用1值表示沿着每一行或者列标签模向执行对应的方法
    9 J# |' h' U4 \# @1 [" g( T, x2 C6 }* w6 A: }7 G! \1 s4 F
      o4 u1 e0 @4 E. C5 X6 f% i
    - z: w  d' ~$ F, s& J5 V  E
    python的sklearn中 scale函数  Q% q: @  C! B$ [/ f  `- S
    1 标准化,均值去除和按方差比例缩放6 d& P4 p5 U: \+ [5 E
                  (Standardization, or mean removal and variance scaling)
    ; ]" a; {' Z3 Z  {+ j0 {7 U+ ?1 L0 t5 R  C% w0 i
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    * |; [7 a7 f3 @" Q0 ]  J  e) A, G5 [' F5 O0 T2 z1 s: F' A
    from sklearn import preprocessing - Y" X) |* l" E) \2 ^5 K. L, D
    import numpy as np  4 N2 d* e  S. ^9 P3 F
    X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    8 Q+ p. o. ?9 Z! mX_scaled = preprocessing.scale(X) 9 l: Q0 m( e6 z, V
    0 v2 q+ _5 N; s) U6 h
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]% ^6 {9 n; G- [+ K: X
                                     [ 1.22474487  0.         -0.26726124]! S/ I5 {0 \+ A
                                     [-1.22474487  1.22474487 -1.06904497]]
    ( m5 |0 Y3 h1 [0 d; r: L7 ^) k; }#scaled之后的数据列为零均值,单位方差
    : [1 Z% G+ K" oX_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  
    . i" g: P- V' V* ~5 w6 UX_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
      `) `5 H8 q9 g. v- n1 ~5 G& x# s
    ( [8 ?/ z% d; D
    ( q( u; \8 }+ a/ `  T1 |
    1 i1 V7 c% O. |! |1 I( v  pStandardScaler
    - H( u" a! ^) G& i, K) `Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
    - q1 N) Z: k& n6 ~" |  I" w$ j" j. E
    from sklearn.preprocessing import StandardScaler! ]  u) S# J, G: d% J/ K% L
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    5 }/ r5 L8 d& z: WX_scaler = StandardScaler()
    - r+ i8 {  |' l! Y; q6 xX_train = X_scaler.fit_transform(x); F0 V- w. D, |, K9 r
    X_train) d( [" `9 L5 s2 A: \8 c. L( {, r
    #结果如下$ b4 B2 K+ h0 ^+ b6 P
    array([[-1.2817325 , -1.34164079],
    - c1 V1 V: i) q7 A1 v( \       [ 1.48440157, -0.4472136 ],! n6 j, m/ g& B! {) X
           [-0.35938143,  0.4472136 ],& ]! j9 C* }. \% }
           [ 0.15671236,  1.34164079]])
    % I) _9 A5 X, _' C8 J5 ^0 A
    . A- h5 K! i  N2 K7 a
    7 K( K. P7 d. r4 W- R/ a
    ) t% c1 v; g  R/ \$ M( U

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。) _/ T0 s1 f9 Z+ Z$ x
    from sklearn.preprocessing import StandardScaler6 g+ J/ y) P. X; R. ?0 j
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]1 Z* Y8 l6 x# G* P# F: t
    X_scaler = StandardScaler()8 ~6 I  D5 o; j: h1 \, j% X
    X_train = X_scaler.fit_transform(x)3 t$ B" F. k8 G, O+ t
    X_train
    : x# @7 N3 a% ?" ?+ L7 t% @* \#结果如下
    : k4 t; P3 K' G1 @, T2 Iarray([[-1.2817325 , -1.34164079],
    2 N; `4 u) v7 w$ _       [ 1.48440157, -0.4472136 ],
    4 O2 p7 E; a. Z3 z       [-0.35938143,  0.4472136 ],
    * o1 A/ a0 Z! J) s+ h& I( S       [ 0.15671236,  1.34164079]])
    ! m# J1 P' f: |0 g+ O9 M/ G1 r& k0 Q7 U6 F
    scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
    6 _7 E# y( c. X  P8 bscaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  ( T7 v7 B1 W) J+ q: p: O0 h
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    3 [! f+ q/ K2 @6 C#测试将该scaler用于输入数据,变换之后得到的结果同上
    2 q: M9 q% ]1 n) O' ]scaler.transform(X) ; X+ A' _+ s5 X$ K7 j3 E, l
    #out: 4 F4 U4 N" u! D. F' y# G6 s& r, p
    array([[ 0., -1.22474487,  1.33630621],
    8 u% }8 f/ I9 [$ y       [ 1.22474487, 0. , -0.26726124], 6 \# T& R( Z" B, J$ `
           [-1.22474487,1.22474487, -1.06904497]])  $ O5 L2 `' _, z" ^+ e" ?, e4 P: |
    scaler.transform([[-1., 1., 0.]])  #scale the new data( j2 t% F7 O; L  k$ `
    # out: array([[-2.44948974,  1.22474487, -0.26726124]])
    / G' W* ]! B, g& y/ [
    , j9 {$ Y' A% _2 将数据特征缩放至某一范围(scalingfeatures to a range)% n: |9 J3 N) K, e

    - L) Y  I  T: {. F5 w

    # T' o1 d- `% o/ m% x% p) ?4 N2.1 MinMaxScaler (最小最大值标准化)
    6 l" D0 U! ~9 X" X 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    * \2 {  |) n( L- R# y* u; r- B7 ?0 t7 f
    from sklearn.preprocessing import MinMaxScaler
    + i' ?5 v- y9 ~1 r  yx=[[10001,2],[16020,4],[12008,6],[13131,8]]
    & w" n0 ^4 R9 f% j: Smin_max_scaler = MinMaxScaler()3 @4 H4 E: l8 ]* I& E( V
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,, t: s7 {6 u2 u6 b
    1 |2 O2 @0 y# u/ r0 g* x' [
    min_max_scaler = MinMaxScaler(feature_range=(-1,1))
    9 F  x8 G8 k& P' o6 j" E. Q# ]X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    ' o, D: \1 u4 m, O8 p; Y
    ; f7 ]3 d, I; M8 X$ f- cMinMaxScaler的实现
      u6 r4 {! H. i8 S& g* vX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))8 M( A2 P& D- O) |. e1 L3 q2 {( i; Q! J
    X_scaled = X_std / (max - min) + min
    ' @. a4 ], S/ w3 F  C) x/ E2 b
    / [( L6 g0 d3 b& i这是 向量化的表达方式,说明X是矩阵,其中
    ( S0 Q3 b9 t' M1 n9 @: i0 k
    , x) }, r0 z- ^' ]X_std:将X归一化到[0,1]之间- N7 T+ @  v8 l, O, T1 L
    X.min(axis=0)表示列最小值
    5 g2 e# _: K' \: \) o, \( Tmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围; }/ L7 b* v* c6 q& p% O. w
    8 T0 ~1 V) o+ `0 [5 U( D7 n' \
    % ?. C1 j0 ?+ P- S, Q; p& Q- y
    2.2 MaxAbsScaler(绝对值最大标准化). R3 R+ a' j" r$ Z6 ]
             与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    1 a  A% c- D# r8 |* R* P4 [! {% {5 e+ ], B7 L
    X_train = np.array([[ 1., -1.,  2.],5 Y) j! ~) R( X
                         [ 2.,  0.,  0.],: B/ G+ I+ H+ x2 q* r' A
                        [ 0.,  1., -1.]])
    3 t! P( V/ X( Y5 j$ u& \; umax_abs_scaler = preprocessing.MaxAbsScaler()
    4 Y* D& |- E) |( f: P; iX_train_maxabs = max_abs_scaler.fit_transform(X_train)1 O' a% a4 y5 [
    # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])
    4 T4 K( r& ^1 l, P3 F6 `9 n* qX_test = np.array([[ -3., -1.,  4.]])7 b  y+ U6 n7 e/ _. _
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])/ r4 K( N; k3 y# j: v
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
    + b6 L: ^3 t, I3 O8 F( F: h& Z$ K* m( V+ w$ S" b6 ]( r1 n* F

    ) E4 L& I8 d# A, j2 E. [
    ) k3 i- ^8 q+ O6 B* o5 {: U! l* u2 G/ r, x
    9 B2 U/ i+ b" [6 h! S4 a# A
    + A8 T8 z: g2 X* k& q# K

    1 f/ e/ C9 a0 @) |% \% y1 E- G' b# l: }) k" W- W
    0 [8 f& d% u2 m  N) W$ P8 P' r

    1 b0 M) S  u- s1 ?  i) ~————————————————
    . Y0 X! \' y. o5 Z3 q& P5 y( r, Z8 F版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , M5 @1 n* E- Z原文链接:https://blog.csdn.net/qq_29831163/article/details/894202239 ]4 A0 @6 q4 F, [* X) q& o
    - |5 L8 w/ m/ W/ I! l) t( t2 t

    # P4 O$ A$ h9 ], s! i1 b) B
    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 07:12 , Processed in 0.884099 second(s), 51 queries .

    回顶部