数学建模社区-数学中国
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
[打印本页]
作者:
浅夏110
时间:
2020-6-3 16:17
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
$ @" A# \3 \! Z( [$ W9 R
W! I8 w5 r5 t. t4 |
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
1 [' s0 X q6 P% ]% u5 f
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
4 q; ?0 ^! [- q2 m: T3 A" v
数据变换的目的:
8 K- {. a* t: ^) W
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
- o# K+ V8 z( r5 M3 |
' n5 I% [/ _6 s' x
定义 : 设有n个数据的序列
,则称映射
- K, I( l- \! g+ v, M% o
. _$ l- n6 i) L+ r0 Z' k
- O% u2 z- t% ?
' B F& H% q8 l8 } d
为序列 x到序列 y 的数据变换。
' p1 [+ d& ^5 H1 q5 V! C3 R1 \5 i
# Y8 u1 L, @4 ]6 t
数据变换的七种常见方式
5 ?. y8 V u+ b; X q/ w" B z4 ]/ J
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
* ?& S, }7 h5 _4 H; Q: |
, A) P) h! k- J0 h8 g
初值化变换
+ c: H" s: O+ R9 S2 q/ P7 W( C p# z
( b4 N7 B; Q# |- E, n, k
2 P# V$ L/ G. _! t
也就是要对每一个数据,都除以第一个数据。
% l" g2 i4 J! q! X' \+ B
$ C& _; `! Z$ L3 ~8 a, q% F
均值化变换
8 l2 o) B* i6 L
6 ?, y9 y/ @: F/ E7 S+ B9 s) i
+ f$ s1 \8 ]& A8 L; h6 d- G
对每一个数据,都除以均值。
2 ^5 p8 A% N6 ~5 Y" \- C K5 G G
% E; w, M' C! s/ M4 k
百分比变换
: s8 u& W) g6 p; E9 S( o6 ?
X& [! ^! L; p I
$ o5 h h) u8 U% }
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
# L% a ~( N7 T/ q9 L) V
' S# S. V$ Y( U& G4 h' e- a5 `6 k
倍数变换
4 w/ Z c, ~+ O% y* O8 V% {
% U8 `' n: q! Q% n5 s* [. A D1 {
' e9 G; v0 z/ ?1 T
归一化变换
( c. | o8 k% I2 J* E7 T
5 E3 W" l1 j, z; F
" ]/ T+ Q5 y2 ]; ? t: z& ?; m( z
其中 为大于零的某个值,称 是归一化变换。
0 }! O% V$ a9 I0 Q" r
: c; o7 @2 w4 ^7 f1 {2 S! m
m4 B$ g' |: |4 t& L0 R3 A. i5 K
极差最大值化变换
: j, i, R: ^! g4 q
$ P( s% P! i! [
8 V4 b2 Q2 }- @0 [* V' O) \ ^
D) f$ I, O/ T1 P
6 t# P' z9 q, ~, j' [5 Y; a: y0 [! q
区间值化变换
% W# g$ r1 X* X. i, j
& R$ P* w8 C$ }
' N! }4 i& k0 |7 ?6 b: G) F7 m/ O
,
' O8 r. R& B: G% N2 @ g/ u
$ }: T, k8 @& U" O/ S- R" h
1. matlab 的mapminmax归一化函数
/ v+ U2 t. K. @" e/ B
函数用法:
6 r. C3 @/ q/ F+ r- I( `' j; H1 e( w/ n
[Xn,Xps]=mapminmax(X,min,max)
, a9 J/ D+ q1 w, B/ d
0 u; `3 h2 N6 \ m# y4 f8 y& Q
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
& u7 S( b4 i& x7 o1 _7 R# V
' A' A% L5 a3 w6 }9 e
(2)min,max规定X的归一化范围,根据需要自行设置
9 @ | R, [& p+ H9 h
- [* i; g2 v3 P$ O
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
7 v$ U/ H3 d+ x7 ^; Z' d$ m" S; h
" \0 e' j1 k# |" N" Y" w7 ~8 a) a
调用方法:
3 o; t4 C( B7 X, e% v! D' W- [ G
0 u3 m, l% h+ x1 h2 X) j% E) o
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
& M5 H$ A- A* ^0 _% b4 _
8 ?' E3 I5 g- W/ a
X2=mapminmax('reverse',Xn, Xps);%反归一化
! C; k$ M* Y2 Q7 } B2 A
/ U0 n0 i9 c! g: o- H' K
x=[1,-1,2; 2,0,0; 0,1,-1]
" p l0 K0 I( `8 o' g* E8 ~
[x1,Xps]=mapminmax(x,0,1)
7 d9 s" ]* x% t$ K9 P
) o- D: Z1 A7 F" E) E
8 a$ [' b; w1 K# L+ N% A6 U
7 k& F+ O' W) e
对于python中的axis=0 和axis=1的问题
0 @& |$ u; Q( u( n
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
! a/ z. }0 m0 E
换句话说:
$ r( z& Y$ j2 P; H4 H
1 C6 ?! R! G. v0 H; W) d' I
使用0值表示沿着每一列或行标签\索引值向下执行方法
8 c& f% m7 i: ~" F) [) n3 g" \/ Z
使用1值表示沿着每一行或者列标签模向执行对应的方法
8 I3 P5 o& d w5 ?9 `3 L6 k
8 Q: }5 [1 ?4 [# R2 \6 i
& D( o* W# @* G' N" s# Y; k
; A& i, E0 d5 s' x& H: w. n
python的sklearn中 scale函数
8 T& M }4 P8 J! \: Q0 p, ~
1 标准化,均值去除和按方差比例缩放
$ P* D: X1 ]5 D4 p# b1 |" l
(Standardization, or mean removal and variance scaling)
7 F M7 A" g, Y5 i6 j9 Y
% R7 U! b2 W) X+ S9 L% r
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
# v4 U2 L) |2 B* Q, ~+ j: p
( d$ ^6 O) M! D2 ]" D: I) M
from sklearn import preprocessing
+ h! }4 G! z- \3 r6 V# L
import numpy as np
. T1 @; F' k+ L; _- H! }
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
( Y" z$ R9 M: b& a& \1 f# l& l/ z B; r
X_scaled = preprocessing.scale(X)
# T, d# P3 R6 h: y( u- i+ w
4 i' f: k& Y' A
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
* J3 f4 D! G+ T4 B* k; i, B$ N8 c
[ 1.22474487 0. -0.26726124]
3 d! f# a- u; X+ u! {
[-1.22474487 1.22474487 -1.06904497]]
: m' {2 j5 O0 w# G' l, H
#scaled之后的数据列为零均值,单位方差
5 t, E6 M3 \3 r" _+ U& z4 }: k
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
; o8 H/ ?2 z8 W! K! y
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
9 Q d r+ U- e1 N6 d' t/ F
+ Z" ^4 k9 N' D' D' O' n
! z4 A6 j, e! k9 z
* I- u- E, ^7 k- x& N& z- W# C
StandardScaler
# G4 W4 O9 x; L1 n
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
1 k. K' Y2 I* x- G4 ?: _
8 R6 k2 i4 W: z7 [* i
from sklearn.preprocessing import StandardScaler
4 m* D3 z4 |* p" ~
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
+ T/ q' l! I7 C4 p
X_scaler = StandardScaler()
2 D& l O& I1 C x1 [% w
X_train = X_scaler.fit_transform(x)
+ l% \. X* [6 P7 M0 U
X_train
1 P7 t' m* V2 u$ c9 \
#结果如下
0 }6 p8 ?; R: {# Z* }2 e
array([[-1.2817325 , -1.34164079],
$ y6 i6 c3 `, A4 O1 i% {
[ 1.48440157, -0.4472136 ],
2 r; t& w) O0 x
[-0.35938143, 0.4472136 ],
" `$ M! s, x5 r
[ 0.15671236, 1.34164079]])
' U0 Z& Y$ ^# V" x
1 r2 P+ u8 B" n# f
" @" T3 Q: \) d7 C3 w' O; G
& F! O& i/ d) s, L
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
scale和StandardScaler可以用于回归模型中的目标值处理。
: V6 K+ Z2 `- M2 s$ H! N* `; e( ]
from sklearn.preprocessing import StandardScaler
k( b$ R8 j) O8 ~7 `
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
0 [- X, x: @" s/ _
X_scaler = StandardScaler()
6 ~+ s( V3 y" Q' H
X_train = X_scaler.fit_transform(x)
2 X2 T- U1 {& M. }
X_train
8 a; @ V Y6 R
#结果如下
0 A2 v6 g) d2 C* _ s% y$ ?8 j
array([[-1.2817325 , -1.34164079],
- B) c7 Q$ j6 j2 n
[ 1.48440157, -0.4472136 ],
6 p1 e g6 h5 W* `
[-0.35938143, 0.4472136 ],
% F. v5 e% Z2 q! w4 y T% Q
[ 0.15671236, 1.34164079]])
- z( @3 l7 q2 \5 q' h! f* |, ]" b
1 ~! ]/ S9 i, T* y m
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
+ Z7 \) E2 p! k! r
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
+ O+ R+ e) |9 b9 ]" M+ n+ z
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
/ H8 g. e/ m* s8 A8 E
#测试将该scaler用于输入数据,变换之后得到的结果同上
' m* ^& r, S; _. B% b7 N) I, L
scaler.transform(X)
' c- ]6 c" h0 Y9 r7 U9 Y% p9 N9 s
#out:
+ q: l/ a& `' e, B
array([[ 0., -1.22474487, 1.33630621],
" F# Q; x* J3 U8 R
[ 1.22474487, 0. , -0.26726124],
5 W+ r. G7 |+ M( j" ^
[-1.22474487,1.22474487, -1.06904497]])
+ {3 d% M9 l- K' |
scaler.transform([[-1., 1., 0.]]) #scale the new data
+ s# Q9 ~, n# o$ ~
# out: array([[-2.44948974, 1.22474487, -0.26726124]])
6 a7 G3 u4 v+ s2 r6 Q5 d* I; l
8 B* v6 f6 x; q3 Y4 h' A4 L7 P h
2 将数据特征缩放至某一范围(scalingfeatures to a range)
" M1 U$ `. u& E$ J
; ~( d! _+ A6 p. J+ k! p
% e2 M2 c8 {# @2 n8 f- l' u
2.1 MinMaxScaler (最小最大值标准化)
( Y. O: J& P }4 X% y. Y
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
8 K5 l% P$ N% a
# ~5 n( Y9 {$ ~$ L$ C" y" `
from sklearn.preprocessing import MinMaxScaler
% H1 x! M' `6 C) \
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
& w i9 `& {6 X' R& ^
min_max_scaler = MinMaxScaler()
; w" O! s* n6 V1 ~# z
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
& d' z0 X9 _* K
$ J- s8 \# g8 P5 i
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
$ z2 K0 d7 u* F* c- Z, Q+ q
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
' [) i# k% p0 h# D6 r( L
# Z3 F# \+ L* q; e
MinMaxScaler的实现
% v; Z7 h0 y# [9 u
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
; l! r/ P6 y9 @2 k/ q I4 B
X_scaled = X_std / (max - min) + min
% \. G5 ~3 ]" \7 X$ n/ Y
& L. w5 J. F* _7 {; z
这是 向量化的表达方式,说明X是矩阵,其中
) ^! [( p2 e3 i7 N% v( L0 m
) R) d% h, i" S6 t
X_std:将X归一化到[0,1]之间
) V6 r* M4 L" ?! E4 v
X.min(axis=0)表示列最小值
% `" {4 N+ x, I+ n1 H
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
1 ?) S( i# K; j% S/ ?, Y& L
/ t3 b( Y0 [& `) u; B2 E5 S, v
: x3 J J8 {- |! s
2.2 MaxAbsScaler(绝对值最大标准化)
: W% s# Z" b y- R v3 b2 l( Y5 A
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
' ]+ n+ T, |" x( P- H9 w
: Z" n# z! ^5 y4 h. |1 b1 Y' O1 a
X_train = np.array([[ 1., -1., 2.],
" B2 @4 e% u" h- |6 ^
[ 2., 0., 0.],
: x1 j" L6 i" e2 f. r5 c$ i7 y4 `
[ 0., 1., -1.]])
0 y& O: M* x% C2 R4 v
max_abs_scaler = preprocessing.MaxAbsScaler()
" k0 m4 D- L+ y- h% _' i) v; A
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
- ]* x6 ]6 R! q, u9 R
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
0 }( a3 J& v% I$ p) ?' G& E
X_test = np.array([[ -3., -1., 4.]])
; c' { z) U7 z4 }2 {( b
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
/ a% p5 z* h" J9 l# R, U
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
v9 A9 U' a8 `( S$ Y
/ D) i" q# D. u# y3 S, F9 g+ T
' f- I% M* A% V/ W4 l; A8 J
! g, `9 t4 w6 v0 Q5 y
3 D9 k! g* ?6 l/ L/ Z
' v0 l7 y1 E) p) o
9 i. p$ N& m. e B/ x( R2 v
. O/ x) |1 ?2 p+ }; X4 |
" P) L9 B" {, o j8 _ ]4 R9 p$ t
8 p l/ q6 d# ?7 K) U: v- Q! E$ G
- q6 L2 z8 S0 c; ?2 X/ Z- W
————————————————
1 B4 |' A3 k6 @$ r
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 Q. P7 @) I5 }8 O$ F) n# R' Z
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
2 O5 ?7 a/ b" h0 x( z& X0 D
6 I) K, t7 s) J' w& W5 U% }7 _2 i2 R
$ T8 H# l' A5 v; ~8 P
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5