- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36354 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13867
- 相册
- 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。; X" w* L- J* {
" [+ }& [( k+ `7 E# g
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
- J b% c( p/ c1 \$ |- p当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler& U5 n3 h+ o" Z5 M9 E9 c3 z; e! _
数据变换的目的:
' y( g7 g2 B/ E 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
( {0 v ^4 ~2 Z- J$ }1 [+ k2 E T7 r5 N3 f! S1 B
定义 : 设有n个数据的序列 ,则称映射
7 C) L2 |: k* E+ a( \
! T7 O1 E: Q' J. N* ~1 o 1 L2 C, b/ p5 g* q: x! E% u. L
; A0 j+ o3 F: _6 w" f2 ~( z 为序列 x到序列 y 的数据变换。 5 z, w; d: _, i" C7 b( {5 I. Y( k
4 c1 e# x8 q' Y i/ b1 |数据变换的七种常见方式
3 ~& ~0 C Y+ N6 Q0 ?# e/ r此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
) f; m% M9 G* h+ J; o" o# U5 Z" t o- R K/ r
初值化变换
4 v* e# o3 z( W3 \ o: s2 l7 h# o+ X8 p$ n# ?, E3 j
![]()
6 j3 f, s" Z8 N0 a3 U' W- p 也就是要对每一个数据,都除以第一个数据。
6 m; ~' c) B/ n0 N/ Q
! e- {* t$ u1 Z$ Z5 s& q( _均值化变换
& s# u/ U, Y1 K% `- a K+ p& B. x
% w+ k/ O# w; t" p7 o1 A![]()
( G+ [& R; [2 _ 对每一个数据,都除以均值。
$ [; a! z% |# H5 ]( A" [! d2 j7 {+ _4 j% s# y$ A8 V3 j$ W! F+ I6 a
百分比变换
; p6 T x3 g$ i, \( \9 s/ ^
5 n; W$ H) |2 l! `+ R0 V, H2 u![]()
0 E: z& Q8 v8 m分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
" x% W' J' {, g3 \" x9 R- ? n$ a7 C$ S% K
倍数变换9 Z/ }$ \. f8 o
$ E) n4 g/ O1 X: d& h. W2 ]
- S9 U0 {- ^8 Z' b' D) F归一化变换* [: I5 ? O4 f& m9 Z
! s7 E, ~/ Q& [% |/ |- k0 C/ [
![]()
7 C$ D' O# k) z: M% `4 O: }$ K 其中 为大于零的某个值,称 是归一化变换。
; Z6 C& O; }+ ?' ^
) G& P) r% r, Z6 D$ r+ b7 L
5 z" l7 Y0 H' u$ `6 X$ @. A极差最大值化变换
% I" D. U1 P! d# s. I' y0 n+ V: e" Z4 n' Y) K3 X1 s
4 ?' H; `$ D/ ^8 H! c
) L( G! M' ]& `+ O* c3 h
5 V: b- P) b6 o* m区间值化变换
; p4 e1 Z, B3 N! p, D% v! A4 g
' m' }7 a4 T( s) L0 _* d T 8 z3 [9 W1 ?+ T8 e/ m. E/ X
,
: M, r3 j4 \' u {
9 y" z$ D* }% {: @# B2 W, b9 Y1. matlab 的mapminmax归一化函数
' l4 o/ \5 G& l t函数用法:
6 S8 u: I# \ K' S5 h6 h [Xn,Xps]=mapminmax(X,min,max)
; m" r/ M5 X# R
$ D* d2 W8 t( ?& r说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。; v$ M( i3 M% h+ s
E. O2 O* n8 o. m (2)min,max规定X的归一化范围,根据需要自行设置
8 ~! Y C* e- k3 m& T+ q p6 s* d+ h4 ~" ^. `. z; w
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
" ^7 b5 c* o1 F$ G7 c1 j/ C, }' P+ S: M R$ ~
调用方法:' i' G7 q% l- m$ W- f+ }
6 Q( A4 ]5 z2 k( i1 \! a
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化( b9 N7 _* C5 [
: K8 U, V5 ?$ _! p7 Q) a
X2=mapminmax('reverse',Xn, Xps);%反归一化
2 T ?' ]& F) J3 }/ C. Q. v' L# d! p
x=[1,-1,2; 2,0,0; 0,1,-1]( r' z7 m3 w5 ]6 Z
[x1,Xps]=mapminmax(x,0,1)
" o8 n) u; \5 s, R) D
- e- U$ ~7 n C! y Z1 M% M5 k! N4 e+ n
" m6 r& S( p9 h0 k2 h7 I9 b对于python中的axis=0 和axis=1的问题( T' V$ L7 N% m" t( ]! d
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注), E1 ?0 G S8 B
换句话说:) q' d; d/ l0 [4 T
3 T* r8 Y$ L0 r5 _8 `$ S; [
使用0值表示沿着每一列或行标签\索引值向下执行方法
5 B4 Y2 z+ B+ k. [" q- r* F& t使用1值表示沿着每一行或者列标签模向执行对应的方法
2 M6 h+ J w# F2 d. ]. Y3 x, |- x/ } ! {% m+ h( ^2 z9 Q5 P4 ^. {
2 m) D1 Y" @/ O6 v: ^: a& t
( T. z0 s8 B# |+ |4 z8 y/ ]python的sklearn中 scale函数
$ |( W& a* n2 r# h1 标准化,均值去除和按方差比例缩放
/ ~! r9 Q3 z1 ~! |0 Y* G1 R0 M (Standardization, or mean removal and variance scaling)1 j7 d( ]* J8 ^$ D/ y5 q/ m# K
6 [- E4 X( Z, @# @$ X 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
) H `' p. T1 Q7 b% f5 P1 X1 i) b$ I, c" g8 [2 k4 \
from sklearn import preprocessing
6 a: i7 E! Y% t# u2 | ?1 a- D* Qimport numpy as np ' j3 h7 E9 i; X- R: ~. L
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) , k- M) | {$ S9 {; \
X_scaled = preprocessing.scale(X) $ ~5 g- W, M) i# E a$ ~8 B: Z, ?
7 E2 y# y" S+ z
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
+ |2 W+ C6 {1 K; u+ W( W% ?+ l [ 1.22474487 0. -0.26726124]
5 i9 m7 Q0 P. _( m* E2 m; e [-1.22474487 1.22474487 -1.06904497]]1 W1 \/ p7 M/ ?! ]" C
#scaled之后的数据列为零均值,单位方差
. G8 o, ?8 q: n3 k) d" W& y, q; u- HX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 9 s7 e% d4 }6 ^ y' d& [) [
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])- |: `( L( b. f- T; l8 Z) @
4 l2 P8 \4 `. F+ _
) F1 D+ V9 G) [( p. ^
# D' E) m4 m N3 T( L( E. NStandardScaler
5 q( l! X( K( I& MStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)9 e3 j" `8 i# ~/ f' ?
" [5 z6 _! R( hfrom sklearn.preprocessing import StandardScaler8 v/ A: [: _% ?
x=[[10001,2],[16020,4],[12008,6],[13131,8]]3 v. U, c, x$ A, z9 F0 T
X_scaler = StandardScaler()) J: M4 ?% B: J: M. @ b
X_train = X_scaler.fit_transform(x)
8 ?8 h' f y5 w* D6 ] yX_train( B. S7 m& L$ ^9 o
#结果如下
# @3 N# T; h0 F# u. H r+ c( i9 }3 Narray([[-1.2817325 , -1.34164079],
$ q9 e% i6 A# f [ 1.48440157, -0.4472136 ],1 G7 g, }- g+ e8 k6 ?, S- L, A
[-0.35938143, 0.4472136 ],
! M' s; g0 t/ g/ N" v& q9 N. k- K [ 0.15671236, 1.34164079]])
0 u) e }: h8 @# C* N
4 L8 g- i8 _4 X' n. I
- q5 @# | f V# o( k
& _8 h9 R4 b5 [, x3 |. Z+ \注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。$ v6 }) q2 L5 P$ S% v9 @
from sklearn.preprocessing import StandardScaler
; V9 X8 R( p* {* l, v& zx=[[10001,2],[16020,4],[12008,6],[13131,8]] ^! s% b6 \8 C1 M
X_scaler = StandardScaler()2 m& z5 b7 h- M; p0 n
X_train = X_scaler.fit_transform(x)" E8 V, g3 }) E7 e/ ?# }; k
X_train+ z, B- `( I1 O7 S9 g
#结果如下
; n- h2 _* c" J" x! narray([[-1.2817325 , -1.34164079],
" Z8 {/ E5 J8 }* _/ A# W# L [ 1.48440157, -0.4472136 ], M5 i$ L- z L3 N, z1 H6 a4 H/ F
[-0.35938143, 0.4472136 ],
1 S% Z+ F0 q. {' c [ 0.15671236, 1.34164079]])
4 V7 m4 O/ r) g9 @5 ^5 Z, D: ]+ F: C; r( @
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True), F* M& i+ J; f& [" M
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) ( }& L9 }- }' j
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
! P6 a1 s; n, G( U* Y6 x9 ~#测试将该scaler用于输入数据,变换之后得到的结果同上/ B7 c: R% K, [" P9 r/ u" g
scaler.transform(X)
* N. D# \' m9 m) e#out: 2 O) @" j) a" i
array([[ 0., -1.22474487, 1.33630621], % K5 Q) {' M# I$ d0 Q+ {6 k! i
[ 1.22474487, 0. , -0.26726124], 2 ]' W6 U! f- ^( s6 H
[-1.22474487,1.22474487, -1.06904497]])
- Y$ r5 a" D/ q7 r5 v# r' p C, Iscaler.transform([[-1., 1., 0.]]) #scale the new data
3 j% h% U# b N% d ^7 a* s# out: array([[-2.44948974, 1.22474487, -0.26726124]])1 K& \/ e) F) `( I$ z" O" b
0 i5 I. k( _0 U4 G
2 将数据特征缩放至某一范围(scalingfeatures to a range)
0 w, q# c0 [4 Q, M) z: z ) @7 l' Q% f9 u8 c# _9 h& {
0 o/ S( `$ g" d2.1 MinMaxScaler (最小最大值标准化)& I# ]* p v/ l3 v" {
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
- }& n6 [7 {% u
8 }2 `& {# c2 f4 x) _! zfrom sklearn.preprocessing import MinMaxScaler, t# Q; L5 O# w
x=[[10001,2],[16020,4],[12008,6],[13131,8]]( ^- r/ Q; h8 G1 ?
min_max_scaler = MinMaxScaler()5 r) U0 ?, D# q
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
# U2 o6 p5 X( L
0 }* w) L3 T6 A9 Umin_max_scaler = MinMaxScaler(feature_range=(-1,1))
# {- g7 O; S3 ^0 B W' H. @: dX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
& h# A, P0 _' z& [; \$ J4 R( ^
: A5 e# t1 I+ M9 c$ `MinMaxScaler的实现/ H' M5 C) D* `9 B
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
# C% g0 Q# }2 p1 b3 g% S B9 yX_scaled = X_std / (max - min) + min
# t. I9 l3 Q0 J+ A
( }4 d8 W- \" r. ?2 s, z- x这是 向量化的表达方式,说明X是矩阵,其中
" B& N: V9 ?7 g) K5 q+ a0 ~1 ?; x" R; L% }" o7 s5 Y
X_std:将X归一化到[0,1]之间2 |! n* R0 d& F/ q8 s. A! V; u2 x
X.min(axis=0)表示列最小值
! |& I) n! j$ ^7 P: Y& _max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围% Z E# F' H" w4 \' o# q/ Y; O1 t
* n" u2 {+ d- V6 V: I9 U( S2 c, t
2.2 MaxAbsScaler(绝对值最大标准化)2 a# \- m! E$ P% t
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。 J5 k s9 Q" b! L+ K
3 v4 p; v, w) [% J( P: `X_train = np.array([[ 1., -1., 2.],' w6 v5 Z- d7 B* R$ d& A' _ B
[ 2., 0., 0.],
& M. s }, B R4 r2 f [ 0., 1., -1.]])- a4 Z/ b4 ^5 i0 N3 n( N' P! |
max_abs_scaler = preprocessing.MaxAbsScaler()* a) J! m; r+ r! P2 _+ B
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
+ a" G8 A3 [. v% b# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])- `1 P0 s. C6 u' t
X_test = np.array([[ -3., -1., 4.]])5 B# f& J5 j M+ l% T2 |
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])5 p9 S# Y& P. m* M
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
! p* b. K' T5 m. E7 I1 t0 i" Y0 e- V6 K J- o$ ?
* X+ D8 q$ \/ A' B% M% q" A
# i% |9 u* d' J5 \! e6 f4 e' O; a( N4 r* M" z5 K
6 |# q# f& u6 @3 h: _8 u& p' m8 N& [; M2 g; Y; H6 R
7 \+ ], [' }$ Z4 b/ P3 e
1 Y8 T- r! X0 }$ n# \
! v" x! s2 k, d$ M e
3 q. l9 g0 Y- ?9 N————————————————
& z2 H" K( ~& {版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# V0 g( P" c+ g( r1 A; D
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
# Y3 u$ T, i+ U" S& \
2 l# `; g0 L+ ^- Z2 f' H( s4 s. N( ]/ ]9 d& r
|
zan
|