数学建模社区-数学中国
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
[打印本页]
作者:
浅夏110
时间:
2020-6-3 16:17
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
! t6 `2 \- x/ E- \
' Y# ~$ l$ F4 P8 E5 {
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
w5 K0 N) ^ b/ m; H" d
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
2 a ]' C, @/ n/ [' R' M% x7 N9 f
数据变换的目的:
; ~5 n5 M9 n$ Z
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
% N' O* Y- s; N1 _5 M: b X( W
# B8 ~* d. A- q8 M; z/ i2 b' X( w
定义 : 设有n个数据的序列
,则称映射
8 |% y( I+ n* L8 u9 S
8 y& ?! ~* N5 A2 z. m
& h) I8 `- B- C6 \! l
: v$ j M6 f- o; f! A4 E- N- F
为序列 x到序列 y 的数据变换。
; i3 ^+ ^' P. C) F) Y' N) ?
, L- m K: v" ~& n' Z! R
数据变换的七种常见方式
; K8 H3 J+ u3 |( j I! f$ x
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
( C. F! t1 s) H* A7 z
9 n5 i) i# W9 f! Q+ J! M
初值化变换
: n5 k, `- r1 j/ \4 K
7 [- d, r: V9 k
; G7 p9 n, J3 u6 A" ~" U+ O) c
也就是要对每一个数据,都除以第一个数据。
% A/ z; d) y4 S# X% I* u/ k
/ u: y; Q! q% h* i/ d5 }0 z
均值化变换
( b# ?1 w( z% `4 ]/ W/ a
, L0 Q$ r2 c, [+ o* o
/ e0 U4 y7 k+ j" {" g+ V# J$ G7 N3 N& ~
对每一个数据,都除以均值。
- y* m* T* R+ `) g) c# b
. b% c) e+ U& @* w/ A
百分比变换
0 g5 y: B6 r3 A7 K3 [3 q
% W; S& M0 V4 s; a& B! Y2 D
?5 w! b" _% x
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
; |& Q, l( O' }0 g7 O3 c+ @# S, c
, y) ]/ K7 ]# d% t/ n+ O: \
倍数变换
- i% E$ G8 ~' t; [% Z- t
- l) [3 _7 ~# S) ?
' i$ n/ Z6 B! y/ Y5 G
归一化变换
! T: L' T+ q5 ~+ a: m. N; V
$ e! n) Y L0 q2 }6 E; S, Y4 A2 K
" k+ Z8 Q( N9 S8 j0 b' R$ `
其中 为大于零的某个值,称 是归一化变换。
, p9 g& U- q3 }% c8 y
A c, I! H: a. N, c. y
- f% F6 } k1 F) e" h# r. K
极差最大值化变换
# D) W: k- d* U! C! ^; Q& }. u
$ P' }8 X' ~! J5 F2 ]- u5 \$ k
! M# ^/ r+ T! Y. O! c% b
" L$ o$ z( |+ T; Y, }9 v9 U( d
; W% c3 V# ]9 I2 N' b* ^
区间值化变换
' S5 |9 h% l7 T+ G+ o9 M2 \/ k
+ t/ m! K8 S( j5 q4 D4 S6 P
9 u3 U5 z" m" ^/ C) e' V5 Z2 U
,
+ d6 @9 Y* X+ q6 ]3 F: K; ^; s
8 u& [9 U0 H/ h
1. matlab 的mapminmax归一化函数
' U) m2 Q/ n6 W5 U0 A
函数用法:
) {2 m) _2 i. j: c
[Xn,Xps]=mapminmax(X,min,max)
( s/ B7 h3 c' t9 z% ? G0 I8 S1 S
$ ]" D& f. L& d0 b& {, M# X, w
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
6 [3 @- A9 W6 n8 }
; Z6 W4 s1 c% A% P' p
(2)min,max规定X的归一化范围,根据需要自行设置
. @- C+ e% H( h6 x
) k% q% N- ?, U
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
8 I$ n* Q2 h% j" z6 w# k3 Z3 ~
2 s2 h/ ]( a% m5 R B: G0 u
调用方法:
& D2 w S; _% _4 A$ ?4 O
9 l* t) j5 H# @( s$ k R
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
( j9 \- P9 x9 L* ], x
$ U* `3 E/ V8 T
X2=mapminmax('reverse',Xn, Xps);%反归一化
, V0 N1 s, J* n' w" q
0 X' B3 m2 k3 V' a l: E
x=[1,-1,2; 2,0,0; 0,1,-1]
. j3 d. I+ k8 b% l' n t% f5 I0 u
[x1,Xps]=mapminmax(x,0,1)
1 c# x4 u; \; p$ t
_; r% z" c; i* c& o) I9 K
) @( p+ z4 J. _4 t* N0 @
! b! n! T& ~5 S
对于python中的axis=0 和axis=1的问题
6 x8 D2 ~ T& @" `
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
3 J# C& ]6 w: W, s. z7 E1 v! M
换句话说:
: w& m% p5 Z, T6 b' z/ g/ h
" ]5 Q6 b; f! W; F
使用0值表示沿着每一列或行标签\索引值向下执行方法
4 C; B1 \1 \% W9 j4 i: m. ]6 K
使用1值表示沿着每一行或者列标签模向执行对应的方法
: V3 l( C e! J
1 P1 \% P s3 ?. q0 ~3 A/ P
% v4 G& }% P0 Y: a
! r3 J6 g5 h: y. g; W" X. }
python的sklearn中 scale函数
; b- V# ]! ~+ O r' S& N3 e
1 标准化,均值去除和按方差比例缩放
( Q1 N0 o8 t' U
(Standardization, or mean removal and variance scaling)
' H. }3 o6 B, k% K" w) ~
, x" Y2 p* w4 \0 T9 [) }: ^
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
* h9 P' s: ~) u8 y! r! ]) G: L
3 I% X' H- d! N% Z( U) c; y
from sklearn import preprocessing
) C3 P% d: a; t5 O* E% n
import numpy as np
0 f7 u7 }6 M; C) k
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
6 }( Q5 M7 ^5 k6 n; Q& R3 w
X_scaled = preprocessing.scale(X)
U( e8 p4 B" A0 {
/ z- D G' ~- I$ `$ J" R
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
& X- J7 z# j; d' d1 G2 l5 |
[ 1.22474487 0. -0.26726124]
$ x4 Y* R& {) P+ ]
[-1.22474487 1.22474487 -1.06904497]]
/ H+ L; U6 `6 s
#scaled之后的数据列为零均值,单位方差
! a$ ?: D7 K) |# f- Y" x% D" W
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
3 {& `9 L8 P' b6 R! q
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
, z, z- g* n% H% t
5 a4 D& `# O: \4 g: y z
5 D. F1 N" T# r2 K
4 `# R7 N% q! p5 Q0 h
StandardScaler
) l' y3 E6 H7 x" r& o. v7 n
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
$ j/ q' |( A, W& W% U
& K: y& N1 i5 {0 ^" M
from sklearn.preprocessing import StandardScaler
! r L c4 O7 {& F; y$ ]6 s# L
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
# o( s4 u F$ Q/ I( _
X_scaler = StandardScaler()
1 \8 ]- L& {* X1 r
X_train = X_scaler.fit_transform(x)
- l! m+ O9 J: s, U2 i) V# y4 d
X_train
/ u3 q# [2 b/ ^( Y, X
#结果如下
2 C5 U. W6 ^0 N8 D
array([[-1.2817325 , -1.34164079],
: K' F3 N g$ |6 T( R: w
[ 1.48440157, -0.4472136 ],
7 ?! h" l3 ~9 X4 y. H) L$ q/ m
[-0.35938143, 0.4472136 ],
( a F1 T/ O: G& ?% v. ]
[ 0.15671236, 1.34164079]])
, \- B2 A; O" Q& w% e
5 h S: [+ H$ z5 k- o6 m
" L F9 }) I6 \
0 h3 \1 \. R0 Z" E8 X. \6 ?
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
scale和StandardScaler可以用于回归模型中的目标值处理。
. ?) L0 N2 } F9 ^7 q1 d; y) `, q
from sklearn.preprocessing import StandardScaler
: u4 P5 w3 _8 W1 t; w3 @
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
2 X$ ]' [; N+ f9 s
X_scaler = StandardScaler()
, w# c7 J+ D( N9 A
X_train = X_scaler.fit_transform(x)
+ y7 E8 V% ]1 K. Z# n
X_train
5 ~1 {/ ^! x; P" ?3 s
#结果如下
. y1 ~$ V/ z/ k8 U$ E+ Z, u" N
array([[-1.2817325 , -1.34164079],
( A# R. |" |6 B! n9 ~
[ 1.48440157, -0.4472136 ],
* P4 B, I1 ~1 a5 g$ ^) _( i
[-0.35938143, 0.4472136 ],
! m: K& F1 R2 j7 }* M
[ 0.15671236, 1.34164079]])
/ i2 s0 t; S4 X$ L* g2 u
% O# e8 x( e4 o$ W8 O# j) m3 G
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
- j# o1 Z8 H M- [9 p
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
3 P2 }2 u" M( x7 E
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
* a- X. j" m% b: O* ]7 y M
#测试将该scaler用于输入数据,变换之后得到的结果同上
, ?8 }/ u8 ]1 ]4 D0 L9 E
scaler.transform(X)
* a6 t9 f2 r# x# ]' g: V7 ~$ ^
#out:
* {) N7 C# z9 g( V3 d
array([[ 0., -1.22474487, 1.33630621],
' p6 ?6 H* ~/ ?# }% F
[ 1.22474487, 0. , -0.26726124],
' P2 I" j+ d% p% P+ [3 H8 W( M
[-1.22474487,1.22474487, -1.06904497]])
$ ^/ S; d* C8 C2 v6 z3 g
scaler.transform([[-1., 1., 0.]]) #scale the new data
0 Z( D! O1 i5 E4 d
# out: array([[-2.44948974, 1.22474487, -0.26726124]])
2 m) a8 ]3 h/ w6 V7 _! `" E
6 P* ?9 n' E, F( o
2 将数据特征缩放至某一范围(scalingfeatures to a range)
- ]6 ]% C( C+ u J$ f$ v
1 R$ S" x+ p0 r* t* V
6 ~' u$ ]( T+ D! Y( m
2.1 MinMaxScaler (最小最大值标准化)
3 i/ S3 ^1 L a8 |# F
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
; i) n8 J. m, j, t! \1 @
# Q1 R3 n" P Q& V# {
from sklearn.preprocessing import MinMaxScaler
; y, E& E `) u8 ?6 d8 }; w/ F6 E
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
6 C& @* f l* x; X8 z+ k5 g
min_max_scaler = MinMaxScaler()
# Y$ S, S1 v k5 E3 f5 V, D
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
% ^; q" W' c2 K" h3 f# F. d
$ d: S* @' \6 z2 ?
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
# W3 K$ j/ J/ \' B* C+ ^. A
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
+ \0 [( u) y E+ l" S6 ?# k
1 ]+ ]9 h; Z7 K% z$ p4 n
MinMaxScaler的实现
, j1 Q' h) @, y- b: Y0 b
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
6 [8 f* {% P& B& a7 ^/ p
X_scaled = X_std / (max - min) + min
5 o# E! w# t% c& [3 K- [
. I2 ~- e5 k F9 j5 \
这是 向量化的表达方式,说明X是矩阵,其中
6 C! a3 d" u; n# i) c
/ m' }- V/ m$ p; g0 i4 U. d
X_std:将X归一化到[0,1]之间
5 J; \7 f* K+ r& {2 N: c6 ]
X.min(axis=0)表示列最小值
, i' |9 m1 g* u. v. J8 G
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
' v2 i4 }3 a0 p
! @- _* t% |8 ~; Q3 |. C0 U9 t' W
$ s3 @7 O. I$ I: T+ } q
2.2 MaxAbsScaler(绝对值最大标准化)
8 A! V, t6 y" \: o( n( a- X
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
8 G; M9 b& H$ b7 }/ l
5 r2 V% I5 d) B4 C b/ G+ S( F
X_train = np.array([[ 1., -1., 2.],
# j0 p7 F3 Y+ E% E2 Y
[ 2., 0., 0.],
$ ^9 y+ F6 ^3 Q4 X% m
[ 0., 1., -1.]])
8 P# \7 }7 j7 T
max_abs_scaler = preprocessing.MaxAbsScaler()
# S) h2 b1 p4 z4 M7 Y- m, p" `
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
) {" U0 e' M9 V: f: s- G/ C
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
6 r, i3 r, j- q& h. p+ d
X_test = np.array([[ -3., -1., 4.]])
" l7 M- }1 P3 D4 Q" n
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
' o% \' N" z: ^! n4 O7 D# u# G3 `
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
4 o1 L3 O3 j: S1 O6 g" q4 C% N3 W
( D, F+ [1 i! ?
; a- X4 s/ _8 V0 b
1 b i* `8 y+ Z( t
4 w) g. [8 O+ g' m H+ Y5 B
, V: Y/ A; Z$ p1 a: ~# O" H
3 t1 w/ { `( a9 g; r# ?4 x+ }
$ a, o/ `2 @6 ^
- ]2 }6 X5 Y n' ^: K
R( ?/ T, \$ w3 h, r5 N1 t& M) f: e
8 Y: P' {2 C* ` }$ _( i& o" x1 t
————————————————
6 }6 m n, z8 Q) p( c* T
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 y7 v! g, C& A! k% a! w
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
& y) h+ `' e! R3 a) r, v: C
0 P9 V' V9 U, m/ u a
# i3 ]# l( B) \
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5