- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36258 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13818
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 10
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
; r( f3 `; w, p0 a4 {8 G X" h* U/ n6 r/ l1 F
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler0 I+ ^: y- H! J9 N
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler7 ]' X6 y3 I; p4 a" T
数据变换的目的:- L# m+ d: k6 ^5 x. v# g+ Z' Z' c
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
9 k1 w# m# ^, W7 i" a9 e& T( B0 ~. `. s, r2 L, _6 _1 M
定义 : 设有n个数据的序列 ,则称映射% i* d. [; ?5 j5 C9 t( |
2 {0 ]/ k3 m" ]/ U. q8 x6 `
6 A8 A+ O# L) F, v
* M, P$ ?* x; [( @5 ~+ f9 h 为序列 x到序列 y 的数据变换。 0 f6 l6 D. ]) `2 N- u5 }- j
3 T5 E& e1 U4 L! n
数据变换的七种常见方式, v* b5 h E# ^9 ^- q2 R
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。6 [7 K/ ^$ g( Y- e
; ^: [2 j% q! Z+ v0 L初值化变换4 M1 z ]% i* c, Z
& }# B$ \2 V& g, x
![]()
3 m- ]6 k/ W6 p0 D ] 也就是要对每一个数据,都除以第一个数据。
2 O1 w9 U8 }! D6 ]/ K; _: u
1 K: q7 H% h6 v- k% w, Q1 l均值化变换
' |. h4 p3 m% o6 L& J! t+ {# R# j E
2 i& z6 @; p0 Q; C ) |7 H1 {8 m1 X
对每一个数据,都除以均值。% f# M/ C2 w: a! E" w0 R
1 k5 O$ o ~ V) ]3 Q
百分比变换
% i7 [" u7 ?+ H8 \
+ q- a/ G0 v' c# M![]()
. e( a( S' e+ m; t5 t$ I. ?9 z& z分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。 X# P9 X! ]# C2 Y1 b. |7 X
- k* \: I/ W3 `
倍数变换
. g0 R. D- A$ h( k$ g& ] ![]()
) s# h0 `" u. ^; @! B% v8 F# Q/ ]+ v' i
归一化变换
w, p) {; k9 a7 t% o
; P. l; |% ?+ q![]()
; v8 G/ n" y& r2 [2 a; E 其中 为大于零的某个值,称 是归一化变换。
; P; a$ X! u+ [) X$ f
/ H4 u$ c* w ]" P! c M7 e) N0 V, m9 p
/ W) ~3 k8 L$ R极差最大值化变换! K1 b5 a6 Z5 A2 H( b& w
) H3 x5 N( W0 f# H R5 P! K
![]()
7 ` x0 Q; e# E- H* J% |0 k, O: h4 t" l7 h
; n( K# U' u! r( L! Z9 ~区间值化变换
$ C4 J' w( W; D; Y$ i, `: Q1 H1 R: t. [" K
9 E7 K4 a$ m) F4 c0 x# Y$ A: y
,$ T6 E. Q/ i, p
7 O: ]# b& N7 ]+ l+ w, Q9 X( H' [
1. matlab 的mapminmax归一化函数0 u* Z! Z7 e7 X' [+ Y9 n
函数用法:1 V* U5 C% H3 e
[Xn,Xps]=mapminmax(X,min,max)/ z& e# x! |* _
7 `; b; Z( X* `/ d. N$ [说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。4 G; G. f! J6 g+ o# v
2 X+ J; v/ G7 L! g, b* R9 e$ { (2)min,max规定X的归一化范围,根据需要自行设置
7 D2 D' h# w5 Q5 ~+ a
. X/ P' q2 S% i (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 / A" V; E9 u2 N k7 [
2 O6 _% P8 M# O- }7 _8 ^# d
调用方法:" X+ x& T, n# N3 S& s
- ~) u- Z @ @; H# N( I" fX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化, U7 V9 G, S' n6 l7 D: w' _
1 [; R5 h& ~3 A
X2=mapminmax('reverse',Xn, Xps);%反归一化' t! e/ S! X# C( A5 Z) X3 W& B- w! ]
* V9 y2 v4 X# Z2 H" gx=[1,-1,2; 2,0,0; 0,1,-1]
# |7 {7 J& E& ~4 x7 S9 Q[x1,Xps]=mapminmax(x,0,1)
9 {7 O7 _6 {+ ~4 ]; c: t! y
/ E$ n/ V. C* b( Z; J
* V! x3 H+ B- n7 ^7 p& W0 w! p5 O( U0 v4 ^0 k! p2 ]% s
对于python中的axis=0 和axis=1的问题
, T- h/ E3 g' I# |* X, I" C 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)8 u9 Z+ I ?6 u9 C7 x
换句话说:
, O) I+ I3 S' [& q/ `$ P6 C: \
. A$ s9 r% ~1 u" @- \* F% R! z使用0值表示沿着每一列或行标签\索引值向下执行方法# R/ b. D8 l4 W) B2 ]/ G
使用1值表示沿着每一行或者列标签模向执行对应的方法
; }! l. J- P4 `7 V& O4 {6 }8 S" u ' U: @, @* N# E' ~* C( {4 n
1 V) p7 M3 S6 B
8 j8 E1 g: r. q+ ^5 L
python的sklearn中 scale函数; ^4 q c3 [( [3 l) }% l
1 标准化,均值去除和按方差比例缩放* u$ {' T7 j8 Q) n# e& n2 G
(Standardization, or mean removal and variance scaling)
. m: [" z, m0 N9 d) \. Z
1 s6 n1 R+ ^" e! U" _# N 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
+ z( G3 w# ~" S q
1 w& a" S2 m8 K- G" _1 ofrom sklearn import preprocessing
4 U0 q1 m! n0 l1 G* ~import numpy as np 8 A; l1 K G% u* N
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
' _. a% u$ d6 r v8 LX_scaled = preprocessing.scale(X) ' x- x! T7 J7 R. ^; P: ?: X0 J7 e
- c+ ^; ]1 B6 b9 V7 U2 ]0 Z7 |#output :X_scaled = [[ 0. -1.22474487 1.33630621]( |4 h) h7 ?; P( m9 _% W
[ 1.22474487 0. -0.26726124]
4 U4 |2 j, G; T! e# y [-1.22474487 1.22474487 -1.06904497]]( K6 S2 c& N& L$ E) Q# n
#scaled之后的数据列为零均值,单位方差
4 a5 u; y" g; ^6 ^4 n, H& Z' Z; AX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 5 |. y- n, J* Z
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])9 p; Y4 R3 y6 [1 Y1 {/ W
* C# k6 q4 j) P& Q4 u( f
! y" Z5 s$ _/ P" `& h- ?
" Y; I6 W% Z( W' U3 P8 |StandardScaler
3 q% K; }+ V4 c& IStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
8 S9 H7 J) H3 `3 r3 `5 R$ i. P( K! r* T+ P
from sklearn.preprocessing import StandardScaler+ c9 N- |% Z: t: S" I, D R% a" `) x
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
0 v2 q5 v6 q3 [8 u3 `, q4 E7 fX_scaler = StandardScaler()# n/ o* H7 X R6 L4 o z* B
X_train = X_scaler.fit_transform(x), k* a5 s: g, q9 F
X_train
" ]( j% q8 D6 O. c+ A#结果如下
+ W6 U( F/ _% xarray([[-1.2817325 , -1.34164079],
2 k# x- `% y B! E4 }6 d0 h4 f [ 1.48440157, -0.4472136 ],# I3 I( D" M R8 _
[-0.35938143, 0.4472136 ],
" X5 w/ ]8 ^6 d; v [ 0.15671236, 1.34164079]])6 s6 X- Z- i5 m0 e9 C
* o2 P1 w+ Q' I7 ?1 y4 X
' _, A2 p* u3 G( m8 I0 i9 V+ m$ \: T# n: t- o
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
4 Z' |3 G, h+ r0 j from sklearn.preprocessing import StandardScaler
8 o! ?) ?+ t. Dx=[[10001,2],[16020,4],[12008,6],[13131,8]]$ \9 E2 e% p6 s
X_scaler = StandardScaler()+ @& M) j9 ]( Y/ s3 N% q' p6 V
X_train = X_scaler.fit_transform(x)1 b# Z0 K* ~: c# _9 ?
X_train9 D! |) T- C/ r( Z- a' J \ @1 d
#结果如下! h6 @1 T0 Q! |8 I2 Z' \
array([[-1.2817325 , -1.34164079],
v& A3 I1 } y5 E0 X. `- E0 V [ 1.48440157, -0.4472136 ],
_, o( n9 s* b* g, ^, W$ W2 E( W [-0.35938143, 0.4472136 ],- L% {+ n/ D- n- |& Y
[ 0.15671236, 1.34164079]])* d! W1 H. v/ I
0 O1 s0 j2 i0 J+ g: O) C
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)* e, u' o7 W" J; G2 J0 }( X% z
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) $ A9 z, K# ]" ?
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) 5 e+ Q' M- H, W$ B
#测试将该scaler用于输入数据,变换之后得到的结果同上
# a8 n# K8 k* Q/ Tscaler.transform(X) 8 J7 g- |0 x5 ~0 \3 f0 h- Q
#out:
/ e/ Z# S" {7 ]9 Q/ K9 P4 V% N6 jarray([[ 0., -1.22474487, 1.33630621],
, e3 X4 s! {; J6 O8 u [ 1.22474487, 0. , -0.26726124],
- T n) n4 I1 m0 {' n [-1.22474487,1.22474487, -1.06904497]])
! Z9 r# \) z- X( j/ g, xscaler.transform([[-1., 1., 0.]]) #scale the new data5 L8 B0 Z4 k& x
# out: array([[-2.44948974, 1.22474487, -0.26726124]]); V! U; s- }. n
/ z: q& ^& d$ T j! C; P2 将数据特征缩放至某一范围(scalingfeatures to a range)0 b3 K+ u$ z( m$ v, F( O- ]7 L
3 c7 L4 |! }# x1 p+ L
- T$ U9 Z' H* o+ S
2.1 MinMaxScaler (最小最大值标准化)
% v6 O5 w* L. \8 g" ^ 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
% J9 V6 m# \+ i+ |4 T" q& Y; f" D7 i
from sklearn.preprocessing import MinMaxScaler. ^! ?! D8 x4 B4 d" p
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
* e6 ~/ a$ y" v& y* V# D cmin_max_scaler = MinMaxScaler()
' S: A( R" k' ~X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,3 C. i6 d- }, F" T; Z Q$ Z
. J; V- C. H& m( Q6 u: umin_max_scaler = MinMaxScaler(feature_range=(-1,1))
- }9 o, r' t/ R0 X0 M8 M5 oX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
! w! ]2 u9 r; b b) D' i- ~0 x
: [* L6 h6 T8 h2 ~MinMaxScaler的实现) y& f0 g/ L+ X$ j) @" y
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))) ~* ~/ ~9 K$ {8 q5 s" a
X_scaled = X_std / (max - min) + min
* d- s% H7 r, c( m7 a/ S& O) ]: ]! _
这是 向量化的表达方式,说明X是矩阵,其中0 |, t, h3 \5 A3 R6 N
6 W4 C; m& X2 S* X3 j5 p/ _7 C1 B. o
X_std:将X归一化到[0,1]之间
o- G! _ w3 r3 iX.min(axis=0)表示列最小值: k6 ?* `1 A1 s* d) }
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
6 q" j2 w$ x+ d' Q. K' g, |! ~! r
, Z3 }% k! H P1 l$ J
4 N. D! |' Q+ a9 @+ H, @2.2 MaxAbsScaler(绝对值最大标准化)! O8 c( I* z3 c" _# k
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。5 Z* x5 B( M* |
' F# y' O3 e( cX_train = np.array([[ 1., -1., 2.],8 X1 i0 b% f6 E) j
[ 2., 0., 0.],# ]2 N9 b4 F9 _4 A3 n/ j
[ 0., 1., -1.]])
- J3 V* V* K6 m, tmax_abs_scaler = preprocessing.MaxAbsScaler()
7 X2 u! ?5 ]- S: M* s O0 iX_train_maxabs = max_abs_scaler.fit_transform(X_train)
% S- G; D x3 j6 m, {, e# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
4 k( ~% h7 m( H! W9 W: c- r/ uX_test = np.array([[ -3., -1., 4.]])
1 P9 W3 U. ?! C2 C" e: V+ R YX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]]): D k7 u5 E$ n
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])* a2 u. U+ L3 X `- Y- O7 o
( z# t! v0 m5 E! [) X% C: h
! }; T% e/ K3 x) T h% r# D* u, J" r. ?! _; l; Q7 E
9 Q: ~1 ?& _( @( W3 I7 G$ ]+ }
* v/ C3 s+ M( k: f. [1 @4 l6 t5 ~
2 a5 {" o6 c, `: {( S2 s
5 ]: Y; S& z- q3 j9 p6 [) R: N7 |0 w( ^9 z! M' W
& G9 c0 w0 ~9 M9 C
0 Y6 n$ Q# |, g0 b) o8 D( w
————————————————+ R/ w* I8 X$ k; I3 @3 B- I
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 @2 A/ E+ L @原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
, c0 ^! [& m N% m4 W" I
) a, |# J4 \0 Z; R' r" R9 D% I: n' N! X% O2 [" m' [
|
zan
|