数学建模社区-数学中国
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
[打印本页]
作者:
浅夏110
时间:
2020-6-3 16:17
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
# g5 u+ X6 L' r
S8 q. l% R; O" z
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
0 ]) }! C6 l/ t+ i' {
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
$ r& y; a5 E0 ~: [1 d
数据变换的目的:
& `* Y% y# [ q6 W, f
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
3 e' A- e- V1 Q9 |! D: g! q' i% w
- v i u# H( b q
定义 : 设有n个数据的序列
,则称映射
) ~* I9 T- K# O6 z
" A1 Z. z9 l7 ~' g- e
; T5 N- J) Z8 U1 ?8 c' L; i( h
% }! {5 l/ Y# M+ |: c
为序列 x到序列 y 的数据变换。
' B9 N: X2 r, q3 D
+ A: D3 s# T' h( @7 H5 w9 k0 s
数据变换的七种常见方式
2 o5 j2 p/ Z* l) {; T, z2 E
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
o' O! a$ A8 u! c2 K/ u* Q
/ v3 p; Q# e3 A p7 W4 J
初值化变换
. L( T. g8 s. F0 f
- v$ {( ?9 t3 {0 P$ V6 G
! s( t) b1 v: g( Q' g+ V" ]
也就是要对每一个数据,都除以第一个数据。
: }9 N* l$ l+ m5 d* ~3 O
* H9 p" h Y% K1 {
均值化变换
T( z& f0 Z: B \& g6 g+ h9 ~) D
; l: \5 ~' I; b
) v9 `7 G" ~3 N$ j8 U5 W- G
对每一个数据,都除以均值。
# C' G+ G# v9 h& ?3 ?1 `
; z. m) F4 e7 O; r9 v9 G9 ^
百分比变换
0 y* w' w% ^, _' `- j G
' L5 M t2 A2 e9 i
. b/ X1 C; r0 n
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
# @: Q% O1 D+ i3 h( O4 q
c6 L# }( u( J; g" J* k
倍数变换
, s2 l( Y+ l. ~* B
! V4 L5 {* o: s8 L% N! y l4 Q) L
2 J: B+ c9 d: `( l- k+ E
归一化变换
: f- \1 I8 z( E9 B& o6 ^9 a+ Y
& N" I- I# v/ v6 g% i! K) z* S
0 o2 y0 i3 P" e# ^' j5 m2 I, f
其中 为大于零的某个值,称 是归一化变换。
! S2 U8 X! }+ p
; k; X) o3 m e8 a- _; h. r
5 w1 p+ ?: {# X# Q/ G
极差最大值化变换
. S# e* P a4 O- ~, g
P% g; \6 F) n( D- q
3 _$ a W" O1 P
4 ]+ ?$ E5 e# m/ X) Y
: ?( h6 p% I, Z0 W& e/ _
区间值化变换
8 d7 ^( r y% Q! l6 G
, S$ C1 T5 g0 D% C7 o& o; U
; M6 T3 o; Z+ H7 i, O
,
& Q; r: L5 X6 J5 B! C, F
9 c$ H9 ]6 o* [- Z3 p" C, J: _
1. matlab 的mapminmax归一化函数
7 n5 x4 C4 F: A% R$ C" ?1 ]3 }( I
函数用法:
* O E6 @/ `. @, C
[Xn,Xps]=mapminmax(X,min,max)
* U' r+ g& {: ^" s
' K; P" B+ z" V" H t
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
% U( [0 Z4 P0 r2 L
! @1 K ^8 @ \% ~5 l J
(2)min,max规定X的归一化范围,根据需要自行设置
4 U" D4 O' h" l6 e, t) Q3 T& C
2 m0 i/ o* A0 O0 Y0 `/ Y
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
. p: Y; q5 \% D% X* R' R1 N
9 \( U- X" \) l2 z
调用方法:
/ `) N* p( P, U2 k
& R! ]. }" J1 |2 p
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
2 v! T4 |. j; L' G- F5 l- }0 g% V
: E) A5 O/ u* _5 ~' X
X2=mapminmax('reverse',Xn, Xps);%反归一化
8 g$ y2 x3 Q# h3 W
, T$ a- c7 t# I9 O
x=[1,-1,2; 2,0,0; 0,1,-1]
9 E* n2 |( M( G& \+ G, G
[x1,Xps]=mapminmax(x,0,1)
; H( R6 c$ `0 u2 y* h
9 ~: M6 n# O ~; G3 f8 {8 O a% S
- q/ B3 S" ^! F3 X
$ H+ w2 k' j& ]; O( r
对于python中的axis=0 和axis=1的问题
* b0 E4 K. `+ M4 ^- M1 K {
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
: W- o, o2 ] z/ g9 X+ V
换句话说:
: j5 o: C* L1 @; g7 F8 r5 t
) p/ A* l4 }& J
使用0值表示沿着每一列或行标签\索引值向下执行方法
( j8 I+ D5 E* C9 y5 n7 E" }
使用1值表示沿着每一行或者列标签模向执行对应的方法
7 S1 a1 l r" h C
: G& P" T8 ?; F/ k" v
1 e; C) V* A; X
% L% B8 o( ^/ K7 W' {. ?; c
python的sklearn中 scale函数
5 y! |- U4 S9 B7 R: K
1 标准化,均值去除和按方差比例缩放
/ W) |7 { O( z8 Q
(Standardization, or mean removal and variance scaling)
1 @, g& M/ W4 @5 F. w
; s$ | G8 F& C1 N
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
& u' a2 G7 s& L5 e
. W6 q9 D. h( e/ g0 ?( g
from sklearn import preprocessing
* c8 J' \+ S% d( S% p$ D
import numpy as np
1 r4 P% u E- v+ p, f
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
: @1 Z5 d* v' l% I0 \2 k
X_scaled = preprocessing.scale(X)
1 f' o# s; X& }; @6 Z( r, \
4 l' b$ r4 [/ n& y
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
6 O6 D0 m! M* w0 x
[ 1.22474487 0. -0.26726124]
! H; `% h$ o2 G! h0 V( C
[-1.22474487 1.22474487 -1.06904497]]
2 J$ H* y' M! a
#scaled之后的数据列为零均值,单位方差
5 Q/ k8 i3 o$ O+ n6 G
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
, v1 \$ Z. I# a9 P. F
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
$ y, F1 U) y6 m' r
9 _. O E0 \' G
# x2 [4 C" O( y% M: n9 H; F4 y
( Q$ W6 P' M4 s5 s4 Q) Y
StandardScaler
4 ~( r$ A/ _& b8 Q" p
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
1 Z n; }. a/ V
+ }5 p7 h* z. W4 X
from sklearn.preprocessing import StandardScaler
# Z2 ?+ o2 F0 k5 C2 e# @4 S( g
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
% s$ I% X# i& P) s r5 C3 ^- v8 ~
X_scaler = StandardScaler()
/ F! P, _! n6 y6 t
X_train = X_scaler.fit_transform(x)
2 K- t, l6 ~# Q6 A! a1 a {
X_train
' R: h; }& \. v0 m3 l9 v; h' {
#结果如下
4 g4 ]$ [; B$ ~! V+ f. j
array([[-1.2817325 , -1.34164079],
; ]6 ^* b+ g% o) I5 h
[ 1.48440157, -0.4472136 ],
9 M9 b2 D$ p+ [: A, I& y
[-0.35938143, 0.4472136 ],
" D8 C4 i$ h* {2 n% d; M7 Q6 x4 B
[ 0.15671236, 1.34164079]])
& h8 q0 ]5 k) q) O8 N* u1 M
6 t4 W+ u: x( `/ z
1 X' n5 Y. v% L, K/ g9 O- ?
; v5 X2 U, O( A- \7 P+ T! r1 A8 T7 p
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
scale和StandardScaler可以用于回归模型中的目标值处理。
$ \2 P3 j- h" x! K
from sklearn.preprocessing import StandardScaler
2 z- Y% S. Z& S* }
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
5 ]5 c% }; Z7 l( g8 M1 x h, U, j
X_scaler = StandardScaler()
9 R: p+ G. h# Z3 G# i; V* `
X_train = X_scaler.fit_transform(x)
( x2 W4 k& ?1 @' Z$ ]1 \
X_train
) x, n- l# _. ^2 J
#结果如下
0 @3 r$ a! B* o# ~& X/ p( C
array([[-1.2817325 , -1.34164079],
, o. I- I9 L' `6 X+ z0 D" l
[ 1.48440157, -0.4472136 ],
5 g7 D& S8 f" }: d7 V' ^! g
[-0.35938143, 0.4472136 ],
2 c' G% M. f# z$ j0 P* R# {# k0 A
[ 0.15671236, 1.34164079]])
0 ^/ K& \1 m7 ?6 [$ {, l1 S! D" T
& l; r, o" Z) h! w
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
5 V! f: [( t, B a) p5 t5 h- \$ t& j
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
- Q+ J# O; r* ]4 Y9 m6 { z, m
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
# z5 n3 J+ U) W+ W
#测试将该scaler用于输入数据,变换之后得到的结果同上
6 k# Z1 j9 t5 Q+ N
scaler.transform(X)
* k5 P- \; W2 P) {2 T- j
#out:
# f( D! Z1 [3 ~
array([[ 0., -1.22474487, 1.33630621],
2 ?3 i: |8 x v K2 g( l! Q
[ 1.22474487, 0. , -0.26726124],
9 l. p$ j7 ]3 `7 K* r: P6 ]; J, @
[-1.22474487,1.22474487, -1.06904497]])
, b$ Q. M% h* S- t6 n
scaler.transform([[-1., 1., 0.]]) #scale the new data
$ V" w8 U5 h" y' P' i
# out: array([[-2.44948974, 1.22474487, -0.26726124]])
' L2 X7 ?/ w" `2 P6 ~+ n* W
! s, c6 E7 k+ m4 V8 @0 b* T
2 将数据特征缩放至某一范围(scalingfeatures to a range)
% T! q' G* R) }* D/ }/ O# O
) B7 p4 A# ]$ Z$ M3 w% u
* W8 P6 [# t* e7 p; f# K
2.1 MinMaxScaler (最小最大值标准化)
) |5 A2 d g/ M
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
% {3 Q0 L3 n- b) y
* \5 h6 H+ L9 h6 ]
from sklearn.preprocessing import MinMaxScaler
0 _! f! W/ e& Q4 O
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
8 K" h8 I$ X$ x4 ]
min_max_scaler = MinMaxScaler()
l! E/ r6 p( p& E: M
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
( A+ x4 i L* Z8 h; K) q4 c5 ]
0 E# p# j9 w1 N- V9 c
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
& N( R1 ?8 g7 D
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
9 W. Q0 |, p% l/ m* [
/ W. A4 [0 a2 c1 [6 g) m5 b8 v
MinMaxScaler的实现
5 E3 y* X; f* ^2 Z/ N- S
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
. [# a- M5 n" v5 p/ j( ~! @
X_scaled = X_std / (max - min) + min
1 x8 k. v7 w# a f
9 Q6 n+ H/ H0 \$ u: w( y$ A. [
这是 向量化的表达方式,说明X是矩阵,其中
# N6 V' b% B) R0 W9 b2 M
! S; v+ v3 X& F- Y, ?
X_std:将X归一化到[0,1]之间
: p: m. t9 x- }+ v& d/ r
X.min(axis=0)表示列最小值
# H1 `9 t H9 c# u) R
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
p( i+ D2 x' V+ S+ q. `
$ y" C8 G, Y. L% k% N7 x9 O- o$ R
1 ~$ F' M) B8 _5 |) ?
2.2 MaxAbsScaler(绝对值最大标准化)
3 l. T9 h" B2 i8 F( w
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
; m3 d5 h8 p/ \* o4 @0 d
1 Q7 t/ E( Z# \0 X
X_train = np.array([[ 1., -1., 2.],
7 ]/ ^3 N+ f$ J* N; i/ P9 ]
[ 2., 0., 0.],
]" a$ t0 F+ `# p) n
[ 0., 1., -1.]])
! E) T0 l2 k6 \3 T( `0 S5 \5 H
max_abs_scaler = preprocessing.MaxAbsScaler()
\* u B$ ?( u; L
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
1 S# C2 W) e4 ]# m4 C( h
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
1 h7 t- ]4 u6 i$ H1 @8 r
X_test = np.array([[ -3., -1., 4.]])
: ^9 R4 E+ p5 [ g
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
# }* V* @- v1 c' f2 u7 ~* i
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
: d6 [: Q ^2 z7 A$ b
: |' g% F3 [1 Z# l0 ~. ?
' h! O! T5 S, B( n2 |3 U9 U, D
, c- f: `, p& X& a- E& J
) { l& Z: m9 e" a' X
. t. L; z. ]2 S3 f0 A: {/ Z* l
6 }. l) [3 ?& O$ W
8 S" r! y7 H8 p9 i0 P: l
. T7 \; P2 a9 l8 U4 O: A
J' O* p C X7 k) l/ T
* X6 ?; ?" ]$ [0 E/ X
————————————————
9 P* }, a" \3 c
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 }3 L1 }; \* i/ e2 W* g8 {
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
$ g% X, J1 F; p
# }5 D0 \6 ] K& e# o. ^1 l! q% Q
6 K6 I, \ a( \: a1 n, K) W
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5