- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36054 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13757
- 相册
- 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。" z) [* e4 `; @
# q" Z7 k$ j! u6 s
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
, Z! _, C# _2 x2 k6 I当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler9 R; ?. k A, Z: z4 |
数据变换的目的:
/ e- Q, b& k) O, F 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
# i/ g" Z: J0 b5 x+ \$ |! l# ]* d1 Y4 {( @9 n/ X1 i
定义 : 设有n个数据的序列 ,则称映射7 v, i3 \' b. ^0 q% b, ], j2 e" Q
; o+ \. E" V% k: U- O" N
3 s- Y9 F2 h4 G& A4 l
+ K8 m9 y( q* v# S; C1 L+ ^ 为序列 x到序列 y 的数据变换。
# M8 Y- H) z& q& x2 L
, R. ^( Z j% ^( N! ]2 z4 b数据变换的七种常见方式6 d; }+ {: G% R* I& D& E9 V4 n ~
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。! a$ k1 u2 @1 M5 P
# Y, E: j; q$ B3 K6 O& G/ \初值化变换
* C1 e( X2 p5 T* N
4 J- ?! C6 w' V( f( `# u) N![]()
- y7 J3 ]& @. }% d0 G 也就是要对每一个数据,都除以第一个数据。
5 L) X# x# N5 g! j( T$ ?/ S6 k: |. C! ]5 C/ b& |2 P
均值化变换 V" i& W3 m: H: K$ z1 i( ]* x$ E
l' K8 E* ~+ a![]()
. K5 \- Y- u& X0 F1 x/ [( L0 B 对每一个数据,都除以均值。. D( O% a- P; j
3 T$ A0 D: f7 L- a$ ]
百分比变换. C# A, |" `. D. a5 M; v0 x
, S9 J5 f( d5 a6 X' H) ?- j
![]()
& z2 [& o; ^" e& r7 H$ ?5 [' p分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
+ P4 c8 C+ |$ }9 q8 z
' b4 x: y) c N) T- ?# m, t3 n: [7 |倍数变换; [$ A" Q* m4 q, @6 Y
![]()
: H6 I& K) c5 F3 S6 _7 r2 D( F( p$ k* p) U/ T& }
归一化变换7 ]! C @' y( F. s" l. N1 d
P+ y% t1 D0 l6 L : I: i% ?+ H) W
其中 为大于零的某个值,称 是归一化变换。
0 o; C0 X3 z Q$ Z: [* U7 @
& A- h4 j5 |$ y& _; i% G
s/ {4 D0 z. R极差最大值化变换
$ S) d- w. ]* n5 p0 X8 Y, |% E( m- U) u
, c4 z0 ^* J7 q2 M% I6 E' o
" f3 ~6 p2 c" _0 D
# B0 ?6 L* i$ W$ T0 B: f2 x区间值化变换
0 Y* A8 F( H7 U' l% r# }# B; |* q0 ^
![]()
! s6 p, F# y- I* U2 W1 V. v ,
- c K& D, U6 `; M& `" Q7 W2 x$ k9 e7 k# l# _2 ~+ ]+ D. P
1. matlab 的mapminmax归一化函数* p4 s' H/ W( B& q5 u: a ?5 C- C
函数用法:
7 f c: C$ G z- L i [Xn,Xps]=mapminmax(X,min,max)
2 F; o$ y7 b5 o$ @3 {$ J( u
/ Q# i, r- P, O( o" ]0 u说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
# U/ a& Z: F* k( t/ I/ ?# ^, R( a" ^: K1 c: z7 p
(2)min,max规定X的归一化范围,根据需要自行设置
2 ~0 `' Y* Q$ a' q
' q+ a- J2 p) X/ i (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
0 [- J% G1 M( @5 Z1 o/ z; \
3 {! S; U8 d; s% T! Y- { 调用方法:
$ O5 c0 T2 v4 b2 {" ^, M: Z5 p# {( ` m( d: [0 V* T
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
- E! v# T: h# u" |4 F
3 V! c$ N M% Q/ C* ^* d! j4 l1 hX2=mapminmax('reverse',Xn, Xps);%反归一化0 Z" a& n9 d: m# X' v o3 y
2 N) s+ ~$ b( k, H0 D9 ^" j, V
x=[1,-1,2; 2,0,0; 0,1,-1], e8 C7 u0 N/ O( ]1 a$ R1 ]
[x1,Xps]=mapminmax(x,0,1)
" z6 W) V# w4 S# Y+ E& b5 i# p4 I- z8 a& L+ V/ V# P6 o
$ t. Q p! Y0 g6 Y. d, C- R% a
) A% z1 T9 `( G1 \
对于python中的axis=0 和axis=1的问题& _# W9 T0 I/ _+ L; m
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)& z! N4 w: _1 H2 \3 S4 o" ] U
换句话说:
1 J5 X4 _) c6 ^2 O) ~2 ?3 o8 o* Y' u5 L3 d/ |5 }! t3 L0 C$ w
使用0值表示沿着每一列或行标签\索引值向下执行方法6 h3 `- g$ G' s# R: m
使用1值表示沿着每一行或者列标签模向执行对应的方法
& k* ^& S+ [, }) K1 [% ] ! o* L) g! O& T' g1 I: _' S- [$ u0 o: N( S
! @( J0 W9 E8 e) S7 P
( r. l9 g4 M7 V) Q6 g5 q* Upython的sklearn中 scale函数/ z5 y8 F! D3 V% E2 y
1 标准化,均值去除和按方差比例缩放
4 Z1 A$ h1 s; V0 k3 t (Standardization, or mean removal and variance scaling)3 x" r, y1 l- Q
/ ?6 E' a( |1 G. T8 T6 ^5 D. O* X 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
: i! D# `8 j0 Q& N8 U' ]; R& ]8 M4 H
from sklearn import preprocessing
$ V3 ]( Q4 v4 P9 ^import numpy as np * |" [5 K6 G* n; M
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
) T) }/ z* Z) x6 e R+ k5 a9 X' \X_scaled = preprocessing.scale(X)
! @* M5 T5 I$ \0 \, }- U" r2 F7 R; Q8 M+ s
#output :X_scaled = [[ 0. -1.22474487 1.33630621]% I+ d/ s \0 ~' N8 s y, J! ~+ X
[ 1.22474487 0. -0.26726124]" \9 y# D' ^% h+ h O
[-1.22474487 1.22474487 -1.06904497]]" b# L! X8 ]; O, J$ g) Y" D% n
#scaled之后的数据列为零均值,单位方差
H$ ]! |7 B' W% R3 ]/ C/ _X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
8 d [ Z: m; V- Y3 |* }X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
$ a, }" V& ~4 [& |: | j- u% b1 W# m2 i( }7 S
8 E% a' M- Z( Y# h! z4 r
1 ]; z$ J0 g) |& xStandardScaler
' G' C0 y9 j5 P6 hStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)! Z) ?4 v3 q! ]" j
5 V3 _* p7 p. _- cfrom sklearn.preprocessing import StandardScaler4 J8 j5 k2 R c4 ]- J
x=[[10001,2],[16020,4],[12008,6],[13131,8]]& q+ C( z$ W* h/ z, Q& y
X_scaler = StandardScaler()
4 g9 t5 B6 t; ~) B+ VX_train = X_scaler.fit_transform(x)
( ^, Q# I: C% ~8 D. _' U/ E$ yX_train
4 R H, N: p* {9 N) X4 K& e#结果如下5 _/ R0 Z( Z, }; Y7 |9 d
array([[-1.2817325 , -1.34164079],' z( A9 \6 ?* |7 v6 f5 j. Z
[ 1.48440157, -0.4472136 ],3 ^ d Y# T4 y& g! @) \
[-0.35938143, 0.4472136 ],
3 l6 U2 k) ^; S" K5 j1 y [ 0.15671236, 1.34164079]])) A: U+ m' o* J& Q5 T
* B0 _4 W- s# }! |
f( ?% R, V, x6 {$ W" Y
5 M2 d( i# c- ?! m" N& m
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
1 s% \6 \' Z7 l3 _% m( a% W/ C from sklearn.preprocessing import StandardScaler+ E' f5 u4 i; w. d
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
) D, Q+ u7 F" Y2 b, |& @' SX_scaler = StandardScaler()! u0 {) p3 b+ t% @; k7 c* B3 X4 ~
X_train = X_scaler.fit_transform(x)
2 w* y3 C7 n% g0 fX_train
" q" f: ^/ z$ n! e. p$ E! f, Y#结果如下) P* C' x1 _: F
array([[-1.2817325 , -1.34164079],
\5 W3 `2 o6 a [ 1.48440157, -0.4472136 ],
. I$ A% W8 k* y9 H. I7 m' }6 p- G# n [-0.35938143, 0.4472136 ],5 E. F p6 e Z& x
[ 0.15671236, 1.34164079]])
, @. i, h! V- f' ~$ Y1 F* }
! U- L$ C/ S2 J P: x/ ] Q7 f$ bscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True): x5 V6 ^. i$ A* v: G* p
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) 7 |8 I1 n+ e3 j+ P' s9 @( ~. K
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
, K( k5 C4 z. e1 s( |#测试将该scaler用于输入数据,变换之后得到的结果同上
% W4 p. t9 {% Z1 ^( ]* n8 Jscaler.transform(X)
0 J8 a7 ` S+ {/ W#out:
+ g" M# ^$ M5 J( [9 z0 barray([[ 0., -1.22474487, 1.33630621],
, T# i# v0 o1 n/ r% `" ^; o [ 1.22474487, 0. , -0.26726124],
$ z, }4 P% ?2 Z6 J [-1.22474487,1.22474487, -1.06904497]]) ) d$ B6 P* H+ x, g# q
scaler.transform([[-1., 1., 0.]]) #scale the new data
( @- G* c, h# e6 B* m5 t# out: array([[-2.44948974, 1.22474487, -0.26726124]])
/ ~: c3 k$ |) {5 H% V6 t [
" J' _# z' K( x5 q( Y2 将数据特征缩放至某一范围(scalingfeatures to a range)* G0 G8 e0 @- U
. U9 J" K. ?! o: Z! N4 r, c4 k: a$ I3 H I% t
2.1 MinMaxScaler (最小最大值标准化), K1 ^% p2 C$ f' O) t+ y
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
1 Y% V* q! f: j- |1 @7 C ~" o$ c: c# [: Y/ f) c
from sklearn.preprocessing import MinMaxScaler' {1 i. j6 `0 O& N
x=[[10001,2],[16020,4],[12008,6],[13131,8]], O3 L6 ]8 f- z s8 I7 @6 r
min_max_scaler = MinMaxScaler()
5 G- r9 D* z& `4 ?' qX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
1 N2 i: m4 A5 ~" S7 |; x. b" J5 T6 |9 y8 R/ r9 E! E
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
/ S* z' G% b5 C1 Q Y7 M$ |8 Q- hX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果' p5 O8 M3 ~# d* E
0 V* A. p0 f- K, K$ Q4 O5 pMinMaxScaler的实现 V' ?1 l3 w) j
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) o$ s. W' t- P9 U- b
X_scaled = X_std / (max - min) + min
/ e# Z* e i/ }" T& {* x) _' g2 m: A! u g$ k
这是 向量化的表达方式,说明X是矩阵,其中* S. b$ h# n7 P5 |! J
; x* P6 A# I1 L4 f! M1 @X_std:将X归一化到[0,1]之间
4 W& g1 a6 ]- EX.min(axis=0)表示列最小值7 ^& |% D1 E7 J( F
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
) f/ X. |3 o! T; K# g
. d3 c: D# |/ D; H" i* l. v3 V0 t3 t* |$ U
2.2 MaxAbsScaler(绝对值最大标准化)
0 W: N! n: F! _3 k8 W( K7 V: Z+ { 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
/ U& u: ~- G4 u% F4 T. M% x. k; @/ O3 r0 B3 x" o
X_train = np.array([[ 1., -1., 2.],9 H+ W" b# w( [ z, V, I
[ 2., 0., 0.],
8 _- q6 S# @# x2 x/ e [ 0., 1., -1.]])
9 n$ a9 {6 [5 E0 _8 P- T" }. s$ _max_abs_scaler = preprocessing.MaxAbsScaler()
( i. M* {- W3 {X_train_maxabs = max_abs_scaler.fit_transform(X_train)
. ^ Y; D: x2 }0 [ |0 S. v' X# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])% ^& Q9 z! ^9 ?$ ?6 c
X_test = np.array([[ -3., -1., 4.]])
% B/ u, V1 _$ ~. V+ N/ [! y) ^0 {' nX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])7 t- X& c. P8 x4 @- I m. v( ?
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])3 @7 p) S+ T' X3 b C
9 k( |9 |+ K1 C. T% ^; c3 B: h* }; D$ \+ N9 K) L
7 P0 K5 D! `0 U+ o5 |9 K
, d5 Y5 i8 g* }
/ \! }. b9 H0 o- y6 K: A7 A0 b& U8 E9 y# g9 q* Z
: ~9 d" ~ s" E9 q" J
% } P' _+ t+ K& K) B$ J: R9 |! E
% R: S/ ^% ?/ k( q2 u- }
9 j6 J) X$ E4 N5 r5 k8 O) g
————————————————
& q, [; P6 a g版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; f8 }$ f5 @9 S+ }5 b2 j
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
5 p* {3 z; i$ ?( m: u5 W' m5 b. ?: ?; ?7 Y# W
7 U3 Q7 H, [3 }* E$ q7 H2 f* ^ |
zan
|