数学建模社区-数学中国
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
[打印本页]
作者:
浅夏110
时间:
2020-6-3 16:17
标题:
数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。
& v1 R- V+ O& y+ n: m5 a
1 {, k% z) u) n2 `6 d
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
. ]2 m) j6 t/ L$ F: k9 @8 x
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
1 M* k" {& ]$ J) t4 f- Z: r6 N
数据变换的目的:
/ A/ ]$ l7 H, N/ t, b3 \ y
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
2 B( U$ k# {0 k; }1 P+ b/ R
: d4 h; J* J4 U& d8 g3 z
定义 : 设有n个数据的序列
,则称映射
8 z( V& h% m' I9 h* a" E
! |) _1 ^3 m7 @( Z8 K. m6 m
. G5 M0 l. \! q6 _# G5 y" t* E
3 |8 f8 ]1 b [4 r) g3 C, _" b7 m
为序列 x到序列 y 的数据变换。
' [" O' U. f# B# Q, M7 [, G& U1 q
4 _: U* o! r) K
数据变换的七种常见方式
$ [& s- ~ L) Q C
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
0 T# b u- a$ \$ T- D1 B
! F- t S" m# o- [+ P* D4 p2 Y
初值化变换
a+ _* X$ J$ L0 q2 D% O
& I( @$ P' D7 T5 i! [# y7 ?
. b; n8 \, y7 h4 z$ {) i
也就是要对每一个数据,都除以第一个数据。
' @8 V8 J$ q% }2 R# a2 X
* C3 f8 [! z S1 y( ~& a
均值化变换
1 w" V# E7 B5 P% o% s, ^/ c# F2 \
% R# K. P" D1 O
) c5 K$ s2 b3 e( @* E$ E( ]
对每一个数据,都除以均值。
4 y Z' o% _' W Q |* ]9 M F
0 k: p' o1 B* b+ G
百分比变换
/ _* M# r) ~! p
0 i/ L7 k% @$ Q2 `( c" O8 y6 Q
. S( Z2 _8 y" V6 q5 o5 i
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
$ e8 Z* ~% T0 b5 @" J
' U" q" e2 l5 N. u
倍数变换
' u) Z* [& G- ?- T& F
9 [, ]! z7 q0 P" O
- x7 D7 V, D' x' A8 _8 u3 h8 z N
归一化变换
/ S* |- h7 R$ A+ H4 y q
, }# Y& Q" u: Q1 N+ D( s3 G
4 g+ C7 K! t# Z4 ^ \+ d5 ~: r
其中 为大于零的某个值,称 是归一化变换。
$ T e0 Y5 h9 w' x+ a
) D8 e" q( b9 ?" D c7 B
. V8 w5 k$ D0 C/ U
极差最大值化变换
/ v# c2 G t$ Y7 L: i; W# H
: z! \) ]0 Z* g- |$ @2 m/ j
! E4 o- e# E4 W. `! U6 c) H
4 f# I6 M* j" N5 A2 P% h6 k
# m* r2 N& G" ^$ s i, ^2 k
区间值化变换
" T! p2 t5 l3 j% q/ e$ @$ t( i
/ i' a& W5 _! Q- \ C+ I7 c
- `# ^- {2 u+ y5 I7 J
,
, E6 I! z4 q7 a3 c& e# j
% O; P+ n2 O# s3 z! `2 z
1. matlab 的mapminmax归一化函数
* g9 Q0 _3 i% I' x$ [
函数用法:
' ^, \% Z7 J) p) o1 d# f# ]( \7 S: x
[Xn,Xps]=mapminmax(X,min,max)
4 g9 o2 g1 f) z1 j1 c. e* _
9 T: N$ X6 p& @1 F) ~0 x- c4 \4 g
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
3 r6 S$ T8 F2 @' M* H. g$ w
! T7 h) q$ g3 }9 Q/ q3 P# O
(2)min,max规定X的归一化范围,根据需要自行设置
. Y& C& t( b5 \4 v! ]
8 _$ k/ ~5 S( y Q! T9 { q5 Q
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
! {5 n4 E3 k8 C0 A' S+ S0 I( Q6 L8 c
+ {% C S7 i6 T9 h# T' P c
调用方法:
$ j& o c' G5 ~1 I
0 x" k2 |5 `. o2 a; N
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
$ g5 j1 `% l% U1 Y
0 W5 k+ o4 u4 n
X2=mapminmax('reverse',Xn, Xps);%反归一化
! m( M+ D' B% o/ p
' o- Y5 B6 _) k* }
x=[1,-1,2; 2,0,0; 0,1,-1]
1 `4 ?+ J# Q6 v- ~
[x1,Xps]=mapminmax(x,0,1)
) ^& F$ v. Y3 x2 b
6 L" r4 @! {5 S$ F: V9 E: G1 J
9 D5 t8 B4 T9 K) `# E
% c2 k5 x2 ?8 ]% x4 V: f8 V5 d2 v9 H
对于python中的axis=0 和axis=1的问题
1 d: N! w [: M% o3 u
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
) D: L$ ]" w) {+ C2 V
换句话说:
5 P- k" D4 g0 O* e' G. I! ~7 i
% i! p2 L/ k2 S
使用0值表示沿着每一列或行标签\索引值向下执行方法
n/ l& d+ x j1 h/ d
使用1值表示沿着每一行或者列标签模向执行对应的方法
% @ Y- h/ H3 @3 H! @
$ ^, L3 f& B( `! S. B/ H! A8 g
5 M, `( g; z8 J- j% w H$ N
" u0 G1 P4 w* B. \' p5 Q
python的sklearn中 scale函数
, j1 @7 @/ x4 a8 z0 T$ L$ M
1 标准化,均值去除和按方差比例缩放
2 V F5 @0 L1 X3 d
(Standardization, or mean removal and variance scaling)
8 W& z: S& N ?# c
( t% J( b/ x0 y$ r
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
3 S0 ]4 {6 a8 j5 g' O: ^) d
. i. ]6 ^1 s4 |
from sklearn import preprocessing
0 [$ U. r) ~$ x @/ Y" R9 ^
import numpy as np
5 U9 ]0 R' x6 l$ }# t0 U( ^$ D' |) k
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
( y2 O* o+ |% N1 F {" h7 E4 \
X_scaled = preprocessing.scale(X)
+ F9 O: c8 Q2 g" {! \, | p
0 U6 Z- Y' d+ }
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
6 y; @2 f) V0 v
[ 1.22474487 0. -0.26726124]
) [5 |) n' i, {+ F5 S0 K
[-1.22474487 1.22474487 -1.06904497]]
- E7 W9 N) b7 k) W( M
#scaled之后的数据列为零均值,单位方差
; a$ T2 o5 G' u7 O5 m2 A
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
( q# g9 J/ _- O* _0 {, g
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
6 e* r& I, a) @8 p8 R- e
0 i, X- w* R* h4 ?, O% [
* B% M4 m: ~" V/ c$ w. I
8 a9 T5 w7 K. _4 F! J. T
StandardScaler
% W# e2 F$ m; y6 y! u
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
, b& {6 L6 n5 ?; ^
! R% U' t! C/ M5 v
from sklearn.preprocessing import StandardScaler
6 U- d/ S/ [! U: r
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
x2 V6 M2 w0 m9 N
X_scaler = StandardScaler()
# S, Y+ `2 _, |
X_train = X_scaler.fit_transform(x)
- g4 k" }1 x( ]4 `" H( x
X_train
/ S4 s; W' E, a& x+ q- y- t
#结果如下
) A* e( [ f' \2 f8 a2 u
array([[-1.2817325 , -1.34164079],
9 \8 s$ W) f/ w" L2 w7 y' J7 Z$ d$ n
[ 1.48440157, -0.4472136 ],
* V; h6 {! @; `7 M0 N- p6 V
[-0.35938143, 0.4472136 ],
B& d* x" h9 t$ W& l2 r
[ 0.15671236, 1.34164079]])
) S2 Z( H! {! [4 y
$ D: T* F$ A2 w+ b$ t) _* t$ q
4 J1 u$ t2 t2 x/ e4 p( O$ d, p/ A ?
8 A$ e8 _, n2 \% x: S7 c% o. M& c
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
scale和StandardScaler可以用于回归模型中的目标值处理。
& D$ {* F. `7 e8 j9 \/ [% ^
from sklearn.preprocessing import StandardScaler
$ \$ l. N' s* j8 P6 W7 K8 y
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
6 V4 _ w6 p) D
X_scaler = StandardScaler()
/ S) U7 b& U2 s, s' v
X_train = X_scaler.fit_transform(x)
% _% Y* N5 \+ P/ q6 Y
X_train
' L/ j7 T7 f8 A `6 {
#结果如下
5 G1 M9 ]5 A1 ^' u% ]
array([[-1.2817325 , -1.34164079],
* s8 I0 X* O8 J& w; [
[ 1.48440157, -0.4472136 ],
# K' l0 F/ B8 k r) k% E- p
[-0.35938143, 0.4472136 ],
. n+ }5 g% W' Y
[ 0.15671236, 1.34164079]])
/ N! g- {6 X& s3 Q! ~
9 P7 }& i/ v, R& z2 B
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
% C# p0 C+ r* N* w
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
7 M; T# _* ]. Y# j- j6 y+ ^
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
' O4 Y# u( W* `5 W2 I& x; } {
#测试将该scaler用于输入数据,变换之后得到的结果同上
4 O& P r a4 Q- R+ K8 Y
scaler.transform(X)
5 |: e; f! i" d9 Z4 Y! J7 t! |
#out:
) i( N; E9 e1 Z- c* \- y# i
array([[ 0., -1.22474487, 1.33630621],
, L0 g, c$ U( e# R* O8 A
[ 1.22474487, 0. , -0.26726124],
" x V! y7 n: W: `. L% X
[-1.22474487,1.22474487, -1.06904497]])
2 ^& B( Y0 S) [, u. x3 e. Q. H P. g& D
scaler.transform([[-1., 1., 0.]]) #scale the new data
* |7 p6 m4 ?: _8 V _( a
# out: array([[-2.44948974, 1.22474487, -0.26726124]])
' I5 J* M4 ]/ i9 ]* g$ S% Y
1 ]; b' h' e6 I" S" x% L ^
2 将数据特征缩放至某一范围(scalingfeatures to a range)
7 b& j/ t* M. p0 s7 s* z
* F$ q1 ?( e/ m: d
$ ^) P3 P& v6 s e/ G
2.1 MinMaxScaler (最小最大值标准化)
" E j0 W9 Q0 C6 ]" C
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
) ]8 i$ U: |6 s
) f4 t6 v1 D7 m" M. [
from sklearn.preprocessing import MinMaxScaler
& |4 n$ z9 V3 V% ]
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
% o0 D2 h5 r6 N4 _3 u8 h7 M" Y
min_max_scaler = MinMaxScaler()
1 o( }: U& E% }3 n) x' J2 \) b
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
. y% D( \) J( n- ]
3 y. _5 P7 q# [) _
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
+ o4 k' L# @7 m! Y5 y
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
2 S9 t0 F* S& ^. [. {
! Z6 R/ \2 |7 m' k" o* ~3 {3 M2 P0 o5 D
MinMaxScaler的实现
- o# p3 c# V v: j: v
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
+ m% k1 u0 r% a) t* B( d
X_scaled = X_std / (max - min) + min
4 ~0 Y7 Y7 e4 \) ^" O
( G3 W1 ^, h3 B0 F% D
这是 向量化的表达方式,说明X是矩阵,其中
% o# w/ q# v+ W! i! T, U
/ m2 {( E/ ^3 U" b! Z
X_std:将X归一化到[0,1]之间
( N0 [6 i8 I+ l4 r
X.min(axis=0)表示列最小值
$ {, m( a- l$ e6 Q& g$ ?2 }
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
2 O+ y: {9 m. }9 W+ S4 q. x9 `6 o
0 e$ \' Z9 Q% M* E) ~) ]
; _/ U- W0 [% T* b; \' f
2.2 MaxAbsScaler(绝对值最大标准化)
/ C t: t0 B& X ^% U3 T
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
9 M( _4 o9 e# S! P
9 I: @: l- Y! w; T; L
X_train = np.array([[ 1., -1., 2.],
+ s5 ^& X7 h7 z9 R) [5 p/ A( f
[ 2., 0., 0.],
8 o x. D6 x, {1 ^7 h3 P: j' |( J
[ 0., 1., -1.]])
" A" k) v+ l5 W0 b! U
max_abs_scaler = preprocessing.MaxAbsScaler()
) S( m- i' K+ o0 `
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
) ?! w! A+ g' b: j5 W, C# T/ j* v
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
+ L2 ^% f4 i' f$ k- K" n
X_test = np.array([[ -3., -1., 4.]])
4 v4 K; ^/ Z7 V. O1 J! o% E# }
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
+ P: K% ^: R1 n1 [
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
8 A$ m. y# O) `8 n( @ o6 H/ v5 Z
- z; s( @* L8 \7 X- d
7 _6 N; ]0 W" V$ }1 r
8 |6 Q2 V" ^+ u1 x( e
/ F4 ]& S& F+ t2 r6 O
4 H3 T4 @" t& S4 a" o
# q+ }5 s" Q# K
% B1 \+ p( i0 k
2 G4 _( q$ X# c$ @2 Q4 N! y+ |: k/ S& Q
0 B" }% V9 L3 O. Z) B
9 F: A$ m; M* |
————————————————
5 B3 e9 J" `( ?' I, e! ]
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# t) j& Q3 i( d. J" z" ~
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
$ }! m$ u, o- s' B% {& R: \
% o6 L, d0 j. D% f/ a9 F% k; D
; G" e' s$ ?( K* G& U7 e2 _
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5