- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36395 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13879
- 相册
- 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。
! W1 o3 ^8 p2 s$ ^1 f
4 B& D) R& [: V1 x" h当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
3 Y0 m% h. l* @7 J3 w7 d当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
9 j- v* ~0 r; i9 U) K6 F t. o6 ]$ ~数据变换的目的:0 ~( u5 J2 q5 a' ]. D
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
' w8 f, l: B' F+ ~+ H; L' c6 B0 P6 K. u
定义 : 设有n个数据的序列 ,则称映射 z9 d- q* @2 f: l, c7 ?' [
/ Z# }# ^0 I7 [. d+ l \& u1 a# p# P: `1 z( Q
: O" n7 g. |4 i& s4 s8 W2 ^; Q
为序列 x到序列 y 的数据变换。 ; ^; \: H) a( H) ?5 Y
' k! t3 I7 \5 ]) ~& a% R _7 |, f数据变换的七种常见方式
5 e& D2 n3 |. v! y* P此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
; R, Y5 |1 |; ^5 I+ F8 h
7 u+ D( k9 X- D9 A- h" B. l初值化变换; _6 P' p! }& R P% G: H3 Y
V, W. _* J$ k
: Y" V2 L8 M! a4 D5 |" c; ~: ?' ?
也就是要对每一个数据,都除以第一个数据。
8 a l9 ]. q/ W7 n5 _
! w) ?1 b0 a. G: J! j- Y均值化变换
. P# A$ E3 R5 J) f% X+ C) z& @; N0 l! F) l1 i$ p( l
5 p* t# u7 x' ?1 h
对每一个数据,都除以均值。. U& @8 c9 f7 J+ K' B
0 |: {$ e6 ^6 {# i
百分比变换7 m) X+ |' i l8 u; l' d: O
6 E8 S* }' E8 l
& L: u! t4 M% ]3 S2 ]
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
! c9 w$ y* W7 Q7 J6 f% W% O: `* R1 l1 w! h' p1 @
倍数变换' s; V6 ~9 p: U; x" q0 _. Z3 r
5 o# b( W; a' S& x) v
( [; h% j$ _+ e: w0 u归一化变换% V: Z3 v% I5 `; e
0 S- E& r) q- M. U, l
![]()
7 l6 d: G: h% | 其中 为大于零的某个值,称 是归一化变换。 * m ?8 k7 B' q. U$ p6 f
) i4 Q$ }" X" l4 P2 v+ L
1 [" `/ X3 K# G2 c! x8 B8 ^( Z
极差最大值化变换
- K: s2 B+ w* ?1 D- _
6 e# K) K- A& i: @: G q S7 y7 M" |6 B ) \! ]: r/ B! L ~ {: m: a3 i
! N( W5 R d9 \
4 p/ N7 M: [) v1 x, m+ X区间值化变换
' g1 p q7 D- J( v8 k: T- [
- u& u. o3 `* U9 o: K![]()
- _) ?' |3 l7 `. S ,
; D! j' ?1 O% Y) u# T4 ?
/ D: Q# i P r9 ` A l1. matlab 的mapminmax归一化函数
6 l/ K6 Z1 D5 U* V函数用法:
! B( \% S' ?# @0 { [Xn,Xps]=mapminmax(X,min,max)% E- o! E C% _ n9 H) o
3 V8 l8 Y8 j! T6 U& q
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
+ b3 k3 u6 K5 O) D6 |3 M
1 t5 Q2 ?9 d( `/ @ (2)min,max规定X的归一化范围,根据需要自行设置0 R: `5 {0 d- T/ A! R% h- n3 ]
6 X1 G" X/ W- { ]3 {# q) V& n (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
1 h4 A& Y k& l" A! @$ Y
, s5 E% Z) j- O$ M8 W 调用方法:
+ p& A4 d! |# i# _; w3 t- D( ^" s( G5 D0 g N
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化4 S- ?* i, V/ ]1 {
]8 A( B1 B" e: e1 G, QX2=mapminmax('reverse',Xn, Xps);%反归一化- {/ Z' q# x& O: `
+ I6 E2 w8 x& s
x=[1,-1,2; 2,0,0; 0,1,-1]
1 K/ {/ U* `( W, e* A& d! ?, @[x1,Xps]=mapminmax(x,0,1)
0 W- U" t3 Q" Y* v8 U3 c, e% l) `7 f* N$ }. v5 M; x4 P H# b4 r D
# k7 i# ?) ^" M3 r7 U$ z1 Z) v, H3 ~9 Z( ^: k8 _$ H! W: E6 N
对于python中的axis=0 和axis=1的问题
" U; \9 D5 B4 F4 D& B 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
6 Q7 Q" N8 P8 a& I* Q, V- s( {换句话说:
7 ~6 ]) ^) h" z# ]3 w4 i/ h2 y6 b: ?! o. ~
使用0值表示沿着每一列或行标签\索引值向下执行方法
5 i6 n2 {. [* ]+ M& Z" X. U; V: |使用1值表示沿着每一行或者列标签模向执行对应的方法
' a1 C* E7 r A7 ]![]()
D, b5 S L' r: z" i0 g
# C+ A6 o8 p1 N1 @; l) N! K& S; F6 }
/ V# M2 J$ O4 v7 Vpython的sklearn中 scale函数
3 M3 T. H8 u% H1 s+ }7 P1 标准化,均值去除和按方差比例缩放; N, J. F; Q$ [! o8 Z; O
(Standardization, or mean removal and variance scaling)
# U! B1 j6 i1 ]1 l& Y: @ Q; k- I/ b, m7 ~# r& U
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。4 `, c g) S# p# f1 m, `
5 n" V! P4 _0 O% u G8 \; m8 @
from sklearn import preprocessing
2 {- {4 B; t) v( g; F8 b' ~( p- z) A/ _import numpy as np
8 g9 b5 C# v% ^4 F% J$ XX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
! r& U' N6 b1 DX_scaled = preprocessing.scale(X)
. {8 i8 f$ q; P. N! m: i' }& Z1 D: K, i+ s
#output :X_scaled = [[ 0. -1.22474487 1.33630621]. }' e( B* y( o- }. Y
[ 1.22474487 0. -0.26726124]+ |2 t8 [) t: j% W: G5 ]! l
[-1.22474487 1.22474487 -1.06904497]]
+ s* z/ Z$ r5 ~, h, j#scaled之后的数据列为零均值,单位方差4 s0 Q; T5 P3 j a
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
: Q6 @5 s8 h4 nX_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])7 ~/ l7 I, T6 }- p- G
/ y! N1 f$ u& P K& H6 E8 }! g: F' o
0 v0 q7 d, a+ t/ u( b) Q2 n1 y
StandardScaler 5 a, h# O% I2 K. R- n" L) ^
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
' \! `$ A4 x/ R% O& R; J) ]% b! h
+ p' V% R3 M0 {4 Z5 Vfrom sklearn.preprocessing import StandardScaler2 t( V5 b: O5 f/ q g+ M: C: [
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
) q& m! x) x, i8 M# u0 h2 mX_scaler = StandardScaler(), S5 L8 C) V& P* l1 f- y$ w8 g0 E0 g
X_train = X_scaler.fit_transform(x)' m- O* c2 F! V' g) S4 P, H# F( c
X_train
3 @9 G4 q o; t) P7 C$ E3 g#结果如下# g8 H- ~2 @6 x5 J$ V) w8 T' q* O0 q
array([[-1.2817325 , -1.34164079],
% O M1 y/ ]% M# F [ 1.48440157, -0.4472136 ],
. S, z" T+ P9 r% r! j; ^ [-0.35938143, 0.4472136 ],: Z. F4 ^1 Q- c6 J& M
[ 0.15671236, 1.34164079]])
* g7 _( F3 S. T7 G6 ]+ @$ r
1 o! L1 ~# D1 E( V2 `- W1 R% Y' ^5 i {
; R4 Q: [1 J7 {% K
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
. @7 B4 g3 O4 P0 f1 S from sklearn.preprocessing import StandardScaler5 m5 H8 U' D5 f' \* G; M! |# I
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
& g9 ~5 Z/ G- w+ B% t' ^. J2 nX_scaler = StandardScaler()
4 n" X& Z6 T" n, Z- NX_train = X_scaler.fit_transform(x)
$ E8 E# u1 x1 Q( A: v8 rX_train
% M: Z5 p1 u4 ~! l#结果如下
& I& }+ C* w. E. U# V6 T earray([[-1.2817325 , -1.34164079],
# D+ I. ~! f- C8 }* \ [ 1.48440157, -0.4472136 ],
8 \; v9 O+ P' A2 A [-0.35938143, 0.4472136 ],: @* f$ W3 l1 S
[ 0.15671236, 1.34164079]])6 i7 r) k S( r9 ?" J) b3 @$ n
3 d% Y+ A( A3 ]6 o1 x1 x
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)# _$ j1 b. J4 V# u0 v( E: Q
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) , g4 u6 l6 B5 q' R# u
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) % G1 k7 t* }" e5 e+ b1 ?
#测试将该scaler用于输入数据,变换之后得到的结果同上- r4 b( F4 i& n# _0 F& w; B: l
scaler.transform(X)
7 K; [; t& H. K( c5 w#out:
+ @( S& Y/ T; x3 ~( Oarray([[ 0., -1.22474487, 1.33630621], Y0 [- o0 W& r2 }
[ 1.22474487, 0. , -0.26726124],
3 h! r n8 F; Z) A! C* z0 \- t2 g [-1.22474487,1.22474487, -1.06904497]]) + x* m, T/ G0 L0 G2 k! b
scaler.transform([[-1., 1., 0.]]) #scale the new data
. K& M6 R/ h6 ?$ F& Z1 |* d# out: array([[-2.44948974, 1.22474487, -0.26726124]]): |3 V# e" m3 z" L s
$ f) Y( @1 @+ d3 P
2 将数据特征缩放至某一范围(scalingfeatures to a range)1 c* m7 R& c- o3 c
* R( D$ i' h6 t$ T: J& d- s0 o+ q3 I# l! q
; @. U, v( P: p0 E& Q: y
2.1 MinMaxScaler (最小最大值标准化)
3 f" ?/ x7 ~6 a0 Q3 C 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 # k* `4 U0 A0 [) b' M
. w9 B9 W! L6 O- R
from sklearn.preprocessing import MinMaxScaler
9 L( s/ q$ y# o$ ~4 L8 bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
6 W; T* e/ {( I" p4 s) S7 K2 V" o/ fmin_max_scaler = MinMaxScaler()
: z& D$ L+ k4 e3 t" eX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
( N9 A% m- X9 G" S8 }/ R( \7 B" S. H7 j: I0 e/ k& \* a$ P* {
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
6 R" a- b" r& w( @& f* q. \2 wX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
( S8 `3 ~0 Z( f" V1 Q
& H! i8 {3 V5 v1 G# ~* N: sMinMaxScaler的实现
- U! z, l n6 `& [1 xX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))5 k& _' U+ a$ Z* i2 e
X_scaled = X_std / (max - min) + min/ s5 M) d( |. ]5 k
8 {' x8 a' H3 h5 R, Y$ m, `这是 向量化的表达方式,说明X是矩阵,其中" w. i! a) [0 J) x, P. M1 \2 M
/ ?- Q( r: A/ D9 }- E/ D
X_std:将X归一化到[0,1]之间% g; O* }5 @% |2 E/ A; {
X.min(axis=0)表示列最小值
- T3 q$ W" }8 C+ w7 `) _2 H5 @max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
. n% }' `1 A: `/ X
1 I4 W6 k- [3 H
3 u) @6 h3 [2 Y9 T! b2.2 MaxAbsScaler(绝对值最大标准化)
4 U$ F2 ~1 y" P0 H% e4 X/ K 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。. j& a' z0 Q* C3 _* Y0 I5 f) O$ r
1 d' j7 o) D; q
X_train = np.array([[ 1., -1., 2.],
/ D6 |& s( n& K3 } [ 2., 0., 0.],
9 b( q" n8 J* d: r [ 0., 1., -1.]])
9 J: m+ v1 g) W( g; imax_abs_scaler = preprocessing.MaxAbsScaler()
9 F: p* i9 J+ o" C# e; [( XX_train_maxabs = max_abs_scaler.fit_transform(X_train)7 q' }+ _/ X1 ?& v
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
8 |) _0 i1 J- f4 _: jX_test = np.array([[ -3., -1., 4.]])" ?: R: E$ V8 ]! Y7 J$ G' O |
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]]); J" t; F* ^1 M* D3 s: d( t
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])4 N; r. R$ R4 @- {5 t Y* j
! T1 x, ]( Q( X; q! [5 ?: w7 f' }7 j2 q. h6 z
9 q; q$ M1 W: C. ~; ~4 w* A
7 D' w* p( H! ]& h1 w# N
- G, H- S" G( X2 _
. H* E0 f' t/ t* G9 f
+ ~1 b. P/ M# {; D( ~* r/ k5 K1 X4 p
9 k; D% k1 E7 J7 W! H# ~1 o0 P- I% X/ V. p4 e$ a% a$ u
, i+ T: o, j8 L0 y3 T————————————————# d) f5 j. ~9 A8 b
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ @) B- P$ k7 M2 G, ~( M; c# s原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223: M( `: Q# H2 R$ E* u
( P7 f, c3 V" n- L3 B5 ^
# p5 \ ~* N& m# O |
zan
|