- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36305 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13852
- 相册
- 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。* v. r: y$ { f# X- P! P
3 f3 z. T% B J- n. ^2 L- ]当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
/ l+ k. t) D# I; _5 |当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
7 K$ o( h; ~& p) m数据变换的目的:4 K* t/ E9 k2 S
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。( R2 C( h) s. |- I# @
" d. A% ]5 Z# Y* T; @) C6 I
定义 : 设有n个数据的序列 ,则称映射
$ l1 @8 L' w6 z' f+ x- L. i5 M' E( U8 v9 x4 _; p% Y" q3 K
% c' y' q8 K( V- o3 Z+ [& N; w
0 k% k* J, j9 P4 f8 T9 \& U8 b% { 为序列 x到序列 y 的数据变换。 . j/ t) ?6 ^" x! J2 B
& x/ I/ ?3 T/ l1 }6 v. g/ Y数据变换的七种常见方式" P5 ~$ j7 X4 D4 S( x: N! U* Y
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
" Y& r W7 a# E! T. w
; `" \) }4 _3 q* S初值化变换
1 R9 f/ F* {+ C' g3 x! U# L W4 S& {. {! w, D
, f5 y. L, U( Q/ r' y0 Z( ~
也就是要对每一个数据,都除以第一个数据。7 t4 O% Q; Y# e; T6 S0 ?) {
, @; C9 Q2 J* P5 ^均值化变换& u4 X5 n" W/ D5 i0 c) t
& _9 u% b' w7 s: y8 Y+ {
![]()
. I; K7 @' ~% r. A% G 对每一个数据,都除以均值。
' Z. [7 V. [6 [& e. N# H0 p
8 p. m5 c9 i/ J- ~) V* H百分比变换2 r. P* Z9 l) a) J; m+ g( m9 W! S, a- H) B
C3 n0 [8 L, H* ~, m
& I8 O9 a0 g1 C! X1 ~" ?, l
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。/ Q. N6 a) r: k" D9 w# D( R/ p: K6 z
5 R% r1 I2 y/ D+ M* i* r' s倍数变换+ o, {4 D! E& ^" b/ [$ ^
![]()
8 t# C. Z" n. y+ [. o9 z0 A2 i0 e- ?4 U, ]
归一化变换
6 W6 ~( X$ v- o+ K* }- u }; x0 c: t+ `2 T |
* [# W* n6 q7 a9 F4 ?( K! {& U
其中 为大于零的某个值,称 是归一化变换。 4 W6 m: y3 ]. p- I, O! _6 o
0 {2 |1 }( j& y! W1 P% @$ K1 O) c1 X1 y
极差最大值化变换3 z" N2 O/ Z; G$ Y- M
$ p3 c. `9 B1 ?3 m7 T4 `( P Z
* s A7 D# C( R, i6 M& V' [3 T
6 A2 r+ L' {: A) N" A) c+ \2 ^- o! s! R
区间值化变换 v. K* V" J$ K
% _7 `" l3 Z8 A![]()
. \2 y. ?, l- ?4 N, N# i , ^5 H& ~3 M! z! e% b" S) x7 r4 D
' I; B% l. D4 S8 \' Q7 H
1. matlab 的mapminmax归一化函数
9 {; a! a+ n4 t, B2 D" d函数用法:
0 _& x/ l* T2 q' }0 u! w. i [Xn,Xps]=mapminmax(X,min,max)
# w: i ^$ }+ P3 v; P3 T2 ]: G) x
' p' s8 b7 @) K$ ~说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。. s! A9 J1 n) ?$ [
# z- T& @! S, W+ G o; n$ J# K% ] (2)min,max规定X的归一化范围,根据需要自行设置- Q, H4 l; Z' L: Z
4 t+ F! ~/ D; @) G* \
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 . I+ V+ J& G/ n1 l- W6 G
. b0 `4 ?, J+ C+ H q 调用方法: ~4 I7 I# e1 m
; w$ `5 o/ l% E0 y" X
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化1 Q9 z1 h& {4 Y3 i% u: N# j
+ }1 ~1 ?2 K+ f% j5 h* z' _X2=mapminmax('reverse',Xn, Xps);%反归一化
: \3 n T9 y1 e( f# E4 d3 b: X) I2 c
x=[1,-1,2; 2,0,0; 0,1,-1]6 @. e/ C/ F& \* i( h
[x1,Xps]=mapminmax(x,0,1)
% K/ Q) E. z0 Y K
+ O6 V a$ v6 z: |/ W) {" p& z b3 w+ I! d1 e3 l8 m
7 I1 {; L' b$ h3 I7 t' d* t9 a
对于python中的axis=0 和axis=1的问题" d# G& }( T ?6 `' d; N- b7 f
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)* x/ V: z" `6 b8 G
换句话说:
: p9 |6 k& [4 ]- v& n2 v( U5 L& o3 l. D7 K) a
使用0值表示沿着每一列或行标签\索引值向下执行方法4 y+ @+ a1 {: @5 ]- u
使用1值表示沿着每一行或者列标签模向执行对应的方法
* e! h+ J$ M/ `/ z9 f6 I- T ' e: C# y+ ]2 D) z( B0 l
, S, F) T* L2 r
; z \! {' @7 o
python的sklearn中 scale函数
* b0 b! v: G4 p3 w. u W1 标准化,均值去除和按方差比例缩放; W" C3 W3 o% Q* l* @' R7 b
(Standardization, or mean removal and variance scaling)
4 k4 x' E6 ]/ C1 W' R* E" K2 N4 u0 g/ z
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
% {$ ]' o1 x9 F% {2 ^# B# a& @8 ^0 [ N# h$ m& b
from sklearn import preprocessing
# |% K- E! l2 d3 T0 aimport numpy as np
( l: P9 d9 f ?9 N1 CX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
4 q, v* t! s5 JX_scaled = preprocessing.scale(X)
3 W6 p9 E" T; v& L, P* B7 u+ s! |
#output :X_scaled = [[ 0. -1.22474487 1.33630621]8 z0 R. e4 b1 X+ n6 [+ D
[ 1.22474487 0. -0.26726124]
( T7 ]+ t$ C1 R [-1.22474487 1.22474487 -1.06904497]]
: _. ^* e' h' ?#scaled之后的数据列为零均值,单位方差/ S$ e* H3 [/ M C/ Q' f. o7 ?
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 9 K1 h( w$ Z( _2 |" q. }# ]
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])! p; B9 v* ]; G
. Q8 E8 }$ m6 \' I* M8 S) Q! _/ P2 E6 A9 s4 R: G
9 B9 d% c# R' c/ ?2 k: x1 WStandardScaler
% Z' i& a+ ]# K U1 }3 O/ D# rStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 w5 p8 Q. ]9 Z8 u7 u9 U6 c
! F! s2 l, O$ a. k, t! y' w# Z
from sklearn.preprocessing import StandardScaler; {' P, h% W- f
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
1 A6 A1 }& @3 b3 o( i* I# {5 iX_scaler = StandardScaler()
+ |) e6 [9 G) W$ f$ |, |! v7 MX_train = X_scaler.fit_transform(x)
6 \1 E* M9 h* ]- K5 d, `& cX_train
- X! _6 P3 q9 F1 y6 e3 |#结果如下
0 e/ s: A/ S8 i' _: a& l6 ]array([[-1.2817325 , -1.34164079],
8 q( b4 m; C3 x4 L+ X [ 1.48440157, -0.4472136 ],
9 ? ], _- g$ G9 C& _% ?9 W! h [-0.35938143, 0.4472136 ],
! |4 V# `) Z# H& Z' v7 | [ 0.15671236, 1.34164079]])
; ?' r" R0 D/ r9 v" {( O, l' K! {9 @3 Y1 ]
2 i9 N+ Y' x0 Y% G& H( g* M2 |$ D# \; _' g
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
$ E0 A6 \ S, r+ a from sklearn.preprocessing import StandardScaler
2 s$ x- J/ F8 V4 s4 D% Ox=[[10001,2],[16020,4],[12008,6],[13131,8]]5 F# _; f5 h' e* S' p, e7 _1 K% K
X_scaler = StandardScaler()
6 Z$ D! i( j/ a F, I1 BX_train = X_scaler.fit_transform(x)7 K7 L5 \6 k, L7 ^3 Q
X_train
/ M/ U Q4 {1 m7 p4 c/ S#结果如下
: j& @$ ~ ]2 l6 H( y' n9 narray([[-1.2817325 , -1.34164079],
9 Q- U9 O8 [# K [ 1.48440157, -0.4472136 ],5 C1 H% b) F/ ?: H
[-0.35938143, 0.4472136 ],) `' W4 A7 k$ U
[ 0.15671236, 1.34164079]])
1 }/ l3 \* ^* G
, ~. s8 x Z( }: f3 m' t8 ?scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)$ [& f2 m! D6 G
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) % D3 {1 w1 h* }
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
( o4 c& {4 `; E* C; y#测试将该scaler用于输入数据,变换之后得到的结果同上% _( N3 l! G. ^4 t2 f
scaler.transform(X) * y! e/ ^1 k4 f8 p3 H& v
#out:
; h) g- w1 l8 varray([[ 0., -1.22474487, 1.33630621],
3 {* g$ g. j I) G+ ^; y# I [ 1.22474487, 0. , -0.26726124], x+ T4 w4 W* x# O0 h5 x; i" A
[-1.22474487,1.22474487, -1.06904497]]) 7 u* s9 q. M; U% W& M1 H7 H
scaler.transform([[-1., 1., 0.]]) #scale the new data
! J5 `+ u% c4 G* G9 y" R# out: array([[-2.44948974, 1.22474487, -0.26726124]])
6 }$ [/ M ^$ L5 J% |' j& Z: _. R% _! l
2 将数据特征缩放至某一范围(scalingfeatures to a range)
0 k. a* b/ h9 A; Y 9 j- ]$ q+ o) @ W% c5 R
' Z$ X5 K: l r4 r. B+ R1 M' F( k
2.1 MinMaxScaler (最小最大值标准化)
# _2 A1 Z `0 ~ 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
' j2 c; Y$ y3 L1 i$ K
/ A) {+ Y7 Q; d, Vfrom sklearn.preprocessing import MinMaxScaler! d& ?1 q# G3 v5 Y! h- q' k4 h
x=[[10001,2],[16020,4],[12008,6],[13131,8]]* u0 y1 \8 Y" M! g
min_max_scaler = MinMaxScaler()! \: x6 u9 [: z5 d7 o# Q
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,/ D5 `- Q9 H' n+ Y
7 ~; I: j' n0 a4 f! Y8 W& j; Omin_max_scaler = MinMaxScaler(feature_range=(-1,1))
: x2 P3 N& {0 y5 pX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
! B" z9 q, M! ?0 a8 A6 _, Y
! B8 @$ } v$ k+ T% _9 e3 RMinMaxScaler的实现
1 ?6 q2 X6 I8 `- K3 @& Z3 J" W3 oX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
1 S+ ]/ l8 A3 L* S. `( {X_scaled = X_std / (max - min) + min+ w# U! ?- u, y" n" P! d Q
" Y8 Q( W" Q6 m
这是 向量化的表达方式,说明X是矩阵,其中: H- y0 u7 }, {% u% X; S1 @" E& l
3 ?+ h0 x9 }7 t. A
X_std:将X归一化到[0,1]之间- h+ w- K2 y4 Z- \( z9 y* K+ X
X.min(axis=0)表示列最小值
/ H& J* {* o. K# N* L9 Ymax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
- U9 _8 y# ]' e8 }9 l! c" b9 \0 R
. E% j+ f$ b5 Q2 E/ k2.2 MaxAbsScaler(绝对值最大标准化)
" A! r R" M" g9 X0 K! ^$ B% z- ^ 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
8 r7 a8 a, {* M4 z/ H* O! |' L: c
X_train = np.array([[ 1., -1., 2.],
' s. J1 @& A7 D' s- M8 P$ @ [ 2., 0., 0.],3 k) R( n6 U# X( B6 g
[ 0., 1., -1.]])) j7 r0 a7 M1 k3 E( V
max_abs_scaler = preprocessing.MaxAbsScaler()
( ~! s- h! J/ } }" }X_train_maxabs = max_abs_scaler.fit_transform(X_train)
* \5 e1 M8 ], r! B+ U4 r# |# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])3 n2 h: v- n9 Y; E$ C
X_test = np.array([[ -3., -1., 4.]])+ x, t9 C1 E( }- S0 o
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])2 E* r1 g( O+ C* C
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])8 m- C6 f7 i9 g: Y7 ^
' G5 S9 f% P6 K' a+ x3 r
C0 u3 ]. l M
4 J: {7 s; _6 |3 y) i" |% D) _2 ~+ x4 x! R) t" Z) q
: |7 k" t3 @' }0 K6 f2 W/ d( \0 Q
3 p6 s& w7 e- O2 i
2 {, W5 y: X3 p" G+ c- z
1 r/ T/ e9 S6 _4 n1 D
" J8 ], |% G! O& C6 c& t) U+ l I9 Y B4 b
————————————————2 Q6 m- ? i) K7 d
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) K W4 w6 F( F N! n* }" I6 B- I原文链接:https://blog.csdn.net/qq_29831163/article/details/894202238 L% r% U: e5 N0 L7 J
% V! h7 f! Z( @; K# ?* T
- V. }* _% D* I. z$ Z0 v6 r% o$ y |
zan
|