- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36467 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13901
- 相册
- 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。
3 N! H& L; B% A. @/ r& e i8 L( t3 S: k! ?; K6 I# U
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
4 }2 V V. B7 t" e2 w当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
; X$ }6 M6 [1 ?0 Z0 q) |: {7 F数据变换的目的:" C0 P8 }' S0 g, E! I
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
& Q: j% A: _3 U
2 p( i& U$ j2 W8 N$ D 定义 : 设有n个数据的序列 ,则称映射" N" J t U- @& H
8 M1 P; F' ?% _! M% D8 e
+ V+ ^. U9 {6 ]
: d# T/ A2 S! c! A 为序列 x到序列 y 的数据变换。
9 B7 \0 `2 V$ z! y3 X8 m& \# x
5 Z! G3 C+ F8 o' F, w) |数据变换的七种常见方式0 J- k' y$ \. {* x
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
/ H; C. B/ c# n5 T* x1 `1 F3 t, ^$ e
2 \! ?' ?- F0 G: Z4 i/ Z4 _) x k初值化变换( T# @; c% d5 t2 `4 W
4 v7 v: \2 O2 P( r/ w* ~ 4 T3 \ L3 b$ [, S: w1 z* B% `
也就是要对每一个数据,都除以第一个数据。2 W% z9 _( Y3 W& n* |
- o- H! u: L [: J8 ~均值化变换
* x6 X/ H& f6 y2 D: j( y5 H
* R' M1 i2 x F; w; s![]()
: Q1 h1 ?- Y( z( w! j+ R5 f2 g' g$ X 对每一个数据,都除以均值。
7 r3 s2 L. h9 Y6 h* c
( p; l) M" s0 ?$ @& J5 w. F; O0 e百分比变换6 N4 y3 j) [! s$ P* h+ Z
6 c' ^! @; X, V7 l. \- ^, Q6 o
![]()
I( S3 e& O! j1 G分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。6 q) g& b+ b4 B
6 x) T4 j8 o$ X1 x
倍数变换6 J8 G8 k3 k# x% `
4 \7 m7 K* t! s* z0 O! }8 d
1 c" K1 l3 C+ S3 z. T& a
归一化变换2 ~! _) `* ^9 w5 X; T# l
) v7 J" M J8 R; e" p1 m
![]()
" V3 Z4 Z }% ^- T$ W# U, G& x$ l 其中 为大于零的某个值,称 是归一化变换。 ' a" ^( v% d. K8 |' Y$ K# V
6 g: @0 N, i8 O$ q
& B$ P ~3 Z9 w6 g
极差最大值化变换& O- [8 y- T1 y* `9 W/ _3 u# G
5 l# H: d/ r- j( ^; e, w$ e {& d . X/ ]3 N/ Z4 O% z
7 U* {) F% X7 F/ z$ S8 e4 |
7 F/ B0 K0 |7 \' n( K5 m6 k5 Z. x5 g区间值化变换) ?* p/ c i6 R! }/ m
7 k# _5 o2 z1 |. ?! z; \0 v1 m7 g![]()
4 u/ u- R1 Z6 j ,7 g8 O$ x+ ?7 H4 Q0 z
5 l5 L+ H8 T4 [- s( z+ y* [4 t1. matlab 的mapminmax归一化函数
( A$ K; s$ }2 ~& R函数用法:
1 E6 x r4 E6 |9 L( e [Xn,Xps]=mapminmax(X,min,max)
0 i% k2 b* d5 @
3 W& s* u5 }/ R说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
! s- z& |, @* {+ Y$ F3 s" n
+ ^- Y1 E6 R3 Z (2)min,max规定X的归一化范围,根据需要自行设置' Y8 s" |, l, o* @3 O6 p3 R% t
$ X6 b7 x! j8 Y/ f
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
7 U# t, w! f2 W$ Z2 L* m2 [$ X7 C8 T! O3 r! z8 P; G+ L
调用方法:( _4 |0 n6 z/ j6 N' X: M
' _7 J. @9 w' JX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化5 ~2 M# X$ C& o( }% w2 W
; t- P4 l3 I! Z
X2=mapminmax('reverse',Xn, Xps);%反归一化/ T% _6 @9 J+ g. y
8 B, q% @4 m, _( Z
x=[1,-1,2; 2,0,0; 0,1,-1]. K) v+ \6 ^4 B- B! n- j
[x1,Xps]=mapminmax(x,0,1)( ^- k) {$ U% `2 c, |$ S; E6 R* e& ]
. U! K) D$ o/ @; |7 x$ g
& d k& x' F2 X8 b6 c3 k2 w
9 V+ o8 ]; m# q* r
对于python中的axis=0 和axis=1的问题
N, ]7 R+ T3 F6 h6 Q5 ~8 t# U( U 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
) ^% [# L( a8 ^0 r; E, k, x换句话说:- a6 z$ q0 O9 Z. a3 o6 T
3 r6 v M4 r1 G) J" m5 }
使用0值表示沿着每一列或行标签\索引值向下执行方法
8 S& ]* B' `$ v3 N% z: a7 c使用1值表示沿着每一行或者列标签模向执行对应的方法
" F' p& z" m# R5 }![]()
: w& r7 ^5 W# ` T8 s# z, F% f4 j- X7 G! ]4 `
+ f* A9 V) c" f. ?& N
python的sklearn中 scale函数/ y8 i E9 r6 {, r! \+ N
1 标准化,均值去除和按方差比例缩放
8 _, A7 @* w+ H) X (Standardization, or mean removal and variance scaling)
3 R, o9 H/ q- t& [0 ~* C: L$ T- W! P/ t9 `5 ^: C# e r
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。+ X3 r& C( o: M
9 o$ U7 E, e, F; K }7 Wfrom sklearn import preprocessing
8 X+ S+ B2 h8 c5 c" K/ ximport numpy as np
5 I0 B% s+ j, W4 P2 \6 }X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) # [. ^/ u R+ j
X_scaled = preprocessing.scale(X)
7 N/ I6 R+ R' v) G+ K2 ^5 m9 s7 z/ A! m
#output :X_scaled = [[ 0. -1.22474487 1.33630621]+ S2 [2 s ^" J0 E6 x. Y
[ 1.22474487 0. -0.26726124]
$ D0 u3 w& g" `! G [-1.22474487 1.22474487 -1.06904497]]
( s# N) `9 C) a& o#scaled之后的数据列为零均值,单位方差
7 x# o" L3 {& kX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
% K7 G& n8 [3 ~) f) RX_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
B- Z& n' \0 C6 W3 n9 D4 K+ M. g3 m( I) X& u
5 {2 {* y9 ]5 w1 m* E8 F
$ l, x! P& J- y
StandardScaler
+ A+ E8 A& e+ ^, rStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)7 {: g. k% B3 y* O7 ]
- e2 y0 q! \: jfrom sklearn.preprocessing import StandardScaler
. x5 M+ A9 U3 a s" Yx=[[10001,2],[16020,4],[12008,6],[13131,8]]
6 w$ s" p( |; @0 d# CX_scaler = StandardScaler(), _7 c- q1 d0 X( g& C& O# m
X_train = X_scaler.fit_transform(x)8 \9 @, _1 |- H5 H( q
X_train
- [# [& ]" J7 L#结果如下8 ^' b% m" Y/ m$ V! E: J
array([[-1.2817325 , -1.34164079],
2 B- C( n" o; u6 l' H( d [ 1.48440157, -0.4472136 ],
$ h6 d5 }7 T5 x$ Z, g# _ [-0.35938143, 0.4472136 ],
5 c& E4 c, ?9 E$ X; g, J [ 0.15671236, 1.34164079]])& R) C5 f3 s/ K2 x; {7 o1 o. j# ^
" l" z& T9 s3 L C
T4 Q1 r0 c5 R( [2 U1 X; \( O/ x$ a+ Z6 `% x; {, H/ u
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
0 L- K5 n+ i, Q: D/ } from sklearn.preprocessing import StandardScaler
5 w- T. e; ~+ u3 e! {x=[[10001,2],[16020,4],[12008,6],[13131,8]]3 ?9 C9 f9 p3 H2 r. }
X_scaler = StandardScaler()- I5 d1 N8 k. \+ p
X_train = X_scaler.fit_transform(x). u- ]" ?/ D3 b( c Y. ?6 V/ p4 |# s' v
X_train3 f* f0 n2 T- A# W/ [
#结果如下' }* K8 Q0 ^& k" \
array([[-1.2817325 , -1.34164079],
5 W3 i9 Z# N0 E8 N( C* k( ] [ 1.48440157, -0.4472136 ],
4 B9 _) B9 {) O" {. w, q T! C' O [-0.35938143, 0.4472136 ],
4 {& S& I6 Y$ z3 M' g' @ [ 0.15671236, 1.34164079]])2 c& x& z. G6 ~, B4 F
4 ^8 ], O+ m0 Z( j) l
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
6 a% P) Z& L3 A9 u, mscaler.mean_ #out: array([ 1., 0. , 0.33333333]) * p6 J% s8 {# ], }6 K
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) 9 s9 H8 `# x/ N$ V! a
#测试将该scaler用于输入数据,变换之后得到的结果同上! m8 F$ S: Q, F2 T! Q
scaler.transform(X) & w+ w" z2 a' O' Z- p" R6 ^
#out: & G" w R7 b( M6 ]/ I
array([[ 0., -1.22474487, 1.33630621],
4 ~7 A5 {$ {1 [9 z5 B. G [ 1.22474487, 0. , -0.26726124],
- B) V+ C3 }7 b5 W c [-1.22474487,1.22474487, -1.06904497]])
( R% d( b; w, W* ^7 C& H/ g6 q% Vscaler.transform([[-1., 1., 0.]]) #scale the new data2 E, v( e) F! d. e* A
# out: array([[-2.44948974, 1.22474487, -0.26726124]])1 m0 |( l( f" J2 q( C/ Y
: B% ]3 X* {; k6 t& h6 z1 t' B2 将数据特征缩放至某一范围(scalingfeatures to a range)
* M9 F- c, I7 z, G# T E0 Y4 W8 a n3 G( @) W6 }9 u( ]" }# g
' a* k' h l, {% R/ _' h- M+ \2.1 MinMaxScaler (最小最大值标准化)0 r& z& o) b; V* H1 Q! [
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 1 h6 m1 y6 x. y$ l; \/ G+ K: Q
0 ]' L j/ {4 z2 c# W, wfrom sklearn.preprocessing import MinMaxScaler
5 y; ~, d, T) c: [0 Tx=[[10001,2],[16020,4],[12008,6],[13131,8]]
: s! }- q/ V8 o) l! v! y; ^: @min_max_scaler = MinMaxScaler()
, n; W' ^8 T2 ]! T* EX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
0 ~' c7 I3 J6 c2 g; l* T% T% S$ N l- u
min_max_scaler = MinMaxScaler(feature_range=(-1,1))0 L3 K# B0 z' C6 K
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
7 J+ w7 C) g4 c2 h" |5 `4 e7 E; h- F& [5 ~2 D
MinMaxScaler的实现
/ t9 v+ H3 j& s0 P% k# l, JX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
k2 R8 Z& q1 \. p, o* P1 A- QX_scaled = X_std / (max - min) + min/ L% w# z; U8 S5 f9 A
( m/ M j" g) ^
这是 向量化的表达方式,说明X是矩阵,其中
# T5 Z- |/ N! J# r! z) y& A' J8 F1 }7 h+ O, k& O: L
X_std:将X归一化到[0,1]之间
; D0 d! S( j q+ s4 y$ B( |X.min(axis=0)表示列最小值4 z g1 q6 V: d- m& ]8 n
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围* f8 W& P. w' B5 U" a3 E2 M
7 J* F5 W& f6 `1 F- `& T
$ d# ]& d. Z8 }& d2 g& P5 }4 J6 X2.2 MaxAbsScaler(绝对值最大标准化): Q( m) \3 D6 \0 q% g
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。+ N# F! L, q1 L2 m' {+ z
' ~" B5 d+ i6 J$ |7 G: D
X_train = np.array([[ 1., -1., 2.],
" A( U: \6 X# K" J5 p [ 2., 0., 0.],
2 v: p7 w8 ^6 l- z" P% s5 U [ 0., 1., -1.]])8 N( x# K$ L. O; N- |* {
max_abs_scaler = preprocessing.MaxAbsScaler()3 H A7 ]& A, y/ x: Q, d. o. c7 A
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
. M1 H8 e) _# X% M# r# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
% P( T' h( h! I X4 X+ C4 WX_test = np.array([[ -3., -1., 4.]])( h% C$ h# o3 X7 q
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
. D8 g8 P# l1 F- b% D5 kmax_abs_scaler.scale_ #out: array([ 2., 1., 2.])
: k: Z( w6 ?7 E# t
( Q9 b; i" g' J. Z3 l7 K# V2 k8 j6 ?( f% @! J! E9 I
2 [3 L. H8 N; I) u( Q, f8 \
. b6 |8 k& M7 w( S5 {' t# X
k3 T' x6 F1 m. Z( S! Q
, f4 W' O" q( F2 M0 w% {& c2 U. {
1 N9 l0 d0 R1 Z# h
$ K Y+ M1 z% u' Q0 V
1 j# E6 j1 h% Q7 O) A7 o4 r9 {
% L: v& G( N+ U———————————————— ]! r/ H9 i2 E/ j4 }
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 O+ _# U' h- r8 k5 X7 F6 W
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223: T! m. u* D) {) g$ [+ F) l, c: g2 C
4 @6 K( i* y& T$ h% {
8 p( c8 C2 {3 ^0 m+ J' ] ?
|
zan
|