在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36397 点 威望 11 点 阅读权限 255 积分 13880 相册 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。
' V* I4 i8 _* E/ L/ S- f
# e/ j, z0 q+ t/ m( {' W 当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
+ M; j: B9 ]4 G 当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler& E* A; s) i7 E: E) J
数据变换的目的:7 n0 c- s- z+ Z7 J& [
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
- Q! N5 q& f {! r/ f0 l, W1 \ & m$ I: Q& ?# d% Y1 ^4 V
定义 : 设有n个数据的序列 ,则称映射
0 B( M4 z9 @, t# R6 ]- ~- q ! x) R+ l- ~* c. W
% A# Y1 t' |& A* r& o . @" q4 ?' Z: ^7 n
为序列 x到序列 y 的数据变换。
0 _; X3 o+ Z- A: t
% q* c; b$ A% T' t, N; W 数据变换的七种常见方式
A* e2 D0 }. D- Q 此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。6 q6 ?, x. m. V5 `) O! J
. w6 M8 {! B$ ?$ x 初值化变换+ v' L8 h. R7 e2 q! K0 ~
& Z" r8 W" l" C3 F: B2 m$ a( ?9 x/ }# L 8 _3 f5 y6 W! x& a/ W" _# Q* H, \
也就是要对每一个数据,都除以第一个数据。
- `, H& ^9 H% }" x! ]8 Z; l2 q & ^1 c- _8 J4 a0 }! |" v
均值化变换& L% j% r; A5 ^
& e# b& Y( ]" G- E ! I; A z$ O" Q, B/ L
对每一个数据,都除以均值。( d% _8 N. X' p! e4 _4 e; O) E
4 c2 p8 }9 j. Q& | 百分比变换
7 n! ]' ~: ~) h. O0 r4 l6 H
8 J, t: N8 o9 B3 x! z$ S2 t $ l2 H, `$ d% P8 z2 f7 g d2 R
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。& l# `7 u. R( |4 C$ |, x
! k" b4 U- m x* u* K
倍数变换$ C# C5 y0 i( ?. c' o
' M1 s3 o0 R, F) s# ], r6 V) t
1 E( v; q! b7 c 归一化变换' x0 \: A: R$ S" Z! u4 u: _# m' {: b
8 F D5 ~( M6 N * d7 T+ ^- u, \# a2 i7 w
其中 为大于零的某个值,称 是归一化变换。 1 ^6 B+ M) T/ x8 o" k; @
$ i5 _6 C4 \4 u$ [* g ; b! ~) r' g+ J" o7 E' a6 k J4 F
极差最大值化变换) e3 D) f# t1 g2 w/ ~/ I# z
0 R. p5 n9 m; C, K1 x2 A4 w/ M
& J) `( p8 _: U3 j
8 S% s) Q c$ o) G5 V# c+ W0 N
j @! N, ~- L 区间值化变换
/ G6 j0 D3 K) A% p6 H
' v. ?2 H# f2 @4 v+ w( T3 y% N
3 s" x) W2 H3 F8 G' |% D7 B ,
1 H( Z( P, t0 Q6 v( g$ n; b; c
- O. n4 D- n- {! x, J S# @* K 1. matlab 的mapminmax归一化函数
# e. ?1 j3 \2 z) S- @9 `) `9 W 函数用法:
* D0 |+ Y: N) ] [Xn,Xps]=mapminmax(X,min,max)$ D8 j0 V, k8 U1 T
! Y# i4 @, ~; P; X' m# q 说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。0 ~0 X | h" Y. i
; y! |) j9 n, A, u' c
(2)min,max规定X的归一化范围,根据需要自行设置
/ T% v9 j% I, _" }/ M) Q+ c E5 ]( I2 ? ' }# j$ S: C" r) t6 w
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 J. B5 w2 S) @' J/ V7 q* l
. O1 K1 h7 I s, [# o; A6 N 调用方法:- t& I; C3 w `. o4 p5 { w* F- L
$ O: O( G e% D( b+ \& ~( C
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
* R T' }; B' K
5 X8 t4 m$ z1 ]/ o* N% | X2=mapminmax('reverse',Xn, Xps);%反归一化: k$ i7 v0 H$ N/ ~2 Z$ T
3 a# ]* k- I# \1 A+ }. w% r' H
x=[1,-1,2; 2,0,0; 0,1,-1]2 I& h8 [6 ?& z0 _0 ^5 y1 K
[x1,Xps]=mapminmax(x,0,1)5 }8 ^! x- R* O; v
& E+ d& e# t3 [" z
& r- i- V4 a, G1 x* F
) i6 [( Z8 V& {. R+ y3 K$ U, Y 对于python中的axis=0 和axis=1的问题
( w- E7 ]# j. b 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
; r0 }9 z& U& D, l0 S 换句话说:
& n2 @( J( g* H& \7 ~ & Q: l0 t( k/ P, ~
使用0值表示沿着每一列或行标签\索引值向下执行方法
/ m1 ?) F" Q; E2 @0 L 使用1值表示沿着每一行或者列标签模向执行对应的方法2 k8 ?& C% O: n2 ^9 Y; Q& g m
& I$ J) Y( B& N. w. [( _. N
% h; x! n L E7 _* ?$ G
" W: f: G9 L, U, V- e python的sklearn中 scale函数
6 }2 ~+ T8 i I; L 1 标准化,均值去除和按方差比例缩放' r' O0 V* L: K! k" S! @$ }
(Standardization, or mean removal and variance scaling)
" r- l; J! }3 E
, V0 j8 S, Y. U) S7 u3 E0 F 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。8 B, a7 C1 ~1 C4 }3 \8 }; p/ ]
% `7 s' f# g k9 M0 R6 H8 J from sklearn import preprocessing : Z; y5 G1 h+ p+ i
import numpy as np
( x0 _- p" d( a- S! H X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
7 w* b. A# x' |) A X_scaled = preprocessing.scale(X) - z: F o( I7 l F* m
+ g- n6 k% J' p" I2 ?, { #output :X_scaled = [[ 0. -1.22474487 1.33630621]- o5 Q9 N7 w8 f" H( h1 _* Y' v
[ 1.22474487 0. -0.26726124]
9 `: [3 l, [; s3 I5 f8 @: M [-1.22474487 1.22474487 -1.06904497]]- h! Q8 P6 O' _7 I/ b0 {
#scaled之后的数据列为零均值,单位方差
0 \ z8 ]0 u$ y' ^! H X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 8 a4 F6 g+ N. ~2 I& v; |( q. |
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
7 B4 ]+ u/ I8 m9 u8 Z4 M8 H / ~* j# ]+ |8 ?, b
" b) g2 J d1 `, ]4 z2 k! [ 0 u0 f) E; L8 \, c
StandardScaler e" d$ {& m- D6 s) E! t; K$ A
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差); z( c6 Q% C2 q: i, D0 {
5 H r: N( Y6 @ from sklearn.preprocessing import StandardScaler
" i e+ H+ H4 O x=[[10001,2],[16020,4],[12008,6],[13131,8]]$ A" u9 ]' Q7 ^
X_scaler = StandardScaler()3 L" B' V7 x% ~7 o, |8 {; ^) J5 G
X_train = X_scaler.fit_transform(x)
; h0 l; z* v* i" H+ J% n l X_train4 G; ], W U4 r0 K0 k
#结果如下8 y! w* b2 O& m) v
array([[-1.2817325 , -1.34164079],+ ]: g, t( p- H3 F( u) s9 f9 ]4 g
[ 1.48440157, -0.4472136 ],
E# j% t6 ^7 L* i2 B$ l0 e9 t1 M [-0.35938143, 0.4472136 ],
3 Y+ v" d% N5 E8 n4 D [ 0.15671236, 1.34164079]])
7 W# m* A( x) F- O8 I8 Q- h8 e 5 Q/ c' I, }9 G- ?
! x) O A+ j a! K1 s+ F
) Z( C; v# j' F, N 注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。 scale和StandardScaler可以用于回归模型中的目标值处理。1 F3 t1 c1 T( x9 m: J
from sklearn.preprocessing import StandardScaler6 W: _" t6 T1 \& z, o8 X: b- @
x=[[10001,2],[16020,4],[12008,6],[13131,8]]1 Q- L+ D; v8 A
X_scaler = StandardScaler()
! o1 ^6 M7 E) K X_train = X_scaler.fit_transform(x)
, N# [$ N+ O, Y( |0 ~ X_train
1 z" ^' M; G1 T3 W #结果如下( M2 X2 d( C5 N. u
array([[-1.2817325 , -1.34164079],) y8 R+ A3 Z2 P! a8 m
[ 1.48440157, -0.4472136 ],* P: P/ e# W1 D$ Y" q2 G
[-0.35938143, 0.4472136 ],
4 C& p* H. |9 h [ 0.15671236, 1.34164079]])- [, e. A4 W' b
# Q- E5 E2 ~6 ]5 `/ @% h' c scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)! l7 o y9 x0 ~* T" n) \: p/ Z
scaler.mean_ #out: array([ 1., 0. , 0.33333333]) 2 A( R+ K+ d3 e
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
2 f. c5 t, e6 l/ l3 p9 g6 e #测试将该scaler用于输入数据,变换之后得到的结果同上
3 l% f- N7 o0 y& v scaler.transform(X) 2 G, I/ n4 ^4 Q5 e3 K/ ~- M
#out: 9 P3 {; y( a( h8 [; j8 D( L5 L
array([[ 0., -1.22474487, 1.33630621], n7 p l7 K: r/ I( N
[ 1.22474487, 0. , -0.26726124],
. g2 t$ t6 u; A# a s [-1.22474487,1.22474487, -1.06904497]]) : M; p& F; _# [+ ~% d
scaler.transform([[-1., 1., 0.]]) #scale the new data
% a" p. t7 V' Z4 ?# s6 k' l # out: array([[-2.44948974, 1.22474487, -0.26726124]])
4 v& j R4 w5 c' e& {: l2 b& W 4 J9 F' g0 J' ]5 u: V: M, k
2 将数据特征缩放至某一范围(scalingfeatures to a range)
& L% i' x; L8 `' a. Q" F* y! a4 U $ K! U! l% \+ M) Q# K( ?; d
" ^# G4 j. e. Y3 u" A
2.1 MinMaxScaler (最小最大值标准化)
0 T& E/ w$ E5 }& |0 q 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 3 P" z9 o" u3 K/ R
+ k; ~7 F. A* x! A. c
from sklearn.preprocessing import MinMaxScaler
& B6 F6 T' t) e9 a x=[[10001,2],[16020,4],[12008,6],[13131,8]]
& M# l/ a% |9 p- X6 j* P' [ min_max_scaler = MinMaxScaler()
- n: i1 H$ D+ Y& v4 Z X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,4 B0 _5 ?7 K8 E. h6 W, i
2 i3 h: _; m- o: I, R
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
. g* N K" d6 n+ U0 x! i3 P2 y X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
4 @5 V; p' k, Z 5 I6 `( E v9 b5 }
MinMaxScaler的实现 + Q/ \2 x! {9 _1 M
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))3 I9 ]3 T% j, g0 V3 Y
X_scaled = X_std / (max - min) + min# G3 Z+ Q% S0 {4 l
- ?# k8 o- p8 M
这是 向量化的表达方式,说明X是矩阵,其中
. E3 m7 L" n) ? s4 { : s1 h$ f, [- P8 n9 `5 k5 s
X_std:将X归一化到[0,1]之间- f( w. F3 P2 ]6 F3 M
X.min(axis=0)表示列最小值
0 |+ m- B O: |3 a G max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围* G% b( j* N& p$ w$ y# z4 a) a
* y( Z. H0 y" ~$ ~ G& N
, b( H' _8 q3 @) V- ` 2.2 MaxAbsScaler(绝对值最大标准化)
6 R V0 g% f9 n' S- z 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
7 U0 I) C7 f" z' A* ~ ! _0 _8 E7 e/ B$ t n h3 a7 o1 n
X_train = np.array([[ 1., -1., 2.],
- U; N1 e' A+ H; I5 j! A, S [ 2., 0., 0.], @- t7 P" i5 k& f3 n
[ 0., 1., -1.]])5 N/ T5 I9 X5 G3 ~( n. l- j
max_abs_scaler = preprocessing.MaxAbsScaler()
! r8 Q4 ^2 T* [+ a4 N X_train_maxabs = max_abs_scaler.fit_transform(X_train)4 `& H6 L4 K6 F! v$ y
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
" e) b& [ n8 S X_test = np.array([[ -3., -1., 4.]])
3 M+ z3 i7 l; ~! K5 G m X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]]): [+ Z, q' j5 {% P
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])& i' d) H2 F7 l
7 S2 G* e( k! P, L+ r! ^
+ w5 D5 _ D$ M( i' g& z7 r7 ^' W
! D+ O$ u& f0 w0 T$ _ - R( X; V4 {" U- I' M
$ \) w$ a/ f* @" x7 x
, ?" J5 t# X2 D6 C( H & w( e9 E) V9 Y
0 _& i6 k# X3 m
. S9 Q6 V! X# Q9 g( e
" V! ?2 Z' l3 i; @( W9 k ————————————————
$ Z( } X7 c% ^+ Y6 A+ j+ ^ 版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 ^7 Z+ S- l# }2 x/ t
原文链接:https://blog.csdn.net/qq_29831163/article/details/894202236 D# v! c, G! S" F9 {( ~/ P
/ N8 N. _3 P; p! p5 @( [( U
`* J4 B0 n7 c g! c
zan