- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36352 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13866
- 相册
- 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。
$ w' o9 B2 l+ L6 G8 ^9 A* t6 _, M7 ^4 O/ `' c
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler% f* N: G; N' `1 l+ v/ X
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler( `) [ s7 }( @! o! M
数据变换的目的:
) k3 a; h& V8 a 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。( @7 _+ \1 e; ^& N
6 Z3 x! o& u7 `. k 定义 : 设有n个数据的序列 ,则称映射
* M! r0 [$ J( Y7 z/ |& N! ~
7 {* O5 j( y$ F: y& R 6 r7 J0 C7 j1 u, i! J7 T9 v
1 w* @# T8 t$ f
为序列 x到序列 y 的数据变换。
4 _4 `2 U' T" }, Z! Q9 c% Y2 U7 U) z
数据变换的七种常见方式 Z8 u: D4 y( V' m
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。! i2 C; k8 j; z
$ k. _+ t5 B4 \3 `: ^初值化变换
/ u8 h% p$ |: ]1 }5 B+ v$ s7 i
: U K4 w! n+ @/ J1 W![]()
6 I0 P9 a" e [ 也就是要对每一个数据,都除以第一个数据。( G; s: ~1 j% D8 g
+ `( ]1 O3 o7 M6 }8 S
均值化变换+ P0 ~+ z8 W7 q) J, D7 e2 r, m% Y. J
4 c4 |; s6 Q" N7 U: T % a+ W& F, O3 x) n" V, J
对每一个数据,都除以均值。
7 U5 t! x0 P# ^' U; f
- t2 m5 e) }* _4 a! d百分比变换
. X3 P+ g' w' O5 D7 `5 `; h% g$ z" h5 y# _5 G
3 l6 O; e3 \/ E { T. ^1 s
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。: i: G# }) k# p, N
/ ?5 c+ l/ P. V7 x; i
倍数变换" K& f2 R4 @* Q9 Z% J* _: q
![]()
L2 E: ?6 K) P- Q' l9 r }: u) Z9 P2 d" b# j- F
归一化变换
8 `. s" D1 [ |& t' S. L
5 H) i7 m; Z7 H+ G2 G![]()
, W) |$ l0 v& i 其中 为大于零的某个值,称 是归一化变换。 0 w+ c- V' z! ]9 N- [- `1 s/ E1 w
3 E1 a& [, D9 D7 @& l; w% R, j
# R4 r% y( `3 ~5 B极差最大值化变换
) B. z& }* W6 Y$ l* `. L
( t4 ^1 H' t/ {. m9 l![]()
" ]$ m8 x/ P0 n2 v7 X
1 f/ m2 e& N2 p7 }5 j
0 w2 u* Q3 @" B& E区间值化变换
$ e; `5 A7 `" `& @
8 Y) n. V# q N 7 |2 r5 ~* Y2 D Y4 s
,
& G/ J6 g! ?. A+ }
2 f; t* Q5 D* i1. matlab 的mapminmax归一化函数
6 G5 H6 E4 {3 N8 R4 q函数用法: `# U8 Y3 D" r. c4 e9 P, [
[Xn,Xps]=mapminmax(X,min,max)& J# Z+ }- F: f; E, n
$ a5 T3 Q4 G o. ]9 O说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
0 _3 I3 E" t% E8 ~ F3 E' x+ T* C1 j1 b9 C4 d
(2)min,max规定X的归一化范围,根据需要自行设置
9 b+ }1 {$ S; i! k1 ]
* M% L3 [% d( u# W6 s9 W! x (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
2 ?& I3 U+ R3 y2 {, ]- Q) e& @
, q. _4 E) k2 h4 U- e! }% R! C8 u 调用方法:
. T$ h1 b1 a/ S! ?9 w+ w# G3 x% c# e) ?
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
& R( ?& q. o6 g g& ^
, {0 O) ?% ?- P- t: Y( [/ G) ^$ FX2=mapminmax('reverse',Xn, Xps);%反归一化! D! s- \! }4 j1 d- \/ I
7 F, T* X4 j3 G# _6 l
x=[1,-1,2; 2,0,0; 0,1,-1]& h' T$ o- I- m3 k( a* V
[x1,Xps]=mapminmax(x,0,1)2 }! O9 e. z) @ V6 s+ d
& e. X3 z0 t( X; w9 L! y% g$ u! {
6 f* M% W4 h" B8 C
' ?+ K0 X1 L1 }$ i7 C- i对于python中的axis=0 和axis=1的问题
; ^1 Z! \: n# b 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
! g, \5 C1 G$ M" B- [/ K3 s换句话说:, ^$ a h( t* ?
6 D$ _/ E: N8 N$ m, H F7 m
使用0值表示沿着每一列或行标签\索引值向下执行方法
$ L9 R/ Y; d8 J5 n' H1 ~$ C使用1值表示沿着每一行或者列标签模向执行对应的方法
# q" W( z) I$ k/ A- o* e ' O9 `% m1 N2 q' [! \4 v, P+ a4 Q
9 e! C6 n: K( R
/ G& Z9 Q$ L" n+ ?1 C3 h* a( V
python的sklearn中 scale函数
9 Q; a: g7 {2 O1 标准化,均值去除和按方差比例缩放
% m- m. `& q- ?5 b8 T( R% h (Standardization, or mean removal and variance scaling)
& r" u) M# D. I# J; g8 v6 _: _9 _, H+ p" T" H: M6 h7 o
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。/ c3 \4 x0 Y4 Y9 K+ p" H5 a2 O
: P! `- y _* n yfrom sklearn import preprocessing
7 P; }% \: ~1 `4 h U5 v+ }import numpy as np ; @/ ~, k. k. k+ a0 U8 T
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
% b& Z7 Z2 P; B5 e5 u p6 \* DX_scaled = preprocessing.scale(X)
6 G$ H( y& { y* U& M$ @- W n0 I
#output :X_scaled = [[ 0. -1.22474487 1.33630621]) d) }) r6 U# q0 x. {0 h
[ 1.22474487 0. -0.26726124]! m# f/ V/ U: o
[-1.22474487 1.22474487 -1.06904497]]
2 B4 ~* I2 w0 b+ N7 |- O#scaled之后的数据列为零均值,单位方差
) L' ~1 m7 T7 ~8 GX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) ( I* a+ O1 S; P0 m9 \
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
- B$ h# k' W7 {! {6 p# ~, g* V7 |/ M9 g) M: v
+ E; q- N" x0 |0 H6 Y3 A. _# N+ r( J; i! E7 ]& ~# F
StandardScaler
& K& N1 ]( ], W: ~# [Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
1 e5 f, a2 ?( x- k* _( ^/ w+ q) K5 W2 d- u# o
from sklearn.preprocessing import StandardScaler1 L, o3 Y; a, [
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
4 E1 Z/ V( v+ P4 W: _' zX_scaler = StandardScaler()
' d1 u) y7 o# r( H, m3 FX_train = X_scaler.fit_transform(x)
7 }4 W/ b. x; X2 HX_train4 @4 g$ V3 c% f6 o1 `& |
#结果如下; s6 ^% j: e8 v6 A; m& A% n( _
array([[-1.2817325 , -1.34164079],- B( L3 h4 ~* ? `1 N$ R9 A q2 W
[ 1.48440157, -0.4472136 ],
: x9 B& }0 f) z: I [-0.35938143, 0.4472136 ],' G7 S, ?/ E; i- ~4 a+ a
[ 0.15671236, 1.34164079]])8 Z ?; V0 P. q- Z$ e) F. c
8 n5 o0 [; u" k* f2 m
' a. @! T- Z. y+ c6 S3 R* `7 [' P& E" ]$ U& R6 T* c, y
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。+ D* q5 r0 u. P6 f0 ~
from sklearn.preprocessing import StandardScaler
* B, y7 V g2 A+ H& ~x=[[10001,2],[16020,4],[12008,6],[13131,8]]
/ [( U* m6 ^8 ]* FX_scaler = StandardScaler()
8 e/ m4 |$ `: d! b5 F0 _' H6 t0 UX_train = X_scaler.fit_transform(x)
s6 k8 t5 g6 ^4 p- ^0 T/ @X_train
4 A( T1 [* M; F# P8 [, q. s#结果如下
# v2 @, @$ o! Z( A5 C' Harray([[-1.2817325 , -1.34164079],+ [4 W$ D9 X+ Y; @' d. p/ j
[ 1.48440157, -0.4472136 ],
1 Y) A3 u( a M [-0.35938143, 0.4472136 ],8 ]+ v9 ?+ s q* A, i
[ 0.15671236, 1.34164079]])
4 @1 O6 Z* L7 n- M' \* _$ o( M7 M& S2 v& o7 w. d7 A/ z
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
2 ]- |$ h9 J6 Lscaler.mean_ #out: array([ 1., 0. , 0.33333333]) # M6 d6 Z3 [6 w# w, t; Z$ {
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
6 L) o" v4 s- }; O" C$ F1 B9 }' q% u#测试将该scaler用于输入数据,变换之后得到的结果同上1 C2 Y* | O& n
scaler.transform(X)
/ T1 O& v5 z3 l" i+ N: c#out:
% y& v6 Z6 z% W9 A- Q6 [array([[ 0., -1.22474487, 1.33630621], 5 B* w1 G* x m
[ 1.22474487, 0. , -0.26726124],
2 ], _' \: d3 k# F( \7 j8 a) l [-1.22474487,1.22474487, -1.06904497]]) 3 J* T# `, x `* P5 Q3 f( C0 H8 `6 S
scaler.transform([[-1., 1., 0.]]) #scale the new data9 \+ h4 h) ]- J
# out: array([[-2.44948974, 1.22474487, -0.26726124]])( g$ V4 ?1 ? z4 I5 H* `1 Q( Q2 B2 {
0 g9 V9 ?6 B e( N) A) h9 ^7 M2 将数据特征缩放至某一范围(scalingfeatures to a range)5 t) @6 O% I, L9 G
/ |6 Y3 M- v; w/ i9 G8 e6 m0 C+ t; h0 o- x5 T) g# A
2.1 MinMaxScaler (最小最大值标准化)
3 a7 ^3 n. d0 p1 | 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 ; R, x/ @' |# H3 b
0 P( I! Z2 ]4 N6 [0 O4 ~0 {
from sklearn.preprocessing import MinMaxScaler
/ p* I1 W2 W) w$ N# fx=[[10001,2],[16020,4],[12008,6],[13131,8]]9 E3 C; B2 O6 w; {6 z! Z
min_max_scaler = MinMaxScaler()+ ?/ A o# H5 O% g6 l7 c# E5 h
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,9 I# u1 i- Q! j
* r. E3 X0 \- y k+ }9 r5 F9 B( o
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
" r P( e7 N* C' T$ AX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
7 V h- C0 L4 \! P! B, k3 S; s4 h T$ h' X6 V
MinMaxScaler的实现3 x6 ~! z# K( V# n. |
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))" Y) [8 Z7 R; M) Y1 U( [: |) E
X_scaled = X_std / (max - min) + min
* h- N, ~: x# E" L& K3 L5 x
* e& Y& {6 Q6 c' X, T) `" k# A这是 向量化的表达方式,说明X是矩阵,其中
* C' Z0 l/ F) l2 B8 Q" v7 W+ G( U7 F' J# {8 y
X_std:将X归一化到[0,1]之间
' C0 M; ]7 i: J+ k) e1 [X.min(axis=0)表示列最小值
/ m# t2 @% p9 C- T ]. Lmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围: S( ]* m4 E9 A( g$ p+ h
, [5 ^; p/ K5 x' F; i# S
2 q- [% Q; p, ] P# l. t; V2.2 MaxAbsScaler(绝对值最大标准化): K! D8 n9 n5 T/ Q) ^
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。7 O9 C3 V4 a, H1 P z' ^: L+ o- l
. D1 N" y0 }& A' z' c9 j; `
X_train = np.array([[ 1., -1., 2.],% Q9 b/ n3 }+ c9 b# f4 T
[ 2., 0., 0.],& _; Z" v! k. I$ H
[ 0., 1., -1.]])
7 V3 z% `* N8 ~% R: wmax_abs_scaler = preprocessing.MaxAbsScaler()
! r% ^" b9 }5 ^) ~X_train_maxabs = max_abs_scaler.fit_transform(X_train)/ S! E4 P+ o# Y4 L9 f) {! X. e
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
" M! j) b+ B: D( u2 [X_test = np.array([[ -3., -1., 4.]])
* O9 u6 Z Y+ O: n. Z. E( ?8 VX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
( S' B9 @% k2 q J p* I8 Pmax_abs_scaler.scale_ #out: array([ 2., 1., 2.])
$ a* j- V# c% |1 M
( W# J+ k* T; r8 N/ h. K: Y& ?# _" D0 f" F6 K4 g
2 H: \- T3 x( Z
0 b1 i9 v/ o& ?8 h2 ]; y) e: p% t2 Q
, t. R6 I! D* T, _1 T4 g& ?( a5 H1 ]$ H
4 h* C6 |/ d9 C; B/ N
$ p: Y" m- G' C2 [4 ^+ S5 k& n! ~
; b* j& ]: X8 X& O, L, Z8 ?7 S
————————————————. C' n4 [( \7 i P0 X5 O
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 E. a, i) ]: L8 J( `% J% e原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
& c4 g" n5 } {: X3 e6 [
& K% @* }( X* l% y$ s% P. _6 B2 s( l9 c j
|
zan
|