在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36396 点 威望 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。& f* I, t2 b: v+ H1 j5 J. Q7 e
4 U9 e1 ]9 W- f# U 当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler3 l0 U9 u3 t; c# L
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler% P, l) f7 i U! n! V
数据变换的目的:
/ [) p) W( i" W C/ V 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。. H3 ^" ?) g5 U+ C+ b2 } _
5 B* |) r6 }- ?9 @
定义 : 设有n个数据的序列 ,则称映射9 [3 W2 U9 P g3 V" A9 B4 u
, L2 t2 @8 N: s
& u+ R6 e& n% K. x
+ u. n8 ` M& k2 ] g/ u0 K 为序列 x到序列 y 的数据变换。 % {7 s2 P* w6 [- v p5 w& o
2 A; d3 X) Q0 ?+ Y2 e5 W6 r' P
数据变换的七种常见方式0 G5 @9 t+ o; l6 }+ e
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
, K2 s) \$ a+ d& Z0 c9 u
; ~2 ?' @' V6 C$ t 初值化变换6 `4 B+ p$ N0 @
3 t& S( Q, G& r1 P
0 n0 {* v2 ?: g4 ~: @ 也就是要对每一个数据,都除以第一个数据。
2 T! u* K& b! H# ^) x $ O7 I% q, |7 |! e2 @' |9 T. a
均值化变换
! ~ f$ K/ `! i l ! g& `: w& j$ s7 L3 m
1 j1 H+ i% P7 `2 k. o 对每一个数据,都除以均值。
/ T ]5 Z# \. s3 I, `! C( N0 ]3 L
( D( ^( J" O8 A, U! h+ X5 W 百分比变换# A G& \! I, ?3 @$ o# H
; x; T" N, p1 `/ w# t5 p4 @
# K1 J+ Q" b8 S( ^# |2 ` 分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。; F8 u" x/ Y( _
4 _; G* r6 U- a2 E% w) S8 ^
倍数变换5 J: W/ l& H5 s4 x* ]
* F7 o( W4 o- y& \# d; _8 E $ _/ L1 z4 M9 A7 r" H* j$ a6 w# {
归一化变换1 j! H4 H9 A7 @* z; E3 Z
0 d& @0 l0 d; ]$ w' w$ f
) Q0 U+ y. P+ m7 z8 Z* f
其中 为大于零的某个值,称 是归一化变换。 : h ?3 \# s- M/ m$ z7 m
( s7 C5 Z5 g, p8 ?1 t
. _9 U# R3 q6 }5 `' v 极差最大值化变换 |& b: a# x) f! a! Z: S2 i
! k1 X9 `( q! K4 ?. y3 M; ~! p3 Q
9 \4 o0 M |/ n0 e
) e( x. s: f$ T/ U
" c5 v9 @- ~+ j7 ^" s# i' v) w' i 区间值化变换. x( W% v5 K( S# e
. Y! T1 p' w& @# O8 G
! }! l, @! z4 W- b {. G ,( B& K: H% E; n7 s. {% g& x5 ~& Z$ I
5 h" O: e% E! V2 J2 i" ~0 A" B
1. matlab 的mapminmax归一化函数
6 g7 Q1 ]3 s/ l! Y! J2 | u; `4 \ 函数用法:$ ~( h: U' Z+ V
[Xn,Xps]=mapminmax(X,min,max): H8 ]) y( K6 I3 c h0 ~
3 J7 A. t3 r$ P5 S- }1 h5 i
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
' i( v0 p" r0 E0 r
& l5 L1 F6 e) p. J2 o6 f (2)min,max规定X的归一化范围,根据需要自行设置# o' ?, e% ~( j; {: t
. Z" r% D- L! \. W2 n% `0 l+ w+ M (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
7 l0 E/ m+ H6 {5 @# p+ t/ {
; o% ^2 ?* w `. g( ]2 V% S9 S 调用方法:9 M$ ~9 `. \+ G
! u. t7 t. h6 M7 ^* z) H3 p X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
. r l3 F4 [7 \ $ h- c2 w3 V: }# {. n8 t0 a
X2=mapminmax('reverse',Xn, Xps);%反归一化
- Z. M" b: I, u$ L# }5 n F 0 o) _5 u, N7 @6 W! C$ b5 w
x=[1,-1,2; 2,0,0; 0,1,-1]
2 s# u3 U) z2 {, E9 ~3 c) c [x1,Xps]=mapminmax(x,0,1)
! w+ Z3 r% i, C
& n a0 n# f& n9 o5 z0 w $ w( J& Z+ l0 l( m6 r
4 g) w' U& i4 t. ~" s% ~$ L: \ 对于python中的axis=0 和axis=1的问题
A7 L" q7 u, ~5 P3 r1 S' n 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)/ U& }) _( t; L: w* t+ k) o) c, P
换句话说:( H: o% a- r, t$ R
/ m0 f5 U t3 z& [ I1 z 使用0值表示沿着每一列或行标签\索引值向下执行方法3 A, m" L' t* A/ G+ B
使用1值表示沿着每一行或者列标签模向执行对应的方法7 N7 h4 l( {! d: F7 |* d5 V3 B9 h) [
5 `2 K7 C1 Y% A+ ^/ Y6 p
$ B, ]% Z. G0 Q
0 a" Z3 x3 s3 n' s) x4 A; c5 J6 t python的sklearn中 scale函数8 @. r; b+ b# z1 ? D4 ^
1 标准化,均值去除和按方差比例缩放
! s+ g7 u4 E: g- k" s (Standardization, or mean removal and variance scaling)
, g. c$ A( H, R4 z% E# G5 @7 A- y
/ `. {7 Z. Q, C 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
! G v' t8 o3 U$ r* y. @; Y
0 ~% u% n6 e7 J+ A" ^8 M9 i from sklearn import preprocessing - u. Z$ H+ e8 a/ D7 R- V1 C
import numpy as np
' ?1 c2 L& U0 T X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) - U2 v1 Q" }6 r9 J! |0 R
X_scaled = preprocessing.scale(X) 2 o* i/ i8 {) y
4 N* E: V4 v. \& t #output :X_scaled = [[ 0. -1.22474487 1.33630621]; `" c: W8 P1 C, T2 H9 Y5 w
[ 1.22474487 0. -0.26726124]) d& A+ b( Y2 F. K
[-1.22474487 1.22474487 -1.06904497]]1 n+ T0 n; o& f0 R$ I6 A. R6 U
#scaled之后的数据列为零均值,单位方差
* J8 e5 o: U* L5 h, \ X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) # f! T# U; a5 }! `+ H7 v2 i
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
% m8 i/ D7 O4 @7 Q% C ( X# H" m5 }2 T" \) J. t; P
6 j3 l, j8 t1 @$ z
1 ~5 l& G% o% c2 u5 h+ N
StandardScaler 9 C1 l1 T# Z- Q4 g
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)" T) Z6 N5 a; e1 h9 V" l1 G
N) M3 X7 Q- W from sklearn.preprocessing import StandardScaler; l( N8 u& [( V; r1 K7 T# h' r
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
" }1 u" u# F# j8 ` X_scaler = StandardScaler()
5 [; T0 p" H% j9 a8 Y! D X_train = X_scaler.fit_transform(x)
( _9 O& m4 d7 L/ u! T: K# [6 K; A X_train
9 Q! x$ U. Z1 P) b$ j" h #结果如下
! o5 O/ I/ i! g, I8 z- j3 Q5 X array([[-1.2817325 , -1.34164079], f4 d8 j' y+ Y# ?* \5 c6 h% |4 x
[ 1.48440157, -0.4472136 ],+ N% z% g8 D3 c2 s; P2 o
[-0.35938143, 0.4472136 ],
- D# K. t$ I. e [ 0.15671236, 1.34164079]])
, F0 E% s1 ]3 ]4 R' i) Z & X* e8 _. G$ R7 W, Y p1 E
, s2 s3 N4 j1 T# _) r: Y
. L3 m$ B6 C# ~9 B
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。 scale和StandardScaler可以用于回归模型中的目标值处理。6 f/ N" r2 l& y% i ]
from sklearn.preprocessing import StandardScaler
8 r5 R) G X) [# c x=[[10001,2],[16020,4],[12008,6],[13131,8]]3 g' L! n+ `7 b; p% e
X_scaler = StandardScaler()
# i. E4 D2 v1 o$ {9 r0 g+ z3 C X_train = X_scaler.fit_transform(x)* S5 Y0 H j' N
X_train
3 O) Z6 N/ S4 D* e. u9 ] #结果如下3 O6 _) f6 X3 o$ M8 F1 f
array([[-1.2817325 , -1.34164079],% `1 {. M8 g) j% i; X/ a* M
[ 1.48440157, -0.4472136 ],
9 S+ e5 l2 M. t7 _: D! S [-0.35938143, 0.4472136 ],6 D" h' Q+ Q, G' V7 \
[ 0.15671236, 1.34164079]])1 Q5 \6 o+ \9 B0 H2 i' \
1 m) J7 t- S+ q- m' w+ k6 I
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
1 x# W6 U4 B6 F1 ^) W: H* R scaler.mean_ #out: array([ 1., 0. , 0.33333333])
0 [# e3 B! r8 j2 D6 O scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
9 h' i4 P3 y# ]; ^. D& X" ~8 ` #测试将该scaler用于输入数据,变换之后得到的结果同上# b& [4 m2 d% B5 G, I
scaler.transform(X) 7 i# e; j& t: r9 N5 {. U6 t
#out: / b3 h7 |+ k7 N, t+ Q3 a! c
array([[ 0., -1.22474487, 1.33630621], 6 w/ D/ M: \3 D, G! A
[ 1.22474487, 0. , -0.26726124],
) S2 Z3 i1 L1 i7 l2 M, [ [-1.22474487,1.22474487, -1.06904497]])
. k! w8 V5 W- i& n7 ~$ P9 ] scaler.transform([[-1., 1., 0.]]) #scale the new data
: A0 }! ]: ?9 H: h( N # out: array([[-2.44948974, 1.22474487, -0.26726124]])
7 s& s8 _, W# ]; ? ' z( `& [- s- G: G) _; I# r* s
2 将数据特征缩放至某一范围(scalingfeatures to a range)$ @5 `) n( m8 {1 E7 Z( j5 r
* f" ~! [. d+ }3 i: u0 C4 X2 S
( u( [9 c) J8 N2 y6 O4 z
2.1 MinMaxScaler (最小最大值标准化)( i2 ~5 c* \! C/ }5 ]# S% c/ @
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
3 D# ?; I' z/ {9 E. V2 M
# R0 e7 _* G" G from sklearn.preprocessing import MinMaxScaler) L4 W# _3 ]( ]& Y+ M9 }
x=[[10001,2],[16020,4],[12008,6],[13131,8]]# M M7 ^/ C l; Q0 ?& H
min_max_scaler = MinMaxScaler()
4 _7 B1 I( U, B' i- G& j X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,: [9 F0 \0 h1 B" O
4 Y, b5 k, p8 I' a8 t/ R' H min_max_scaler = MinMaxScaler(feature_range=(-1,1))/ H8 G0 J& _2 o; y7 _
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
$ k/ E5 c j$ `) r3 A
( e5 W5 p4 |+ ]0 N+ D0 B MinMaxScaler的实现 * `5 c m( V0 \5 o# P" Z s
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))% Q/ b( z: p9 a" [
X_scaled = X_std / (max - min) + min
7 ?* `- H3 I) I - H+ d# F, M; f& F& a
这是 向量化的表达方式,说明X是矩阵,其中
' V" |" R9 P, @; k: L+ Q
6 a! _/ S9 X/ x A" u X_std:将X归一化到[0,1]之间
& b* X) g' N. @, _/ b8 Q( z X.min(axis=0)表示列最小值
( s- }7 _9 A/ [ max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
7 }0 l: g1 v" l7 n/ o 5 u& q: ^% ~( W) @
4 {) H- D2 c1 O( E" W9 a3 G) u. m 2.2 MaxAbsScaler(绝对值最大标准化)
U2 J' B5 [6 |, y 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。+ K6 m- |/ |, B7 M4 k: [3 O ]
0 [6 L/ a4 E& U0 K3 n X_train = np.array([[ 1., -1., 2.],
; b- H9 C: l6 l9 ~: R- D [ 2., 0., 0.]," D* b8 v+ C. J: L/ ?: R
[ 0., 1., -1.]]). U, _9 w0 m& i$ y9 y, h. c6 _
max_abs_scaler = preprocessing.MaxAbsScaler()6 E5 f7 d7 X7 _/ B6 }' w; B
X_train_maxabs = max_abs_scaler.fit_transform(X_train)2 Q5 l: ^( J3 c! Y: S5 {
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
0 b2 ]0 }3 Q: H0 ? X_test = np.array([[ -3., -1., 4.]])
. V* p3 C* D1 z1 @' y X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])& S" E }2 o7 O* b$ b$ O' u1 c F
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
; E# V/ J& ~$ z1 w
7 X: U4 L. z( m+ b8 f7 ]5 C9 j% f
! O% g R) ^ V
- R( V- v& l( g# o( p) W: q+ a
% D/ B! @4 {- h* Q. Q
& X+ F) |0 u: V) p
/ J; q0 A6 Z" X# T% u , ?/ q+ x7 c& S" _
( l8 Q* g- O/ ^! X
% {2 t) p, u5 v+ Q9 b% N
6 U1 {, b: v5 G( N$ R; Q) Y ————————————————/ Z5 W: `$ s# q( a
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* V* N! r4 k: b) [( W
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
: E+ t' W* y+ ]1 b1 U
, u8 J$ w. G8 d$ _
; `0 L& n: Q$ F" |
zan