在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36395 点 威望 11 点 阅读权限 255 积分 13879 相册 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。
. k; w6 H5 z" g2 H/ a D : S& C* |- b& o
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
% j8 H- B! L' N$ H u* Q7 _/ T! W 当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
5 g# Q3 O/ R6 h9 I8 j) w 数据变换的目的:1 n* I! z' A4 f$ o) P& {
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。+ b9 g7 W4 f4 S9 Z t. t& G
6 j$ y) G6 ~. P5 O7 I7 F
定义 : 设有n个数据的序列 ,则称映射 a; H8 l# S, b9 I3 T
/ {& A# E! L4 Y+ u: Q
; j7 ?, _3 u; ^! R
1 u: [0 J p/ C" ]# ? 为序列 x到序列 y 的数据变换。 $ V" p2 P# y( p( x6 r
2 B1 o' h6 F$ ~* v0 G7 y& j
数据变换的七种常见方式" N; U& J5 ~4 u2 H% q3 e
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
1 C S9 S( a3 s. C$ U) r / c e9 M1 X/ f. Y; R
初值化变换: @. A$ x' W; s% }
1 E/ J- S$ t7 [4 B
5 x- C' ]2 ] i; T1 ]8 j4 P 也就是要对每一个数据,都除以第一个数据。* Z5 ~7 E1 \% q$ B$ @
8 d d, `2 `8 y
均值化变换; i0 k% I6 `+ L3 \
2 r. `( v8 T* b# i
7 M. I0 N/ t6 \ 对每一个数据,都除以均值。( \" Q0 O. p- Z' h4 W
u* M# J! [( Z \ 百分比变换
2 b! o n& \. S $ M+ n! E* n+ K, K$ o
# t% I) p1 a1 c! W# ?# g
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。! `" R# N& _$ [5 l& z
9 Q6 B% V3 F1 X8 O2 J9 l3 _+ y
倍数变换
: R$ s& q8 o. j# W- E
8 R) Q l% n$ i; }9 Y R0 ?2 {; E1 L8 s
归一化变换, c+ t3 c. m, R5 Q7 X8 q6 J( }
{9 M& }" C' Z' b: W3 h
$ ?* h( w) b" b9 k- x 其中 为大于零的某个值,称 是归一化变换。
: D1 c7 r3 p* B1 L$ U8 r
2 N1 I$ n! c2 x) W3 T/ E& i ! R+ D8 }+ {3 J1 ^
极差最大值化变换: Y% B; A) ^) U; G, y- o+ u9 i
+ ^& R5 ]+ Z* d9 b0 }: z
R4 y) D2 J8 C5 U6 @( E
8 u% T. G! {) M
8 H4 w8 J6 ?* p 区间值化变换
4 O% V) e8 V6 i4 A- U 0 r, F) b7 F$ f% m# a
0 b4 _# S$ E* N g/ `
,/ N- R9 V3 P; a
& J. o9 v7 ?; ~2 [
1. matlab 的mapminmax归一化函数
) H/ e" D- \8 @" v4 W# {: `9 P 函数用法:/ W7 w- y" Y/ `( \4 ^1 d
[Xn,Xps]=mapminmax(X,min,max)
4 V8 F' R. `6 K4 j3 i- n# ^" K
; i; i0 _0 N$ f" z 说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。: ]. L) y# q) ^2 S% G# o
( u" @0 R0 C, f) b) x
(2)min,max规定X的归一化范围,根据需要自行设置, D; ]' H# q2 h; f* q3 t, h
: a/ ~7 c4 t; d) H) t( o (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
# j c, Z. g# O' g
& [, Z; @! y. r7 @2 K2 Z/ H* Q 调用方法:3 o% k& q8 ?/ y+ P% C
$ X3 B! y* \! {6 I
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化$ U# K4 }$ o" e3 k, Z" X+ H
0 L9 H; ?( l! |6 q
X2=mapminmax('reverse',Xn, Xps);%反归一化
# j8 j# I$ I1 f1 y' `- r# j6 r : J8 _- G! n- H2 L r
x=[1,-1,2; 2,0,0; 0,1,-1]
" u7 T" s- r. X8 m& z [x1,Xps]=mapminmax(x,0,1)
% r3 c+ \: B4 ~% w1 Y. t
1 E0 n3 y& n) l. Q9 I" @ - w$ }, G8 j& Y, d4 [ E* I
5 {: p2 D/ k$ E L4 H( L" o! {: F6 ?0 ?
对于python中的axis=0 和axis=1的问题8 @: [- X2 o1 r) J
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)2 M% J) K4 p# l# u8 u3 t$ C! {
换句话说:
. q' Z4 B1 q u+ [% I' L' u
* T! _) y. _0 M: a1 l Q) u 使用0值表示沿着每一列或行标签\索引值向下执行方法+ L0 X7 j' x$ Z: M, ?, t0 m7 Y: R
使用1值表示沿着每一行或者列标签模向执行对应的方法4 K% I4 @7 C/ r8 C) {
@/ A3 D' ]% `# N' L& `
+ C8 ?- N& V6 s% Q# w/ z4 R7 k
" l0 \# ~$ d" N n- G+ c python的sklearn中 scale函数4 P; }- v( e, P
1 标准化,均值去除和按方差比例缩放
8 L8 G6 {0 }( j) q& [ (Standardization, or mean removal and variance scaling)+ w1 Y- d5 ]) q4 h- ~5 O
3 C6 V. O9 ^; V6 U& z 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
7 m: C f/ }8 u4 I, ~
$ b/ y' H' j3 Z( l( m from sklearn import preprocessing
9 R6 @. o' j: b! \1 ~ _ import numpy as np / v6 M O& Q) B7 Q9 |0 B: F/ Y
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
. ~2 g7 y' a" d" j& w X_scaled = preprocessing.scale(X) # l9 l% [+ u- L
3 u3 b8 P- p- s* `
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
9 l/ ?. O: \$ f+ D" u+ J [ 1.22474487 0. -0.26726124]0 ~6 T, O- I8 l$ Y; E+ f
[-1.22474487 1.22474487 -1.06904497]]
6 u# S, w" L: V8 C! O: v0 t n #scaled之后的数据列为零均值,单位方差1 Q( Y& Z6 W" k, n( k, z4 Q
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
: @# C& R; N, K. H* @7 w X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
" x( f- J% b5 _9 c6 _6 S, i
4 ]9 B+ w g: O- R
+ F \5 r% d y3 Y3 V6 \" \* a7 M
( e$ t/ ] J9 Z8 t StandardScaler ' ]* N( \+ A- Y; C# y- F
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 a" {6 l+ r& e5 o! {, b
B1 C' A7 s' }' Z7 S from sklearn.preprocessing import StandardScaler9 I: s( @3 q& Y( z7 ~! m
x=[[10001,2],[16020,4],[12008,6],[13131,8]]! G ?# J$ r- w0 M. K$ ~
X_scaler = StandardScaler()) v; r4 K. \& x: `# C
X_train = X_scaler.fit_transform(x)8 ^+ x8 O; C8 l+ `; O4 ?" R; ^
X_train1 Z: k) N3 R6 l" y
#结果如下# k: }( n0 T0 S1 a9 f
array([[-1.2817325 , -1.34164079],; w5 \8 g. I& b' ^: k/ C1 l
[ 1.48440157, -0.4472136 ],+ G. G$ |/ H! [/ U: o% G
[-0.35938143, 0.4472136 ],
: F( u- b% u8 @/ g8 z [ 0.15671236, 1.34164079]])' {, A' e+ W0 S8 R' {9 \! L$ c
; K5 U) E" E3 F3 G& Z5 N( N. T3 l1 V
' x; {5 q M; l4 ~
) n U$ @% z) c( E, L! U+ E$ I 注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。 scale和StandardScaler可以用于回归模型中的目标值处理。( c7 J* l; ]3 r/ A# o4 _9 M, g
from sklearn.preprocessing import StandardScaler
3 b8 V$ `6 r1 v6 _* N x=[[10001,2],[16020,4],[12008,6],[13131,8]] W) P2 f0 ?6 o; D' T* E1 ~, m
X_scaler = StandardScaler()8 @* G- `, P$ H8 n- \1 Z# p
X_train = X_scaler.fit_transform(x)( q- C# W, Z9 u3 Y b' Q3 K
X_train
. u, h7 W7 _% i3 V, [0 i #结果如下
& ? M% B: o* }1 N0 X/ w array([[-1.2817325 , -1.34164079],
) _. p2 Z& z; p7 P" W7 L [ 1.48440157, -0.4472136 ],) p1 A) T2 G- T6 K' b4 C
[-0.35938143, 0.4472136 ],: K) K. s2 x5 L8 k4 O9 p1 \2 u
[ 0.15671236, 1.34164079]])
`$ p* p7 K0 f) u
6 F W8 |$ Z, G1 { scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
2 {' D3 q8 h9 l# H- f J scaler.mean_ #out: array([ 1., 0. , 0.33333333]) : g7 w! m: l% W4 |4 u+ b
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
, e/ J* y; G8 e+ F) x #测试将该scaler用于输入数据,变换之后得到的结果同上 B6 N! _. K3 N& S- `2 Z! X. k
scaler.transform(X)
: Q$ M8 B3 J# }; ~ #out:
' t4 Z0 t; Y1 T; X; b5 q' z array([[ 0., -1.22474487, 1.33630621],
' z( S3 R5 w% U5 W8 v* ?) G4 G; U [ 1.22474487, 0. , -0.26726124],
0 y2 f0 Z6 Z8 D4 b+ K! q: R [-1.22474487,1.22474487, -1.06904497]]) * I# P, w, U6 P* R4 e4 T0 B$ H
scaler.transform([[-1., 1., 0.]]) #scale the new data2 K7 W$ q$ \3 O; ]% ~
# out: array([[-2.44948974, 1.22474487, -0.26726124]])) O9 B6 x) o9 e' v: N* D
) [! K8 v% S0 c( K6 Y* h
2 将数据特征缩放至某一范围(scalingfeatures to a range)9 g6 ^. D" P# u+ N
0 l& j! X, a7 q s8 {; |
/ [! a- L) F; N J( P9 `# y) x 2.1 MinMaxScaler (最小最大值标准化)5 G1 ?5 F4 Y! v+ c N" M' o
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
7 c# V# T, r8 k. g& g, v ) [; ~: o& n" U
from sklearn.preprocessing import MinMaxScaler+ ?: ~: {5 T1 T$ t/ C
x=[[10001,2],[16020,4],[12008,6],[13131,8]]8 C6 x* ^/ n0 ?
min_max_scaler = MinMaxScaler()
! A. O" d- J9 I! b- u: v4 F# X X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
" t0 W" u U( p7 n3 i- ~' | 4 N5 i* {( w; b3 l
min_max_scaler = MinMaxScaler(feature_range=(-1,1))6 f! S u$ v: W: H3 z
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
: z1 y( m( i* }0 s( J 3 | L8 F* \( j. F+ V* p$ `, f
MinMaxScaler的实现
8 O% Y S% W- {1 S8 m X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) O1 f; ]; W. p" u* }. U
X_scaled = X_std / (max - min) + min
3 n9 D" E$ a5 b% P' m 6 S0 a! u. R: b" T" M/ @
这是 向量化的表达方式,说明X是矩阵,其中. N+ `( \, q# s! Y' [: K- {- k3 x
) P2 K0 x/ U( | g( S X_std:将X归一化到[0,1]之间
1 @) W' @9 z4 l- y X.min(axis=0)表示列最小值7 X2 R* @+ Q% [
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
( a, } p i0 N+ e
. H5 r$ A5 T* x! T6 t ; \' _0 P6 t, S; W% ]
2.2 MaxAbsScaler(绝对值最大标准化)6 t( r1 Z; }* r: C0 E
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
7 x1 z3 {; n; M# |( E ; e3 u+ R$ {2 {9 R2 E
X_train = np.array([[ 1., -1., 2.],+ C7 r, l7 C$ n. z, s& x* G/ y
[ 2., 0., 0.],
3 T' E6 R1 y* Z1 O: F/ T/ f [ 0., 1., -1.]])
/ Z5 V$ k1 }, n7 {; q+ R max_abs_scaler = preprocessing.MaxAbsScaler()& s) V% e! J( F- E
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
6 T& o& P! e" b5 c# C # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])6 S- L: }! v4 W, k. j! k+ X4 L
X_test = np.array([[ -3., -1., 4.]])
9 @3 z( ^. A% M4 j- f X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])+ q/ G& T. x( B7 K, I/ J2 M
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
" J( Q/ @% ^- `% n+ J1 H3 F
( x) k n' V6 T3 o( ?2 o$ g
4 a4 v. P- P) @, J
( a& F; N: R# _: A ! s4 u2 Q9 R/ F7 @0 g6 ~1 o
8 @2 p+ B+ H( l2 r. _ 6 \* [& f3 T+ P- _- p
4 r' H* C9 z* y! b5 q- P I
& n, c, Q6 y( Q# g9 g
/ V. O/ L8 v! G* Q9 F% F o9 L) r
1 G: C x- p/ P. R) V9 ]) q ————————————————: l/ ?7 @( |; D) D
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% L! _# n( c |
原文链接:https://blog.csdn.net/qq_29831163/article/details/894202233 g1 s; x. x8 n8 J% X) Y
5 L: Z. i, [! t8 j
. J& A8 R* |( r
zan