- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36355 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13867
- 相册
- 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。' p: l: L/ D% }3 q
$ l" G% j; f x$ J# l当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
4 I9 i( L8 E) {% O% l4 [! b当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
7 h5 K& A+ m5 Q t% o数据变换的目的:
& V n# Z1 }6 L# Y 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
/ V8 k& {: a# n) P: o
# Z: A: t: X+ }7 N 定义 : 设有n个数据的序列 ,则称映射
/ G. y4 Y1 O. A# H" \, h. u( R! P* [$ {" V" w% r G
4 T: V7 t: I2 K( y+ J# n# Q: }. x
为序列 x到序列 y 的数据变换。
( n7 g$ r3 L/ h9 F1 S3 G6 E, \8 n0 W: Y
6 F! Q: T K; w9 ?5 P4 c- Z数据变换的七种常见方式# S' M9 \- F. Y+ r( K1 j+ r/ I9 k# {
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
+ n, {7 i3 N: Q+ z6 V$ C: ?6 t1 X9 g
( Y: ^- V" _! n2 H0 K初值化变换
* }( k% Y" Y" ]6 L
, |) l. |$ i5 c4 L+ D0 | 5 L& O# h/ C) d& D
也就是要对每一个数据,都除以第一个数据。2 m; ]$ G+ @9 B; l J" P, N5 l) \
. h4 y) }7 w3 t7 v均值化变换
; R: h T8 `: o% t$ x- x' P2 l8 W: \. f
![]()
: C( D. ]9 F2 o; b 对每一个数据,都除以均值。
8 e' W4 E, V& z
7 V B- Q+ p8 i百分比变换
n" t1 w) {, ^2 j, W& p- c( H% M7 D3 ?7 h5 e
![]()
4 w9 }7 `" X& V1 U/ v2 ^, I分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
2 L% \$ _; ~9 I; d2 w0 o4 Y8 C" I* N2 {/ e! D# W* }3 U
倍数变换
5 O( B$ K# M0 @" ?4 T' O6 t 8 n5 W3 D3 W' m. d3 B ~' y
+ k$ Q1 |) \1 x) [+ i
归一化变换& M4 _+ B! c5 @+ M6 Y/ L7 M" X- ^
$ i* x0 t! s. n% @' Q
![]()
. m- T1 W7 H. Z9 e6 S, _3 Z 其中 为大于零的某个值,称 是归一化变换。
2 U' m, G+ d ]# V2 [
+ L3 O4 _; ~& a8 H% n0 |% Q" D: y* }9 W, m# ^
极差最大值化变换6 r% |) _. _2 c
0 g5 _, I! m8 Z * i' \, Z$ i2 v; d& o5 Y
5 j2 h' M$ D+ s
$ i, ^! @2 ?7 A2 m$ ~ S( R
区间值化变换4 K7 @7 O y/ q: }( T! t1 F
* f; X. r& q2 O" P
1 }6 y' v4 p2 |( x
,7 [9 I# @7 Z" N1 r# e" I3 w
- G3 q0 B0 I/ b4 E
1. matlab 的mapminmax归一化函数
" U: C" ]4 G/ n: \函数用法:
X# t2 j6 _$ _/ X0 t6 x [Xn,Xps]=mapminmax(X,min,max); T0 _3 K: ~3 T- G
# u2 z/ K8 j( e
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。6 p# t' ]; o/ U' ^. q2 x
" H6 O" D/ x2 v( a& \$ v
(2)min,max规定X的归一化范围,根据需要自行设置: w2 V. {0 R9 t7 T
2 e {$ ~* q7 R# `2 t (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 , p! n2 a+ ^( e/ F1 s7 V0 I% A8 s
W. X$ c' K" j
调用方法:. A3 r4 A& E$ Z: M( M/ G
+ r, a% M( w& MX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化/ [/ Z, B& M1 w( u
8 U/ r* S- Y5 h& Q% _! ~# o" g" \5 v2 nX2=mapminmax('reverse',Xn, Xps);%反归一化
7 y2 Y! Z7 F/ l4 a& s5 Q. e6 S$ G9 \/ M& U/ X
x=[1,-1,2; 2,0,0; 0,1,-1]+ p; M; L( _ {1 L$ V5 G
[x1,Xps]=mapminmax(x,0,1) J: z- g( b4 a9 p W3 I
8 h: O$ u$ J1 T( i/ d: H7 P
3 T" z0 _: e3 @
* u# W, i: d! D% i; ^" F7 X2 |5 A对于python中的axis=0 和axis=1的问题 |, H6 `- c& q& @; d/ P9 d
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
4 F2 v0 Z% m; R换句话说:
7 U y2 L% x8 S0 t$ T
, k' c+ x8 g) i+ k$ x/ q0 ~使用0值表示沿着每一列或行标签\索引值向下执行方法
9 e% c& J8 ]- w) i1 \0 p使用1值表示沿着每一行或者列标签模向执行对应的方法" x3 P" z% c+ \! i
3 c4 a- K# v0 `
5 U4 J' _9 t7 E; z- E
8 d/ K) w) ^8 y% \/ m2 v% i+ Xpython的sklearn中 scale函数
, D) c# n1 @1 H5 n5 r. w4 A$ s1 标准化,均值去除和按方差比例缩放3 u+ T! j( J5 `/ w: x
(Standardization, or mean removal and variance scaling)
4 d) U8 @: \& J' L! q! T7 `/ m- m# ^: V
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。 I% q F9 q2 s
4 R+ n, X @' X$ u" x: c
from sklearn import preprocessing
, z7 J4 Z+ c- H. Mimport numpy as np # k; A4 K; h% ~; [% H
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) # d# ?/ z* z/ S% U
X_scaled = preprocessing.scale(X) 3 R/ n* g# p) X. I: q3 }* r
& z# O8 R R0 B: K9 E" ?% R9 m
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
5 [$ P- b- C8 ^ [ 1.22474487 0. -0.26726124]% l5 E& t3 V( y
[-1.22474487 1.22474487 -1.06904497]]
d1 U0 f) X4 I! A8 ^* M; ? ?#scaled之后的数据列为零均值,单位方差8 C6 N" G B6 r
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
$ Y6 P1 f O0 T: f- g* L9 n9 tX_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
# S. @5 r5 {; P5 v& x
- z- C) M) K3 K" Z% B D
* A- m0 ?. L9 Y9 M }/ M' ?, z5 R( A( p' {% n# M
StandardScaler ; U2 F) q9 s7 o3 |+ t7 j
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
" X# S' D. T' F9 w- r G- X
9 ]& \. W- p# D8 S& T2 G0 ^from sklearn.preprocessing import StandardScaler) l$ B" v( K4 d% q6 h: D
x=[[10001,2],[16020,4],[12008,6],[13131,8]]2 j* V' f, g1 F) J) D( z; P" M1 h1 k
X_scaler = StandardScaler()
. n3 }# J; }* x: CX_train = X_scaler.fit_transform(x)
4 C4 k( U4 \3 U% ~& D! l) T% H' lX_train
! k$ k( F# C$ x/ `' u#结果如下 n, {- r: Q3 P. W
array([[-1.2817325 , -1.34164079],3 U# A# F4 B/ Z8 w( G9 }
[ 1.48440157, -0.4472136 ],
) D0 g4 b3 ^( l6 q% b7 b6 b" P) [ [-0.35938143, 0.4472136 ],/ ~8 I8 ?% H9 W5 x( Y
[ 0.15671236, 1.34164079]]): ^- {7 |- W! C" l5 C- L, c- H8 B5 t
9 v# I5 n( ?5 ?2 y
, p& a, h1 Q4 o7 H" l) q! b# H5 m$ O% T, ]4 u
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
' D; R5 e% e8 f. I# ]) T from sklearn.preprocessing import StandardScaler
; v* S0 R- T% [8 tx=[[10001,2],[16020,4],[12008,6],[13131,8]]0 f9 L- q" Z' _1 w( Z' h
X_scaler = StandardScaler(): h0 d! g! }* w- c' ]/ l" g
X_train = X_scaler.fit_transform(x)
& p2 v) U: H5 `& v7 jX_train
( t+ R1 W/ M( T, r3 s4 A#结果如下 d0 I- h K2 G: j& j
array([[-1.2817325 , -1.34164079],4 P# _5 S/ M! ?
[ 1.48440157, -0.4472136 ],
7 z% V$ T9 l- q% ^ [-0.35938143, 0.4472136 ],7 E" X% t8 U1 e- n# Z9 Q
[ 0.15671236, 1.34164079]])( ?: m; C* u" q. W* l0 |
. W6 c, X5 L4 g0 f+ l
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
6 O6 R6 L% q) k7 H7 Nscaler.mean_ #out: array([ 1., 0. , 0.33333333]) E$ \+ b$ y* D, r3 i; o# Z) _
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) H0 N# u$ J% x5 I/ R3 d$ o- [
#测试将该scaler用于输入数据,变换之后得到的结果同上& Y! e/ z: f0 {6 W; V6 \1 q, \
scaler.transform(X)
2 {3 Z! z* J0 y {5 ]# G. M1 s" f; V#out:
8 [ m- W4 z" D* F+ [! v, d! Qarray([[ 0., -1.22474487, 1.33630621], 8 {+ ?2 O+ v/ m2 A
[ 1.22474487, 0. , -0.26726124],
1 `# O9 I5 ]; G+ {! i3 @9 ^ M. u5 i [-1.22474487,1.22474487, -1.06904497]])
0 A" z4 D7 b$ m! l1 yscaler.transform([[-1., 1., 0.]]) #scale the new data
6 e2 ~9 u3 ]$ G7 P# out: array([[-2.44948974, 1.22474487, -0.26726124]])! H, M% I/ }# ^% U3 P
- V$ B$ z* ~8 O
2 将数据特征缩放至某一范围(scalingfeatures to a range)/ M' w `, u* p8 l# L
, B4 ^7 R. D2 E4 h6 G
2 g: \6 X& y* p+ R) r2.1 MinMaxScaler (最小最大值标准化)
7 R7 c4 @& J; _# o# z 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
9 B7 O4 l z. B# `( o% K8 X! ], e9 V: H
from sklearn.preprocessing import MinMaxScaler4 m$ L( V7 D7 A& W
x=[[10001,2],[16020,4],[12008,6],[13131,8]]. z& M& Z/ r! y* q, T/ a
min_max_scaler = MinMaxScaler()" [" ~9 d2 j; g r* k* i+ z! W
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,7 q; F5 ], N9 ]7 w
3 b# q* K# q( B0 |
min_max_scaler = MinMaxScaler(feature_range=(-1,1)): ~+ n% M z$ K8 j* J& C9 F
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果0 p, }9 |- Q( s5 q4 x8 }
# C, u- E/ `. n* |
MinMaxScaler的实现+ }; {2 K$ f2 n% H: x. i& x
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
) U, a- M4 a: N& x C4 wX_scaled = X_std / (max - min) + min7 b0 G# u4 c+ c( D* L5 F
6 }( u3 H. O' ]! f+ C: K' y
这是 向量化的表达方式,说明X是矩阵,其中
$ U; m N2 u/ b5 r, W. P% _$ o* i( k! x2 J* i% Q
X_std:将X归一化到[0,1]之间
/ _9 V; X5 g! q7 t, y+ vX.min(axis=0)表示列最小值: l( S% f9 B# K3 l3 {0 u6 h
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
' s0 p0 o; N& |; t8 l! y4 D3 Z+ {3 Y' [
a) }& |9 K4 Q |, ?& j3 Z# [! Y6 n
2.2 MaxAbsScaler(绝对值最大标准化)
$ n% {* h2 d( n9 W Z 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
2 I6 n: Y. c, p; x" u( b6 x
5 p7 ]& z9 B/ ?. |& XX_train = np.array([[ 1., -1., 2.],
6 g( G+ d8 h* o" `% \3 v8 Y [ 2., 0., 0.],
9 u1 h( M6 d, Z3 B2 n3 k [ 0., 1., -1.]])6 M6 ^6 w' w7 H2 ~
max_abs_scaler = preprocessing.MaxAbsScaler()" Q, u- _ |5 x& I, m+ O
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
" n$ e8 U j* _# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
! b3 }7 C; d6 i/ b9 _0 r W3 EX_test = np.array([[ -3., -1., 4.]])
3 C7 j) ?! c+ C* R8 K. t# ?" ]X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])2 T* n% g% v- N7 h0 m+ [" k1 M
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])5 I" M0 s4 f. D# w0 H; v/ U
- M4 h2 u3 A1 [9 q: ]
a, y3 i2 Z( n7 Z, B, }
* M! a( T" p b3 U! B; V
) [0 q# ~) h% h" {9 a% u6 G; O. N; b2 z" M$ n; l2 ]' {* }
$ b! g5 H" h7 t4 V4 [- Y. u- N3 e) i' b* K
9 f |- y. [0 g0 J) `* Z; G# p3 x2 @% o
0 K6 V( c; s. z0 Y
————————————————# h$ T/ m2 n" N/ G9 W
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 z4 r1 c, B2 y3 T" ^9 C6 \$ z' L
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
! C# ^% C5 e& C6 X# Q0 g( D
3 ^! m4 Y: E# x: }
4 U+ b8 k* E5 U3 x+ B |
zan
|