- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36305 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13852
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 12
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。, q; I( K! e+ x' g9 c
1 r' K9 j. f9 P! k/ ?* _- F
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
8 ^6 n6 k- B8 y6 e# `当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler% P9 S3 P- B7 b% ^6 p, [ m
数据变换的目的:6 x5 | Y8 S8 m6 Z
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。8 {+ X9 @5 t9 R
4 x/ t- L( T- q+ W 定义 : 设有n个数据的序列 ,则称映射
' I/ c! R% L4 z' l3 E! L$ {. i0 N1 M8 L7 _0 {: f7 ]3 v: c6 N
4 F5 K' Z" S* S5 V0 m) E
; _* v) C# U8 L, L 为序列 x到序列 y 的数据变换。
& e$ r A5 H* r, F( L4 p4 |
2 k$ {; u) _" @ S数据变换的七种常见方式
! `+ V6 N% C5 Q此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
2 V/ l) _6 \8 F5 m, |; G. f# z( R# P! e6 s3 a) J% e" a
初值化变换
2 u/ b/ c3 Y, L* _
! F$ N1 ~6 T# `- M ( [. ]+ t& e5 v" U6 k) r) x
也就是要对每一个数据,都除以第一个数据。
( m: ]: M, F: Q/ o. Y% a! S# S2 F3 x8 B1 m( Q+ |1 X w, L- X6 s/ P
均值化变换
4 w. G* \0 E* }0 j( h5 \# w3 e2 b- r: z5 x/ _ B
![]()
$ ~" f& b+ j: j- b |$ E 对每一个数据,都除以均值。
9 `" R. v: Y6 f# l* t( k/ B
' i! l# x7 r- G百分比变换6 O0 y3 _5 x/ x, @/ i& Z
4 L; Y9 x: J' [; M1 x% k% I4 ]![]()
4 Y4 f- P' N$ e( N( ]1 t9 [& p分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
) k6 j. F9 ~, Z/ A- }
; L0 j3 p; R. U h倍数变换
. v* c* a' G% k6 W) V8 J ![]()
3 U) E/ b N5 M
4 T" x' e$ a! ~, |9 I' T归一化变换, h1 C. V% s8 f! W( w7 ?5 ?
+ _* w% @ M8 \5 v![]()
- \# S% y0 u% u, e 其中 为大于零的某个值,称 是归一化变换。
: q4 |" K5 q% S! p1 W9 K( K/ U! ?, r! L
/ G @# M* y/ f m3 T
极差最大值化变换, P* |5 g, _) a6 H$ ]( e4 c4 _" p. V
. ]2 v( \* a& c' N5 B ! W' Z/ R- h1 ]& J
( ] ^6 {2 Q' Y: K# p4 ~( d
) l( H; O8 l1 i区间值化变换" ]3 t+ u0 U3 a, w
2 k) i4 k' z$ d9 A8 K3 V
![]()
. K3 S7 O# |* _1 ]% n ,! M# t1 [4 ?# r( q" ]/ n# u0 Y
0 n" t, y$ k1 D1 f4 `4 \! B8 B1. matlab 的mapminmax归一化函数+ v$ n" b" ?# d v. B
函数用法:
+ Z/ \# L u0 `+ t* X [Xn,Xps]=mapminmax(X,min,max)
9 {+ r7 Z2 o( z3 Q
4 ^$ U2 P" [/ H) L$ P% [6 ^/ ^说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。4 v( i( `$ d$ O" |* Y
" N" z+ i1 j* M+ j (2)min,max规定X的归一化范围,根据需要自行设置' l; q' V4 V& }) h0 E
7 o& D5 t) C7 s" l
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
3 n9 A$ n: A# Y9 v0 X
v4 j" b. q5 R9 K4 t7 F( b 调用方法:& }3 R$ k# v5 e' k' }6 K( X( R' U
5 _ @# L( p! @" I) B
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
% C, c4 Q3 B4 w2 A, |1 Q: b' Z( U+ m
X2=mapminmax('reverse',Xn, Xps);%反归一化- J: j) |0 x: i9 W
" q8 ^- q5 p$ Q# e/ Sx=[1,-1,2; 2,0,0; 0,1,-1]
! P& U$ W+ s1 u) ][x1,Xps]=mapminmax(x,0,1)2 M5 x* }( H3 @2 j
7 `0 k0 h5 D6 s/ R+ |9 Y
, y1 [" E! p$ ^8 D# e# M
8 X) C; m7 }7 l' @对于python中的axis=0 和axis=1的问题& [ f% H1 P- \: E
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
. B+ q: Z, U% ~; c* o换句话说:
7 A j1 D/ `3 D, m
) W' c1 [9 v P使用0值表示沿着每一列或行标签\索引值向下执行方法
5 o2 I& s8 d# b* ~- Z R2 z3 A使用1值表示沿着每一行或者列标签模向执行对应的方法
. l. y6 e8 `. x/ x![]()
3 U! P4 V% G8 {
% I8 L1 J- K7 F/ e8 h
; J3 f( \0 ~6 |8 Rpython的sklearn中 scale函数
+ Q( V% q5 D; }7 }, C1 标准化,均值去除和按方差比例缩放
' p0 n# O/ T ?) G1 Y (Standardization, or mean removal and variance scaling)
q+ g) B4 f! G/ v# {' u
/ q; `6 c; P0 s# y7 e 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。8 { a( H7 B! L4 A" L6 E/ A$ K1 E
: U) k9 @6 ?$ G. c6 h8 g! hfrom sklearn import preprocessing 7 U# }7 l- r/ A1 X% g
import numpy as np
9 `4 y8 n3 {. N; VX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
: c. t. W8 N/ y: z! p0 W5 TX_scaled = preprocessing.scale(X) & o& f3 H0 M3 |. b5 P
]* t% E$ A! u' e( x% ?
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
, k C/ e& m3 g) w; o3 b% i [ 1.22474487 0. -0.26726124]
1 U0 f: V# x' `* q$ O) S [-1.22474487 1.22474487 -1.06904497]]9 P- D2 ?* Y7 s3 m2 @% F& c) |
#scaled之后的数据列为零均值,单位方差" a4 ^! G/ f% n$ m+ n, B
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
: N8 V6 T- Q# r7 ]! X# eX_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
1 Z/ o6 s& N' o U1 j' G. C* _: D, J5 V, G% Y
9 I# }* j1 o% S0 Q3 g3 Y
4 V0 l$ i. E B( z6 W6 t& p
StandardScaler ( r4 [- V' v- {( g8 X
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)2 ?# {5 j& ~ R% S
$ d( P% q3 _* ^7 i v% l R7 y
from sklearn.preprocessing import StandardScaler
6 \1 o" l; j( zx=[[10001,2],[16020,4],[12008,6],[13131,8]]
& y+ A! y, V) }! F/ `X_scaler = StandardScaler()" y% x) u6 o% @" g/ O! x
X_train = X_scaler.fit_transform(x): L' P: l: l& M4 d2 y" \
X_train6 T% S+ u! B4 o# C0 ^' m
#结果如下
$ g& R- e4 N, m. F/ barray([[-1.2817325 , -1.34164079],9 T+ H8 q- e `0 }" C% g
[ 1.48440157, -0.4472136 ], ]) I$ ]$ O- o' P
[-0.35938143, 0.4472136 ],) \9 S. z$ Y$ W+ m. e
[ 0.15671236, 1.34164079]])) t7 Y+ ?0 ?- Y6 E( k/ g
6 B8 _( ^! c/ R# e5 _
) q2 U6 q j* j# k+ ?* f# ]4 y( c4 e) [4 T' v$ j+ @
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。# R( m/ I5 L; c; s
from sklearn.preprocessing import StandardScaler
. U4 `" K# Y( N4 Q5 @x=[[10001,2],[16020,4],[12008,6],[13131,8]]8 |' o! }6 U; r% V
X_scaler = StandardScaler()
- l7 y9 D$ l n4 T5 NX_train = X_scaler.fit_transform(x)
# r8 t$ c3 y; W7 V; t1 A8 L* e. DX_train
* K: c) ]9 ]# m. [8 }5 Q+ e }#结果如下
- \( X( J1 k H2 D+ Jarray([[-1.2817325 , -1.34164079],! n5 J5 t& r& l! E1 |0 q
[ 1.48440157, -0.4472136 ],, h6 ~4 u+ N: f' B
[-0.35938143, 0.4472136 ],
! A+ ]( }; H) |2 R( k v" a [ 0.15671236, 1.34164079]])
; Z1 {1 X# @' C8 V' f
# ?4 c d- x% D+ Cscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
8 O- A2 t: y# e9 _' m, Ascaler.mean_ #out: array([ 1., 0. , 0.33333333]) 2 {6 w0 _1 x/ z4 b- ^4 j8 C
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
+ T, _$ m5 k) f {$ q* M: o& ^#测试将该scaler用于输入数据,变换之后得到的结果同上
4 K' x+ c+ @# V9 e' P) B" gscaler.transform(X) % \6 W5 L) E; F' x: w4 j, u
#out:
a D9 z' s/ h; ]- U/ u6 C: larray([[ 0., -1.22474487, 1.33630621], - X6 d) `& T! q6 h* t
[ 1.22474487, 0. , -0.26726124], 6 b( s! G! o! r
[-1.22474487,1.22474487, -1.06904497]])
/ a) ]( J$ [+ x! m6 H$ Tscaler.transform([[-1., 1., 0.]]) #scale the new data5 F' i: S# C1 q1 |$ L$ ~3 R
# out: array([[-2.44948974, 1.22474487, -0.26726124]])- q2 P& }" f$ p: g$ N3 _
/ ?, I/ ^2 M t0 P2 将数据特征缩放至某一范围(scalingfeatures to a range)
" @# L( J$ i0 V, W + a- H$ a! s. {3 V
" g. e9 Y$ K5 m) N! A# ]2.1 MinMaxScaler (最小最大值标准化)5 ], l) K/ L# {& B
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 % j5 q2 ]/ L* M2 }3 Y
9 v$ X( ?8 a3 T: z* j" T1 h7 a0 `
from sklearn.preprocessing import MinMaxScaler
5 I9 A+ g1 h! V: h$ b9 I3 N3 Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]
& E: A6 C5 u- |% Y2 D6 T3 m5 g% [ F2 Ymin_max_scaler = MinMaxScaler()7 E4 p' A0 W9 v" x6 b
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
9 c% L2 t/ o: U$ a/ f# D
5 L5 ^4 Q; M) k# v, x& [min_max_scaler = MinMaxScaler(feature_range=(-1,1))
3 ]8 r k0 O- s0 S9 U/ TX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果" M4 k) m: Q8 _* Y3 J
3 m ]6 E; S' d
MinMaxScaler的实现
2 U4 a' [# b7 d% xX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
9 ?; ]+ p; E" c' J9 B. \4 H/ ?X_scaled = X_std / (max - min) + min
$ q, h& Z* a8 R: f$ g6 H
U: v2 \) i6 s! g这是 向量化的表达方式,说明X是矩阵,其中 ~, d$ x; u" _$ {' g/ ]
, X* L6 C* [" X+ E" p' i6 ^7 O( BX_std:将X归一化到[0,1]之间
% P- X& s" e; @, s) z8 V" YX.min(axis=0)表示列最小值- \4 ~% A/ s. `% |) n
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
) I1 q* n% s) H/ l8 D: V8 `4 u8 w& v# {) c7 \, B5 c4 W" v
1 U. @. ^! _/ j$ ~; a4 s( j
2.2 MaxAbsScaler(绝对值最大标准化)5 L2 o0 X0 J. y( a
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。" J: T9 P7 }( p6 |
( u* O9 [+ B$ d% G" Q4 O
X_train = np.array([[ 1., -1., 2.],% y1 z& i+ d/ X: j( U
[ 2., 0., 0.],
8 y# ] Q( M$ M [ 0., 1., -1.]]), T1 g; i; J' a# C
max_abs_scaler = preprocessing.MaxAbsScaler(). U- `6 z, S# m2 c4 o- _6 d1 s
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
u3 e7 G" ~4 X& [, L# t% P# U# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]]); m/ f$ R M$ X
X_test = np.array([[ -3., -1., 4.]])
7 E8 g6 A" @7 Y. T2 M2 |X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
" B. R7 W( G: Zmax_abs_scaler.scale_ #out: array([ 2., 1., 2.])
; V$ L( ^' f' |; ]# D2 R- t3 w+ q1 u3 P: G% L& R
* [% M; \" h6 r2 {- S
! D* P P9 |# S1 g b
@7 O- P5 Y( Z& f9 Q5 g( Y8 T5 |. U; J' g/ q4 J
+ |0 U* t% a) x$ @% Y% a
, R+ j) ]. x; I9 J: D" f
: _" u; @: ?. { i7 E' c7 G5 [! X& Y A X
" ~8 i! r' ^! L. b* e, R————————————————
& l) i O5 ]* F& N6 N* J) ]4 F' F+ A版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. u$ S* i5 N2 |( m+ R! M
原文链接:https://blog.csdn.net/qq_29831163/article/details/894202237 S+ t4 d8 }* H( u- Z# {3 Q
, F$ h/ f2 R5 x0 S" K q8 k
2 |) g( o# T! @
|
zan
|