- 在线时间
- 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。# c- q" X% d1 R0 G
* D: d) l/ i3 L5 l: Q当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
7 T# H: z* W3 n0 g' P% B当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
" k( ^3 [3 f9 v( x$ G数据变换的目的:
3 u4 m" X- I% [5 `. j 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。$ }! a9 a* o# c
9 c7 @. g/ \# J Q2 b
定义 : 设有n个数据的序列 ,则称映射$ a2 o5 B& O8 g" q* I8 w( G0 Q
- m* w/ A" j2 g ?
2 H* f) `9 P) _* d, ]4 j5 L
7 n9 b/ b2 C% ~9 x
为序列 x到序列 y 的数据变换。
+ J# e3 G7 R' x9 b$ L. r3 I$ R0 v/ K- K
8 D3 y. g6 n1 i$ N0 q# A! `数据变换的七种常见方式+ v( P' _' `, a
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
, x1 o: I& |$ `8 i- b, e: d# F
初值化变换
3 m8 r) s8 r5 d2 A! F( l& j( k% e" ~8 ]
9 {0 t' o+ B: h" s
也就是要对每一个数据,都除以第一个数据。
0 ]# k5 u" @9 g V) Y0 E5 O$ j
: ^# [% a- t! J. x均值化变换
; j& P# E. }- k/ ~. w. G- N7 v% C' n C# p" [
( K6 m2 r0 H: m0 o% h% r8 G0 d2 B
对每一个数据,都除以均值。
/ F6 t$ @* f2 w; U. e
' b( s& S" a7 h9 T/ V3 u! _( n百分比变换
6 s3 ~; c( q% X r1 F
5 N0 z( q1 O$ K: [) m3 M![]()
. S5 z; @/ s$ q分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。* u* v: f9 |1 K5 H+ e2 V3 ^
8 o5 F0 T0 Q7 r- }- q; ~
倍数变换* R$ P, ]% r. \) [( ^( f5 V5 z
0 g6 e; R4 [: r% Q1 ]/ N
[* g+ k* {5 E2 _1 H
归一化变换
8 ~% ~! ^3 Y' x& Q3 L4 H! ^
7 u' T2 O f2 ?8 e' M. p. q![]()
* y/ P- K; Y& h 其中 为大于零的某个值,称 是归一化变换。
/ A+ d/ S+ N6 x: x
9 ~5 T- R, s3 ]
8 _. x, L0 W/ o1 L极差最大值化变换
! ]% D& }3 }# L' w: o4 x; n
% Q) J/ C9 Q# \2 \ \4 Y![]()
' v2 L$ ^# b/ `9 ]& M( v* [+ }- s+ y% ]1 ?" \- M
( @, I5 K$ {& f# U& C) C
区间值化变换) G }: {& f0 \8 i
" Q8 j7 {, d3 G0 g7 ~: H8 k1 U + A y& l; l+ j/ L
,
4 Z9 Z: a& d. a9 [, w4 Z1 R
) H+ G2 Z# p2 E/ i1. matlab 的mapminmax归一化函数7 F5 ?, n6 S: S2 |6 R! m% z
函数用法:2 ~# Z1 G" s; c" W. j
[Xn,Xps]=mapminmax(X,min,max). U$ S7 {4 w. Q
+ U) E" r/ K9 k+ B( h$ K/ A# V说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
3 S" x4 H7 O3 N! N; D3 L) B, u/ i' S4 W, M& R( [
(2)min,max规定X的归一化范围,根据需要自行设置
7 @8 p, t9 b5 V$ F% \/ F( [/ H
N( V6 Z c3 Y1 i! ^8 c (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
+ E7 }) N, O7 i( a5 ?" v
1 @& p ~6 ]8 W: E1 }, N6 P 调用方法:
" p9 Q1 F) r( M2 l1 i. S
4 P. ^% K6 R* w1 W3 c! X6 _( {X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
4 w, ~3 o( t, D+ G: @4 }$ @" z/ T0 u# ~4 e- b
X2=mapminmax('reverse',Xn, Xps);%反归一化
( q8 u* }+ k0 K
! |$ I9 [6 K: _3 }x=[1,-1,2; 2,0,0; 0,1,-1]
2 ^9 b& a, Q3 P }# V( \[x1,Xps]=mapminmax(x,0,1)
9 l6 G/ w' Q" y7 t* }4 ]; j1 z$ ^7 `; w
1 ` I: j) q$ M! \ D
: Q/ U0 q3 p& h% M5 U4 y4 T
对于python中的axis=0 和axis=1的问题
8 E- p5 g8 R5 I: { 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
- Z9 H( }! _; t8 y换句话说:
' b. u. d; [8 h% x' {% i& j# ?
( Q! l6 s) [5 D" |! ?( d3 T! ]使用0值表示沿着每一列或行标签\索引值向下执行方法
/ t* q* v- E3 X0 N( H" z6 w使用1值表示沿着每一行或者列标签模向执行对应的方法
0 \" s" N( a9 g+ z! H2 m; v: _* V N/ Q, Z: l% M
7 O, k) E7 q n( C" n+ X
6 H: H, v" v% D2 r+ ipython的sklearn中 scale函数
: Y1 r1 k8 q! [& [4 {; U1 标准化,均值去除和按方差比例缩放
; @! C* s, M% E3 s2 L (Standardization, or mean removal and variance scaling)
+ D N$ k: U0 a' j
8 U& t" N/ W) W; o( I+ E0 ` 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。) ]% \% Z% p) q4 \4 ]0 ]1 Q
% b: q2 y7 z7 w* d" bfrom sklearn import preprocessing
s$ `, P8 Z( F" y+ \* _import numpy as np
1 t- r; [4 Y5 \2 u" c) C/ d/ OX = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) 3 M' C" ]& b5 y
X_scaled = preprocessing.scale(X)
1 h4 y. q: n( s+ ~, c% K5 P8 l! G# d4 s7 D; v2 ^
#output :X_scaled = [[ 0. -1.22474487 1.33630621] l, X+ o+ L" {. t7 d" _
[ 1.22474487 0. -0.26726124]
: V$ m9 L3 J- x* F. b [-1.22474487 1.22474487 -1.06904497]]$ o$ B6 {6 c+ A# Y! g9 B
#scaled之后的数据列为零均值,单位方差$ ?2 h% h" t% P8 Y
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
) U+ r. |+ O: |0 r [% [X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
M" t, g! R& z! @' p. _7 T2 b) s8 C m9 Z
0 G+ E+ Y! ^9 f9 z. M( `
! i6 T0 f; h! {. Y( ]' WStandardScaler
9 Z; E8 n0 Y5 i b* |- VStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
* c6 f d7 X4 q* Q% }# [$ j6 j& O" M5 R3 P7 ?
from sklearn.preprocessing import StandardScaler
% }! q4 d2 {0 Y3 S* Rx=[[10001,2],[16020,4],[12008,6],[13131,8]]
' I8 W2 Y* G$ p1 `X_scaler = StandardScaler()
/ z2 ~2 `5 ~& i" \X_train = X_scaler.fit_transform(x)
8 Z( L1 g" V; \: z) w- U$ x0 P3 O RX_train
$ v0 \2 e$ E w! M* I& E* E#结果如下# \5 |/ z O6 J
array([[-1.2817325 , -1.34164079],' w: }+ n8 x6 h
[ 1.48440157, -0.4472136 ],1 o3 i2 k1 |7 F
[-0.35938143, 0.4472136 ],
2 N/ C6 [8 [+ ?) \! {" l( c' l [ 0.15671236, 1.34164079]])
2 g. o7 V# E% i
. o9 [; F6 N& N1 j, ~; t
) T5 j$ z0 I* f6 D' r+ C" N1 Z5 r# L, S5 v6 L. A: x
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
& c, L9 W( K9 C3 V from sklearn.preprocessing import StandardScaler
! ~. T7 S- n5 n: s) X0 [5 mx=[[10001,2],[16020,4],[12008,6],[13131,8]]: T z8 A* R9 |' m$ M
X_scaler = StandardScaler()( t. J4 U. {- L6 u& {
X_train = X_scaler.fit_transform(x)
3 [# v& q# h q4 A$ q! a: i2 yX_train
. `: R6 {# I( X% C1 C1 I#结果如下) K4 U/ [; A0 x5 D3 T+ m8 `" e0 C
array([[-1.2817325 , -1.34164079],+ R" l/ r! s g, q* ]
[ 1.48440157, -0.4472136 ],
( z: Z" D& ~& [; [, ?) e [-0.35938143, 0.4472136 ],
: W- S: m) p& F9 B% w0 ` [ 0.15671236, 1.34164079]])
o3 V$ N ]: A$ F" w1 G! ~% J" e5 Z+ E
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
0 t% l; W- G2 M; o- H, Qscaler.mean_ #out: array([ 1., 0. , 0.33333333])
% W( B% g: G( l" w y0 M( Kscaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) 5 D" {. @. r! F$ F3 ?6 h
#测试将该scaler用于输入数据,变换之后得到的结果同上
5 K3 |; `8 V+ S" } V) L+ e. I# E6 Xscaler.transform(X) $ {5 S9 d5 `) f, y
#out:
. u( D3 \. g: p4 ~array([[ 0., -1.22474487, 1.33630621],
! E3 y2 G; w6 j" ]% t% D- V [ 1.22474487, 0. , -0.26726124], ( ]( D6 K8 ^; K
[-1.22474487,1.22474487, -1.06904497]]) " D4 ?7 v$ K% ]/ D2 Z% x; Z
scaler.transform([[-1., 1., 0.]]) #scale the new data* |* V9 ^6 {6 z
# out: array([[-2.44948974, 1.22474487, -0.26726124]])
$ b( H: a# T: }1 i s9 } b$ ]9 j" J$ c( s
2 将数据特征缩放至某一范围(scalingfeatures to a range)
9 Y- ]9 P7 x# |4 I
# S" [+ h3 a- B9 `- W5 c. O* ]1 j0 D, h$ N& O
2.1 MinMaxScaler (最小最大值标准化)
7 K7 c% i' N& q! r5 @4 |7 m 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 3 `+ v% c a# W" q
% t' N% i" J, q. S! @from sklearn.preprocessing import MinMaxScaler
7 L' s0 B4 G( w7 ^x=[[10001,2],[16020,4],[12008,6],[13131,8]]/ `% d/ v) s# ?9 P" }& T
min_max_scaler = MinMaxScaler()
% |3 Z, l/ n0 L5 _! C" |8 @X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,9 v5 @$ f- ?! w4 Y$ d: O' }1 I
% X& N x, a) l$ c h, h3 S
min_max_scaler = MinMaxScaler(feature_range=(-1,1))+ L. Y& _* S# R1 j8 Q. M
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果/ _6 ?) z" `* \- C
1 F6 ]2 l0 H$ h+ B! OMinMaxScaler的实现- ]6 m6 D6 X: Y9 A. D$ U
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
$ n7 m) @* D, @/ _; u2 DX_scaled = X_std / (max - min) + min) P8 I. i' Z7 o8 H6 |: C) p
: g; m& U/ [) \0 v! z* Z; ]0 K, Z) N8 O
这是 向量化的表达方式,说明X是矩阵,其中
$ {* }) F( |2 m, N0 n% j9 O# s9 E$ p
X_std:将X归一化到[0,1]之间
$ t7 x7 F# E" M. S& Z6 c9 CX.min(axis=0)表示列最小值( k- A9 @. r8 X# J. s
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
2 e" Q0 H% t. G$ j3 ^9 A! V
9 h; Y O8 T2 {& t0 I; j
0 a0 y% S3 o- W. [7 d" E% q: [2.2 MaxAbsScaler(绝对值最大标准化) R0 U4 h$ Q# ]# N. M
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
3 e0 s& H/ n. ]5 m/ @" X8 n" f/ i: L. n1 A* i
X_train = np.array([[ 1., -1., 2.],, e- ^5 g% f% A* `
[ 2., 0., 0.],
% R5 p) v3 ?6 q; \( P! ]3 Q! p [ 0., 1., -1.]])
9 N1 k& n9 f2 Y# N- u3 v* Tmax_abs_scaler = preprocessing.MaxAbsScaler()
7 U6 B0 ?% U6 ?* d kX_train_maxabs = max_abs_scaler.fit_transform(X_train)
: G4 X+ k% ^2 m9 e+ a) `1 Q; c# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])( p* [: ?8 A: N/ w
X_test = np.array([[ -3., -1., 4.]])
3 W C' c$ b. _& o7 q$ D6 N/ y" jX_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])4 w, c, w2 S+ D; @' i
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
" o# q t9 @- h9 m! O
4 n$ q$ i; h5 `0 k3 K
: W: B0 U' ~; @8 [$ }4 k" d2 a; O" [3 V+ _4 m2 Y: r0 |# z
' r5 G+ H2 K5 u. q! `$ z) M E
) f9 h% X6 N# Y# ]4 l& A0 s" {! e* i! E$ p7 _
7 h( q+ d0 N2 v& x- s/ C
4 i5 M2 @4 R6 O: ]
3 `. S8 c8 m- t) {2 [# W1 P6 H+ c
————————————————2 }8 J$ t% _, ?8 S& \
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ E" j* R7 l' I$ ~
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
) c, B- g6 V+ u0 J- O. r# v
" T& l q2 Z5 M. q1 u1 P4 {' _" a; K, R) l
|
zan
|