在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36305 点 威望 11 点 阅读权限 255 积分 13852 相册 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。& Y+ P0 Q# J% j% B( c. M+ z
: U9 E6 a0 x! P
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
5 `) {) A. C( k/ q3 P 当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
6 T- ~ v* H$ F3 {: W! X3 o 数据变换的目的:# t* \! X0 P8 R7 h, s! u
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。. ^- U' o: ^ O% {
( i: ~% U: Y% S ~+ ] 定义 : 设有n个数据的序列 ,则称映射
B# i6 v+ r7 _" M. ]
1 e, X% W0 c4 A& w- G$ ?/ T5 }4 h
3 l" j- K* d- C! @5 `( G
. a3 K) f. m" b1 g5 c. O* c0 p 为序列 x到序列 y 的数据变换。 / W% s; G/ L; ]+ ~1 ~& E- m9 \
, P- S% }; W' h
数据变换的七种常见方式
9 p- _! |- Q2 E/ i5 S 此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
. y, w* K& E' k$ B5 h3 i 7 N4 f( G0 b8 V) E4 A
初值化变换# r3 Q9 N# A1 l' i
9 V8 U/ V+ `* O7 k( a, D; V6 r
+ D( L- R, C* C! F* B: } D
也就是要对每一个数据,都除以第一个数据。4 ^8 Z3 o% e7 N- m2 B( Y
; D! i& w( F" K2 x6 u) t- _- Y. |
均值化变换# v0 z9 m1 c1 b/ [3 o/ B( E
% r- ]' N* g7 V& e( M3 q5 a ! {. c! y- h5 G$ ]5 O5 n9 y: ^
对每一个数据,都除以均值。
' r. e1 _4 H3 N6 L5 P- W
# Q' n7 O. n. w v! f 百分比变换1 w0 O1 b: C& W9 z% W
/ }6 }: r0 j+ g2 V( C - P h9 p6 v; N: m. i$ E
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
: W4 C( i" A" i# A! r# f) H
& o- J! O- t1 u9 X2 `6 _& ~ 倍数变换; M1 H9 `. T" t5 b. p" F( p J) ^
% [" A& P4 X: B 5 `/ E1 D' |* B6 ?* j: G
归一化变换
1 Q6 E% {1 Z1 p" |8 E! r/ h$ l
1 u7 C$ R$ _. Z, w* E8 E 3 X5 U2 ^7 e; p' j- a6 n5 m
其中 为大于零的某个值,称 是归一化变换。
' ]& x# U, a0 A1 S/ j9 C* a
' E( Z& v8 `: b4 m& C3 E6 { ) D5 ]' z6 J7 O' J( T3 U" j: p3 f
极差最大值化变换
) q1 Z Z! v/ @" U) p , b8 i0 ?$ A, |; [8 d, d
) { {1 R. Z# T0 \: k0 ~- W
: |4 g# n! ^8 W3 x+ }( _$ z
8 r5 | \- F( E 区间值化变换
, R/ P( c/ i1 c- W$ ^ ! o" l+ {/ X0 E8 h. i( L7 P$ B7 x
% D. D0 J$ t* v( a ,# W# P# p* @; e! F# t2 @
6 q3 U2 i, g6 X$ f% A4 a7 M
1. matlab 的mapminmax归一化函数4 `! i7 N! B: H9 y! W8 X
函数用法:5 Z! @4 `% i0 r+ o# R/ Z% d" @# R( K
[Xn,Xps]=mapminmax(X,min,max)
j1 m# J; W% M- j 0 ~3 _5 }* z! b9 a( e8 V4 N7 J+ Q! r
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。+ p3 }- z5 |$ Y9 z
$ X# u( z( ]1 b" P! ]$ r; l (2)min,max规定X的归一化范围,根据需要自行设置
, T- s. `) k) g" d6 j
3 _. n! @6 F* n# W1 d (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 6 ^ Q% J; a, ]( Z/ f3 \
& S4 W- \; r/ b$ o) a% J ` 调用方法:8 f$ [0 p+ s' g- v/ Z) b
$ e! i( g# F) p9 \0 ~5 U9 } R' T
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
- R6 F3 S- ?2 `
8 L1 ~3 I% q/ j( w X2=mapminmax('reverse',Xn, Xps);%反归一化1 k0 e1 b% Y! Z, j
. X" V) }8 w& Y- U$ v
x=[1,-1,2; 2,0,0; 0,1,-1]
) |) t( c: m% `2 j- W: w# u, c [x1,Xps]=mapminmax(x,0,1)
' t" \ ~: @" b6 |4 F8 k0 E K y
# }; S, ?% g+ ]: l- N6 X
6 P( [' N! {$ \& {2 M W
2 N9 ~6 H8 G( F9 d6 a0 S; H 对于python中的axis=0 和axis=1的问题
7 \3 c( f. \. C( v' i5 ] 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
; v6 r; h: G% Y( N( D6 E 换句话说:
; T& L3 r/ j" O' }4 g9 ~$ j
* \3 U2 k& Z. F( q" o+ x1 Z9 X2 J' R% O, g 使用0值表示沿着每一列或行标签\索引值向下执行方法' U X& f3 Q0 j
使用1值表示沿着每一行或者列标签模向执行对应的方法6 Y; S5 `+ H& b- E
' ^( W: _! x! c* X3 e' R
0 T3 s! @( X5 \$ h: e ' ?9 U8 N8 x+ q' G: \
python的sklearn中 scale函数% v8 [2 t5 |. f9 ?
1 标准化,均值去除和按方差比例缩放( h0 L- v7 N8 a7 m
(Standardization, or mean removal and variance scaling)* r/ `) I4 f2 ?' P0 |& `5 R7 C h
/ F; k+ G( C) r. D! S- j
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。7 W- J! Q* `" W9 {9 {. A
& \6 {. {+ M& |; d5 Z from sklearn import preprocessing
7 `/ [2 v7 }; p5 D import numpy as np
+ G" g" N* h/ Z. L X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) ( `9 V% V) F5 ~% o8 M% j6 l3 W
X_scaled = preprocessing.scale(X)
2 P+ \: F1 J# P2 k( }3 R
- b4 `* s' c- b( b$ ` #output :X_scaled = [[ 0. -1.22474487 1.33630621]
! g, B) k) B* ? [ 1.22474487 0. -0.26726124]; L |, ^9 Z A% H, a
[-1.22474487 1.22474487 -1.06904497]]
8 p: U9 y( g$ N2 ]; k #scaled之后的数据列为零均值,单位方差
9 _8 u5 m9 X5 Q m; j; }3 K- s; r# f X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
) }8 ^$ H8 ]. Q9 A% y* n5 v X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
y5 T& e" N' c( Y8 I& M # ]$ v6 g3 n% a) I1 q! `7 `! e
6 }. }/ K, {3 _
1 [" h% H/ }; m StandardScaler
; q& |! r& W! K" h; I Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)& f; U8 i: n b( x# {) J' m* N
; a9 Z7 n, H9 Q# Y% t( g5 G
from sklearn.preprocessing import StandardScaler3 P! A2 H" o3 D6 _2 M5 G
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
w8 U% t$ o, d' d2 L L, P& ?- R X_scaler = StandardScaler()
7 h v1 d/ h- p) l. ~5 n X_train = X_scaler.fit_transform(x)
" _. @" Z# q* J# b8 q( ? X_train
( V* s$ J, K$ B) [8 W# H( \ #结果如下! a- f/ r( D( v4 O
array([[-1.2817325 , -1.34164079],
- _0 V& T, L: w% v [ 1.48440157, -0.4472136 ],# V. g, g7 l" S9 p r7 F' E
[-0.35938143, 0.4472136 ],' b; A8 M& \! M
[ 0.15671236, 1.34164079]])
% Z- t- n4 ^ _ q/ I
- q7 m! P; L6 E% [; v. P% n' s9 {# q
$ C; @- ]2 D( p$ c
# y+ M8 i4 R3 [3 | 注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。 scale和StandardScaler可以用于回归模型中的目标值处理。2 P6 u7 H% e9 z* K& Z
from sklearn.preprocessing import StandardScaler
B6 s, a2 N. ^ x=[[10001,2],[16020,4],[12008,6],[13131,8]]( i* ~% m& w( B$ A7 _( q
X_scaler = StandardScaler()
/ j/ ~( G. g' P3 m) T* K* P9 w X_train = X_scaler.fit_transform(x)& y6 m$ F% V% t. q) I
X_train
: b+ j! p; V) G) v; t #结果如下5 p7 M4 o8 Y3 S/ Y* s. U
array([[-1.2817325 , -1.34164079],
Y8 e- K: f- S) O [ 1.48440157, -0.4472136 ],1 f4 I e( D9 O1 w9 \
[-0.35938143, 0.4472136 ],6 _) D% e2 @$ F: m, U
[ 0.15671236, 1.34164079]])
# D9 l$ y! {: x , {+ s% ?# _, E! c, [
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)8 B' V. ^# M& x/ ^( {
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
% P# B \% U9 e scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
* z2 ?2 O: ^& t. B #测试将该scaler用于输入数据,变换之后得到的结果同上7 p- c( w# `" t( B b/ p6 _) }
scaler.transform(X) ) C- Z: \1 \& L V7 d( A
#out: 7 g/ G* p v: P+ A: k1 @
array([[ 0., -1.22474487, 1.33630621],
6 u: }9 z/ E8 |' T$ d" [* L' ^3 a [ 1.22474487, 0. , -0.26726124], 3 i$ X& P3 L: X9 G5 W
[-1.22474487,1.22474487, -1.06904497]])
8 n6 Y8 l* a* g7 F7 e/ T scaler.transform([[-1., 1., 0.]]) #scale the new data
4 h4 }3 n# c+ T, H b) [ # out: array([[-2.44948974, 1.22474487, -0.26726124]])* p$ { ~! |' C& Q2 Y- s. `. j# d/ J
: @6 B4 Q, S8 }* N `$ b
2 将数据特征缩放至某一范围(scalingfeatures to a range)
4 {6 M' j! H5 [! b
( f S# C0 A& C" W 8 o M( N. O$ |9 D2 e* a3 w
2.1 MinMaxScaler (最小最大值标准化). L1 o P! @0 k; X( @8 y
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。
$ r. J0 _% a7 k* E4 f' @7 H 3 A8 S3 W0 @+ w7 P- \
from sklearn.preprocessing import MinMaxScaler
+ H A! A% `3 @! V x=[[10001,2],[16020,4],[12008,6],[13131,8]]: F" \, c. X" [8 c6 L
min_max_scaler = MinMaxScaler()
# d! ^/ }$ j; o V6 g' L X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,4 s2 ^ Q$ s8 b& n. U) |
9 z7 k' r# x. Y; k4 k" H min_max_scaler = MinMaxScaler(feature_range=(-1,1))
; q3 b# g) V7 j" d2 H5 B X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
$ O5 W \0 A8 P . ?# ~3 I/ L9 P* {
MinMaxScaler的实现
" |. w; r5 K, T% x& U4 J& Y8 t X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
1 j* c7 @6 g: y; t) b X_scaled = X_std / (max - min) + min
, p# \' q5 V) _" E; T 7 i" w- f/ y. Z U
这是 向量化的表达方式,说明X是矩阵,其中, u! n- ]. l* _* l7 D
5 `! q) ]- K2 _. P
X_std:将X归一化到[0,1]之间
0 r7 W2 M- i/ D X.min(axis=0)表示列最小值0 _* t0 [" R4 \1 X y" b1 O
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围: _: d4 x; n" f% b/ M0 F, L# r! o
" M9 D9 l" U& N
( E b% ]) A3 H9 z* ? 2.2 MaxAbsScaler(绝对值最大标准化)5 \4 O- ]& ^3 J
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。7 l' m/ c. z2 j O
% N3 O( S$ X" v" |. ?1 T7 i6 @
X_train = np.array([[ 1., -1., 2.],% k& I8 |8 g, p9 w4 `
[ 2., 0., 0.],
2 {+ e0 p, w# J [ 0., 1., -1.]])
" F/ C/ v' k- s max_abs_scaler = preprocessing.MaxAbsScaler()1 T- M% r. m* }" i8 E
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
$ R8 N; S+ s: x" \9 Y) L # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
# p/ F$ E: Z$ C$ N+ k4 g* Q X_test = np.array([[ -3., -1., 4.]])
) p, S& `2 K' ~4 Q$ z X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])2 o5 _3 s7 x" `6 I' |2 q
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])" I/ `. T7 U: J
# _2 d+ V6 ?' e" j
% \* Z9 R( n% z1 J, T 7 h$ x8 d- z% B+ }6 G/ h
. x N+ R8 B1 A- L
) M* E" E/ O- z8 J* w
! u! {2 ]0 a. f+ p/ H, `) I
7 m/ R: S! X. `" ^( D X
! g. K. g. q+ }' Z0 x* z; n3 U
" l3 e, I* w' I : v( H0 C( p+ y9 D s
————————————————8 `( U" v* J9 R
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; [ j+ M; S0 p8 f. Z% e/ \ 原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223. C9 t6 R4 H6 O/ b, h. @
' F, ~# W* y! L) E0 n
7 [: T s1 v3 o4 q/ W, V
zan