- 在线时间
- 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。5 d9 z5 S; S$ x8 m( _& m- R# }
7 \1 p( D' {7 G" a4 c, I- m
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
8 c3 A1 G p/ l7 P& L$ ?当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
$ d# S3 \) r! Y u2 o$ |; j7 {数据变换的目的:& u4 J+ O1 y o3 _) z
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
3 Y6 C. [# p# U0 o- d
4 t2 @* \6 \, c W: q, F& n 定义 : 设有n个数据的序列 ,则称映射( i3 f z6 J& L7 K0 @
! w% L6 r0 b7 I, Z0 ? 5 R+ W1 M( f$ H. V$ z- w
$ }* [8 w5 r* j1 r! n+ s
为序列 x到序列 y 的数据变换。
: d& P1 Z: g a: N* [9 ?" G
3 f- ^$ h0 T+ S) s, W! C数据变换的七种常见方式
4 T" N0 ^- k# |9 U! D& w4 D4 J此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。- L' G* @' F2 X9 s9 F! ?$ f0 F
' g3 ?" A6 X* w; H: R初值化变换
# L, q$ J* t% u1 k, w$ b0 b! r f1 c# m) h; |2 s
![]()
- A/ D t1 w1 J+ N# D0 D 也就是要对每一个数据,都除以第一个数据。! ^3 {3 q! c) X- T
: X* S9 }. z/ |0 B: t" r: c6 q均值化变换, N: \8 }5 w$ Y) {# d
$ T, D+ \1 O P4 p( v& w0 t
![]()
$ ^9 [! d& K( i1 x; T } 对每一个数据,都除以均值。1 e- w C8 q: A/ Y0 d: B
$ m6 v& {! H3 ~6 e- f2 E# `百分比变换# q2 V/ F$ x% j/ [5 e7 z7 S9 W
8 @, k5 {+ y) C- {/ | 6 J8 z- ~4 n6 p
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
# X- i& b7 J5 W* v- z4 F8 q! t) b4 n/ A
倍数变换5 K6 B/ p: o( l* G# A' L
+ e2 x' V2 `4 Z. E- ?
. s& ~" z( l" W7 a3 D$ j
归一化变换( @1 }2 V* W }9 j
q* M' [5 o% V6 G5 @![]()
+ x5 S) J/ F2 K* A% d3 x 其中 为大于零的某个值,称 是归一化变换。 8 N* R6 x! l) }6 l7 W' f6 A
. c* a" }+ X( M+ g
: q( c! i0 {: a7 i9 c0 r6 V
极差最大值化变换+ u7 ?! g% C2 U( F- v: h- l
- _* y @: `. I5 n![]()
. _9 ]7 S4 ^& @) Y* `3 R( n: f8 s: s8 B/ D G- z) H
5 h" |9 U4 S e" H8 [ k2 [
区间值化变换
% l* w* m& Y8 f1 ]' s1 b+ f7 B2 @; V# l
8 z( T1 \5 }- x1 a8 N* A
,
8 j5 J6 a* j4 q8 O% d. ]+ y. S Q
1. matlab 的mapminmax归一化函数; [( r- k+ M ^" j, v* o
函数用法:
' N" T- \5 P: c+ \2 O2 y! p [Xn,Xps]=mapminmax(X,min,max)& O+ ]. J1 J2 C' h- a. N4 {
) Q& L2 r3 P+ |
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
' j: _$ u& v! ^7 v, J" _# Z
`$ M0 Y( p+ d, ^" E; P (2)min,max规定X的归一化范围,根据需要自行设置
2 u1 ^' A* R( Y8 v( s( e2 q' \1 H* X9 ~" P0 n4 X3 ?% A0 P
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 ( M1 K" y6 {/ k+ b0 H6 c& a
* J3 B) w( S! U$ _4 W% T4 {- U2 V2 |
调用方法:
2 \- v0 m9 M! I$ D1 y6 p+ p
$ q3 S3 V! ]+ o! ~+ FX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化- j3 Q. F; X' ^; V$ x' X* \
" g; \; Y+ c7 xX2=mapminmax('reverse',Xn, Xps);%反归一化) q e% O( V0 }1 R
o6 H3 [& b9 g3 y
x=[1,-1,2; 2,0,0; 0,1,-1]2 I; p4 o* \5 U5 ?6 |
[x1,Xps]=mapminmax(x,0,1)! V# C+ r/ ?! J* a# e6 X! r
9 x; P8 ]6 |; m1 W7 Y$ ~
: n& {0 u; }9 R' G
/ D c) u( e+ Y
对于python中的axis=0 和axis=1的问题1 k" k% e, P6 q
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)/ E+ A' Z d, v% l2 H8 M1 l' Q' [
换句话说:5 R$ Y* `4 z, ~! j- u
5 I% L6 c) L' Z4 @4 l
使用0值表示沿着每一列或行标签\索引值向下执行方法
8 \5 L7 {9 E7 A6 b使用1值表示沿着每一行或者列标签模向执行对应的方法
6 ]& T2 J6 m) G7 o. e( n g9 X![]()
$ t. E% X) F7 M+ p9 Q- h$ z
1 g0 r4 `: Q3 P' W* D, g$ d1 M: j7 E' ^5 J3 o' N7 X2 t: d
python的sklearn中 scale函数
4 O: ]( C- ]7 F" G; A: ~1 标准化,均值去除和按方差比例缩放
, p8 a9 O7 L7 d( ~ V& `& k. [, f (Standardization, or mean removal and variance scaling)/ s: Z7 P6 [( P0 ]
7 O8 x; v0 B* ?0 O R8 X. N
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。) C& f" g4 t2 C7 v
0 v% R# J/ _6 Q8 v0 b; |# z9 o( t8 |6 kfrom sklearn import preprocessing 5 U5 S3 c( Y0 M* W$ @: _
import numpy as np 9 K% ], b9 E( O% z5 s0 R F
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) 3 J, l! ?, K! r, M
X_scaled = preprocessing.scale(X)
6 q4 ?! j! Y! E' ]+ M' U
/ C; q+ | b2 g- T" r2 g#output :X_scaled = [[ 0. -1.22474487 1.33630621]
! S/ ]5 ~0 X1 @, J% { [ 1.22474487 0. -0.26726124]& |9 ]0 Y2 W; ], m
[-1.22474487 1.22474487 -1.06904497]]
; f( E) F M& W/ K/ ^#scaled之后的数据列为零均值,单位方差4 t p3 G& ~, s1 b
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) % ^, z' g, C' y% w: J' X. J
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])! k5 o, o/ Z% |3 d$ C: [5 z
. [! T- u" P0 H4 p4 G/ B6 y; f$ S; e, |1 j7 G$ j
" A k# z }% o! L3 `0 SStandardScaler
: h8 y6 u$ o8 M* b* ~Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)9 ]9 a1 k3 B( U3 T% F* \
/ w' Q O9 |( i5 L/ B
from sklearn.preprocessing import StandardScaler
4 }' m" X6 d( _7 T( L. ^ Hx=[[10001,2],[16020,4],[12008,6],[13131,8]]
$ x( e A1 B( ?! F0 y' b! @X_scaler = StandardScaler()
) q6 S5 m( H) o8 V0 j* ^7 pX_train = X_scaler.fit_transform(x)/ m0 S5 L, \/ C+ h% ]
X_train
4 O" d, W! D+ T8 z#结果如下0 o8 d1 ?$ B: o2 c' C; h/ L: K
array([[-1.2817325 , -1.34164079],/ B; J9 o: j8 v; X2 v& G
[ 1.48440157, -0.4472136 ],! B% r! G3 d" k, e
[-0.35938143, 0.4472136 ],
' H5 V: j P8 o7 E9 I [ 0.15671236, 1.34164079]])! w4 @( ?8 A- H# l$ Z* l6 m- u% G
% E/ b. X) j: X, G R
4 S5 O& Q3 d: |+ C& ?$ Q6 T; R& ^
$ T1 H$ c3 _3 T+ m4 d注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。) r& r2 G. M: V/ o2 L1 l
from sklearn.preprocessing import StandardScaler
. p+ X. i; |& i4 _ n w+ j) E* Bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
N' b. ]* z# C+ } E8 @' t) jX_scaler = StandardScaler()! f5 K7 I& Z# T" G1 m- N
X_train = X_scaler.fit_transform(x)
. `5 f7 n) b- L+ k# j& I6 m4 EX_train
! v9 c; G" q# v/ ]9 ? {& \0 x: d% \#结果如下' A( x' S: J/ V" c( G
array([[-1.2817325 , -1.34164079],6 j. a' [) n6 u# ?3 l3 ]1 m
[ 1.48440157, -0.4472136 ],
) i5 s9 x! c b. \ [-0.35938143, 0.4472136 ],# A8 F% m5 r( g
[ 0.15671236, 1.34164079]])+ }+ ^' n6 h6 q, B( H1 _- G) _! p8 |
' X4 Y- T$ w: D
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
. I& O' C7 ^& y/ {scaler.mean_ #out: array([ 1., 0. , 0.33333333]) 2 V: z( A( W2 |. P; ?* M
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
0 k! o) B) H" l0 W#测试将该scaler用于输入数据,变换之后得到的结果同上
7 R% t. j3 ^2 J6 Sscaler.transform(X)
5 q* {! V1 n- @8 |#out: 1 o8 T$ q. k7 m' `4 h6 k8 Z0 W
array([[ 0., -1.22474487, 1.33630621],
8 ^$ ^, R; \: E7 I" B3 [% j# P5 S [ 1.22474487, 0. , -0.26726124], + v5 q, F' p3 \& p- ?) M. V3 f4 s8 v
[-1.22474487,1.22474487, -1.06904497]])
^9 w" l: }% P% b$ d: H+ hscaler.transform([[-1., 1., 0.]]) #scale the new data
x; O: h) B3 [4 M/ L+ U; ?/ b# out: array([[-2.44948974, 1.22474487, -0.26726124]])
5 |; j# l. g) K) e9 P, J6 c# w9 `5 Q& ~/ z1 p$ f! v+ {$ K* i, g" x
2 将数据特征缩放至某一范围(scalingfeatures to a range)* D, G3 Q6 ?5 S/ a) k, A [
+ y" _5 G& W1 ?7 I/ v
. K- o/ M1 f ?2 f$ b( W# a; v2.1 MinMaxScaler (最小最大值标准化)
$ b0 W* z- z9 X l { 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 * X4 t1 h" q1 Y) O. d
1 v! d9 L& R6 n" m! ]2 pfrom sklearn.preprocessing import MinMaxScaler) k% s6 X$ j3 [8 a% F: f9 y; V7 J" m
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
' x8 k+ }8 j, b% x7 s$ [: fmin_max_scaler = MinMaxScaler()2 H+ u3 _) z8 P: M
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,8 n: e0 c7 t& m; m( Y
3 W- P( E4 w! I) D" o8 l% D3 G" smin_max_scaler = MinMaxScaler(feature_range=(-1,1))0 Y8 R6 K% w" g! G; z
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
' M0 Q$ W& Q! b3 V" K0 r
. y& O2 f# L9 T9 H% XMinMaxScaler的实现
: c1 \: R( t' o! `9 B+ \/ T* SX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
- X- M4 t) B" t/ L$ P7 r3 ^% u7 I+ u5 fX_scaled = X_std / (max - min) + min4 u$ Z" j, p4 Q- n* J' G) I
) G2 Q/ f- L# O: C; W% e, O' R! B
这是 向量化的表达方式,说明X是矩阵,其中/ i2 @9 m. f' t
# y, l0 ]6 _; o# J! I7 CX_std:将X归一化到[0,1]之间9 g9 a# q! z' w' s+ C
X.min(axis=0)表示列最小值
- f6 p2 J% Y! [; f; y; fmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围. c( B+ U" I* r( T4 V
* E; e7 z0 u4 d/ \. E `) t1 a2 w2 T
2.2 MaxAbsScaler(绝对值最大标准化)
5 d; }6 a' ?" R# S. ?/ H3 w 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。5 Y% N) X0 \# k7 l0 a& d. ? ~ ]$ n8 c
4 ]* D# i# `3 ^/ rX_train = np.array([[ 1., -1., 2.],& _1 x. X! c! q" S- ~ o& R: N
[ 2., 0., 0.],, M9 V$ t; n$ W8 S _
[ 0., 1., -1.]])' H6 } e, E/ G2 U
max_abs_scaler = preprocessing.MaxAbsScaler()4 I+ s( H' G4 h& E) d$ D
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
- @ V8 F1 G f( T- b& {# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])4 N3 I- n0 h5 T4 j x
X_test = np.array([[ -3., -1., 4.]])1 k, n$ q) o/ g: G
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
' n! M/ R4 }) _max_abs_scaler.scale_ #out: array([ 2., 1., 2.])2 W# {% J2 s, d. ~ K; }8 _
# G% @. D& J+ @ g! ]' {0 G6 E5 }# M/ u; S
+ E! @. f! [, \8 A# Q9 R# |; r$ q5 O$ L* ?6 M; b/ z, ^
% ]+ n' g4 @- F8 {! a$ D& a# H. P8 p
3 h5 I5 Y- j7 ?1 k
7 J5 J8 R* \# x3 N
0 i1 U! M6 b- H0 X* ~* I8 T0 W4 Z/ E- J1 s }
+ ]+ g* @2 _4 Y% }2 T————————————————
: H: D. H! F5 t+ s0 a6 r版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: b) ?7 h6 t4 R) y0 y原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
* a2 Y, j; G I6 g6 {2 i& Q" ]/ ^) B; |6 |0 J4 J: q$ Y2 C
" Z9 G" c6 c. u# A: u0 u) m
|
zan
|