QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1962|回复: 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。* v. r: y$ {  f# X- P! P

    3 f3 z. T% B  J- n. ^2 L- ]当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
    / l+ k. t) D# I; _5 |当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
    7 K$ o( h; ~& p) m数据变换的目的:4 K* t/ E9 k2 S
      对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。( R2 C( h) s. |- I# @
    " d. A% ]5 Z# Y* T; @) C6 I
    定义 : 设有n个数据的序列  ,则称映射
    $ l1 @8 L' w6 z' f+ x- L. i5 M' E( U8 v9 x4 _; p% Y" q3 K
                                            % c' y' q8 K( V- o3 Z+ [& N; w

    0 k% k* J, j9 P4 f8 T9 \& U8 b% {          为序列 x到序列 y 的数据变换。 . j/ t) ?6 ^" x! J2 B

    & x/ I/ ?3 T/ l1 }6 v. g/ Y数据变换的七种常见方式" P5 ~$ j7 X4 D4 S( x: N! U* Y
    此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
    " Y& r  W7 a# E! T. w
    ; `" \) }4 _3 q* S初值化变换
    1 R9 f/ F* {+ C' g3 x! U# L  W4 S& {. {! w, D
    , f5 y. L, U( Q/ r' y0 Z( ~
    也就是要对每一个数据,都除以第一个数据。7 t4 O% Q; Y# e; T6 S0 ?) {

    , @; C9 Q2 J* P5 ^均值化变换& u4 X5 n" W/ D5 i0 c) t
    & _9 u% b' w7 s: y8 Y+ {

    . I; K7 @' ~% r. A% G             对每一个数据,都除以均值。
    ' Z. [7 V. [6 [& e. N# H0 p
    8 p. m5 c9 i/ J- ~) V* H百分比变换2 r. P* Z9 l) a) J; m+ g( m9 W! S, a- H) B
      C3 n0 [8 L, H* ~, m
    & I8 O9 a0 g1 C! X1 ~" ?, l
    分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。/ Q. N6 a) r: k" D9 w# D( R/ p: K6 z

    5 R% r1 I2 y/ D+ M* i* r' s倍数变换+ o, {4 D! E& ^" b/ [$ ^
       
    8 t# C. Z" n. y+ [. o9 z0 A2 i0 e- ?4 U, ]
    归一化变换
    6 W6 ~( X$ v- o+ K* }- u  }; x0 c: t+ `2 T  |
    * [# W* n6 q7 a9 F4 ?( K! {& U
    其中   为大于零的某个值,称  是归一化变换。 4 W6 m: y3 ]. p- I, O! _6 o

    0 {2 |1 }( j& y! W1 P% @$ K1 O) c1 X1 y
    极差最大值化变换3 z" N2 O/ Z; G$ Y- M
    $ p3 c. `9 B1 ?3 m7 T4 `( P  Z
    * s  A7 D# C( R, i6 M& V' [3 T

    6 A2 r+ L' {: A) N" A) c+ \2 ^- o! s! R
    区间值化变换  v. K* V" J$ K

    % _7 `" l3 Z8 A
    . \2 y. ?, l- ?4 N, N# i                  ,  ^5 H& ~3 M! z! e% b" S) x7 r4 D
    ' I; B% l. D4 S8 \' Q7 H
    1. matlab 的mapminmax归一化函数
    9 {; a! a+ n4 t, B2 D" d函数用法:
    0 _& x/ l* T2 q' }0 u! w. i [Xn,Xps]=mapminmax(X,min,max)
    # w: i  ^$ }+ P3 v; P3 T2 ]: G) x
    ' p' s8 b7 @) K$ ~说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。. s! A9 J1 n) ?$ [

    # z- T& @! S, W+ G  o; n$ J# K% ]   (2)min,max规定X的归一化范围,根据需要自行设置- Q, H4 l; Z' L: Z
    4 t+ F! ~/ D; @) G* \
       (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     . I+ V+ J& G/ n1 l- W6 G

    . b0 `4 ?, J+ C+ H  q 调用方法:  ~4 I7 I# e1 m
    ; w$ `5 o/ l% E0 y" X
    X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化1 Q9 z1 h& {4 Y3 i% u: N# j

    + }1 ~1 ?2 K+ f% j5 h* z' _X2=mapminmax('reverse',Xn, Xps);%反归一化
    : \3 n  T9 y1 e( f# E4 d3 b: X) I2 c
    x=[1,-1,2;   2,0,0;   0,1,-1]6 @. e/ C/ F& \* i( h
    [x1,Xps]=mapminmax(x,0,1)
    % K/ Q) E. z0 Y  K
    + O6 V  a$ v6 z: |/ W) {" p& z  b3 w+ I! d1 e3 l8 m
    7 I1 {; L' b$ h3 I7 t' d* t9 a
    对于python中的axis=0 和axis=1的问题" d# G& }( T  ?6 `' d; N- b7 f
    如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)* x/ V: z" `6 b8 G
    换句话说:
    : p9 |6 k& [4 ]- v& n2 v( U5 L& o3 l. D7 K) a
    使用0值表示沿着每一列或行标签\索引值向下执行方法4 y+ @+ a1 {: @5 ]- u
    使用1值表示沿着每一行或者列标签模向执行对应的方法
    * e! h+ J$ M/ `/ z9 f6 I- T' e: C# y+ ]2 D) z( B0 l
    , S, F) T* L2 r
    ; z  \! {' @7 o
    python的sklearn中 scale函数
    * b0 b! v: G4 p3 w. u  W1 标准化,均值去除和按方差比例缩放; W" C3 W3 o% Q* l* @' R7 b
                  (Standardization, or mean removal and variance scaling)
    4 k4 x' E6 ]/ C1 W' R* E" K2 N4 u0 g/ z
      数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
    % {$ ]' o1 x9 F% {2 ^# B# a& @8 ^0 [  N# h$ m& b
    from sklearn import preprocessing
    # |% K- E! l2 d3 T0 aimport numpy as np  
    ( l: P9 d9 f  ?9 N1 CX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
    4 q, v* t! s5 JX_scaled = preprocessing.scale(X)
    3 W6 p9 E" T; v& L, P* B7 u+ s! |
    #output :X_scaled = [[ 0.         -1.22474487  1.33630621]8 z0 R. e4 b1 X+ n6 [+ D
                                     [ 1.22474487  0.         -0.26726124]
    ( T7 ]+ t$ C1 R                                  [-1.22474487  1.22474487 -1.06904497]]
    : _. ^* e' h' ?#scaled之后的数据列为零均值,单位方差/ S$ e* H3 [/ M  C/ Q' f. o7 ?
    X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  9 K1 h( w$ Z( _2 |" q. }# ]
    X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])! p; B9 v* ]; G

    . Q8 E8 }$ m6 \' I* M8 S) Q! _/ P2 E6 A9 s4 R: G

    9 B9 d% c# R' c/ ?2 k: x1 WStandardScaler
    % Z' i& a+ ]# K  U1 }3 O/ D# rStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 w5 p8 Q. ]9 Z8 u7 u9 U6 c
    ! F! s2 l, O$ a. k, t! y' w# Z
    from sklearn.preprocessing import StandardScaler; {' P, h% W- f
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]
    1 A6 A1 }& @3 b3 o( i* I# {5 iX_scaler = StandardScaler()
    + |) e6 [9 G) W$ f$ |, |! v7 MX_train = X_scaler.fit_transform(x)
    6 \1 E* M9 h* ]- K5 d, `& cX_train
    - X! _6 P3 q9 F1 y6 e3 |#结果如下
    0 e/ s: A/ S8 i' _: a& l6 ]array([[-1.2817325 , -1.34164079],
    8 q( b4 m; C3 x4 L+ X       [ 1.48440157, -0.4472136 ],
    9 ?  ], _- g$ G9 C& _% ?9 W! h       [-0.35938143,  0.4472136 ],
    ! |4 V# `) Z# H& Z' v7 |       [ 0.15671236,  1.34164079]])
    ; ?' r" R0 D/ r9 v" {( O, l' K! {9 @3 Y1 ]

    2 i9 N+ Y' x0 Y% G& H( g* M2 |$ D# \; _' g

    注 :

    • 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
    • scale和StandardScaler可以用于回归模型中的目标值处理。
      $ E0 A6 \  S, r+ a
    from sklearn.preprocessing import StandardScaler
    2 s$ x- J/ F8 V4 s4 D% Ox=[[10001,2],[16020,4],[12008,6],[13131,8]]5 F# _; f5 h' e* S' p, e7 _1 K% K
    X_scaler = StandardScaler()
    6 Z$ D! i( j/ a  F, I1 BX_train = X_scaler.fit_transform(x)7 K7 L5 \6 k, L7 ^3 Q
    X_train
    / M/ U  Q4 {1 m7 p4 c/ S#结果如下
    : j& @$ ~  ]2 l6 H( y' n9 narray([[-1.2817325 , -1.34164079],
    9 Q- U9 O8 [# K       [ 1.48440157, -0.4472136 ],5 C1 H% b) F/ ?: H
           [-0.35938143,  0.4472136 ],) `' W4 A7 k$ U
           [ 0.15671236,  1.34164079]])
    1 }/ l3 \* ^* G
    , ~. s8 x  Z( }: f3 m' t8 ?scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)$ [& f2 m! D6 G
    scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  % D3 {1 w1 h* }
    scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913])
    ( o4 c& {4 `; E* C; y#测试将该scaler用于输入数据,变换之后得到的结果同上% _( N3 l! G. ^4 t2 f
    scaler.transform(X) * y! e/ ^1 k4 f8 p3 H& v
    #out:
    ; h) g- w1 l8 varray([[ 0., -1.22474487,  1.33630621],
    3 {* g$ g. j  I) G+ ^; y# I       [ 1.22474487, 0. , -0.26726124],   x+ T4 w4 W* x# O0 h5 x; i" A
           [-1.22474487,1.22474487, -1.06904497]])  7 u* s9 q. M; U% W& M1 H7 H
    scaler.transform([[-1., 1., 0.]])  #scale the new data
    ! J5 `+ u% c4 G* G9 y" R# out: array([[-2.44948974,  1.22474487, -0.26726124]])
    6 }$ [/ M  ^$ L5 J% |' j& Z: _. R% _! l
    2 将数据特征缩放至某一范围(scalingfeatures to a range)
    0 k. a* b/ h9 A; Y 9 j- ]$ q+ o) @  W% c5 R
    ' Z$ X5 K: l  r4 r. B+ R1 M' F( k
    2.1 MinMaxScaler (最小最大值标准化)
    # _2 A1 Z  `0 ~ 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
    ' j2 c; Y$ y3 L1 i$ K
    / A) {+ Y7 Q; d, Vfrom sklearn.preprocessing import MinMaxScaler! d& ?1 q# G3 v5 Y! h- q' k4 h
    x=[[10001,2],[16020,4],[12008,6],[13131,8]]* u0 y1 \8 Y" M! g
    min_max_scaler = MinMaxScaler()! \: x6 u9 [: z5 d7 o# Q
    X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,/ D5 `- Q9 H' n+ Y

    7 ~; I: j' n0 a4 f! Y8 W& j; Omin_max_scaler = MinMaxScaler(feature_range=(-1,1))
    : x2 P3 N& {0 y5 pX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
    ! B" z9 q, M! ?0 a8 A6 _, Y
    ! B8 @$ }  v$ k+ T% _9 e3 RMinMaxScaler的实现
    1 ?6 q2 X6 I8 `- K3 @& Z3 J" W3 oX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    1 S+ ]/ l8 A3 L* S. `( {X_scaled = X_std / (max - min) + min+ w# U! ?- u, y" n" P! d  Q
    " Y8 Q( W" Q6 m
    这是 向量化的表达方式,说明X是矩阵,其中: H- y0 u7 }, {% u% X; S1 @" E& l
    3 ?+ h0 x9 }7 t. A
    X_std:将X归一化到[0,1]之间- h+ w- K2 y4 Z- \( z9 y* K+ X
    X.min(axis=0)表示列最小值
    / H& J* {* o. K# N* L9 Ymax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
    - U9 _8 y# ]' e8 }9 l! c" b9 \0 R

    . E% j+ f$ b5 Q2 E/ k2.2 MaxAbsScaler(绝对值最大标准化)
    " A! r  R" M" g9 X0 K! ^$ B% z- ^         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
    8 r7 a8 a, {* M4 z/ H* O! |' L: c
    X_train = np.array([[ 1., -1.,  2.],
    ' s. J1 @& A7 D' s- M8 P$ @                     [ 2.,  0.,  0.],3 k) R( n6 U# X( B6 g
                        [ 0.,  1., -1.]])) j7 r0 a7 M1 k3 E( V
    max_abs_scaler = preprocessing.MaxAbsScaler()
    ( ~! s- h! J/ }  }" }X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    * \5 e1 M8 ], r! B+ U4 r# |# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])3 n2 h: v- n9 Y; E$ C
    X_test = np.array([[ -3., -1.,  4.]])+ x, t9 C1 E( }- S0 o
    X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])2 E* r1 g( O+ C* C
    max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])8 m- C6 f7 i9 g: Y7 ^

    ' G5 S9 f% P6 K' a+ x3 r
      C0 u3 ]. l  M
    4 J: {7 s; _6 |3 y) i" |% D) _2 ~+ x4 x! R) t" Z) q
    : |7 k" t3 @' }0 K6 f2 W/ d( \0 Q

    3 p6 s& w7 e- O2 i
    2 {, W5 y: X3 p" G+ c- z
    1 r/ T/ e9 S6 _4 n1 D
    " J8 ], |% G! O& C6 c& t) U+ l  I9 Y  B4 b
    ————————————————2 Q6 m- ?  i) K7 d
    版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) K  W4 w6 F( F  N! n* }" I6 B- I原文链接:https://blog.csdn.net/qq_29831163/article/details/894202238 L% r% U: e5 N0 L7 J
    % V! h7 f! Z( @; K# ?* T

    - V. }* _% D* I. z$ Z0 v6 r% o$ y
    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 14:04 , Processed in 0.381378 second(s), 50 queries .

    回顶部