- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36312 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13854
- 相册
- 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。
7 v3 p7 q+ Y& i* X; O! j- K8 T
6 ]/ ?" P5 j* q5 v% X当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
8 n0 } F3 A* ?1 V当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler$ A8 N" y$ ?1 V2 E. j
数据变换的目的:6 s3 Z5 y$ U/ a9 x$ f0 g) j
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
0 f- S, ~2 D0 i1 d" u
. y; E$ Q' J- r- V5 G3 d N! o8 T 定义 : 设有n个数据的序列 ,则称映射
9 U N# X% c& d' B6 _
- W9 A# @* A% h5 ^3 X 7 L/ w0 i" G5 E- F( U7 `& W. I4 d
* i' p8 _1 Z$ h. u# d 为序列 x到序列 y 的数据变换。
" E. b, m. ? e2 x
3 k& @+ h8 I4 l# k: j数据变换的七种常见方式" B c/ x N1 s( e* L
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
( D* r; z5 `6 L! B4 g2 \) _
! _! L0 T0 x' z1 o初值化变换
) }( i' x4 c2 B v3 s( ^
8 |* z Q0 H3 `& w( e0 N4 D! ~![]()
& {% m: S) K7 T8 H3 F 也就是要对每一个数据,都除以第一个数据。
, Y# y" L3 B* v0 f( g! N' e3 m
, E6 } J* v$ B+ N8 `$ j均值化变换
7 d. G3 g: V( D1 D3 J' i, [2 @. b) w$ q ~# @. Z- O, [6 e6 l
$ O: U: }, r( i6 z
对每一个数据,都除以均值。4 R# r* k4 C5 W, { x6 ^% Q
2 \ _" ^, L9 M3 t
百分比变换
; }- ^& }9 y4 }4 T' N" o! `* J7 j
) e, T9 R1 [7 A( v9 v/ c & [0 f/ o; y+ K& M& H
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。
$ E# E$ a, L2 B7 m
8 r+ w! k1 P3 G8 N$ P' p倍数变换
2 @: s0 `0 y6 q) M " Q; z/ S& u0 B
& v& U0 F+ M& n) e' Y7 D
归一化变换
( g+ H* a2 L8 r* k( h
# `: s' A' Y; U- a $ r; C/ |3 o, {4 E$ Y5 ]# O- C+ f
其中 为大于零的某个值,称 是归一化变换。
0 p- [: F; e- T S5 Q
6 d6 y" ]+ D2 z, V7 J; H* g5 i& P
极差最大值化变换: p) L4 p, O; l F4 r
G! Z. h( g* ~% Y# ~
![]()
* ~; f/ \& A( r1 J; t1 g8 B3 q' g, ?
7 t, z! O1 L" w7 N" l区间值化变换, B$ m, i( v9 Z" e; Y- ~) }. P" E
8 u7 ]! ?8 A! J- \$ p, D![]()
) ]- [) r' z+ G a$ e, |3 D* I: ` ,
- [3 j( Q! G( Y* y2 ~4 _9 U7 q$ h0 q7 g5 k. k4 s" w
1. matlab 的mapminmax归一化函数7 f* a1 Z; y: s; u
函数用法:
; Y. ~8 R" i7 ^5 `/ { [Xn,Xps]=mapminmax(X,min,max)7 x+ Y$ }2 T) G. p. I
4 x H* ?5 N$ p6 n/ o
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。$ ^8 d- \7 q: |* z& s- Q: b
5 O" l \0 V* \" D
(2)min,max规定X的归一化范围,根据需要自行设置% G* C) @9 Y) b3 A
+ `" n( X5 [# L( T* Z
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
: y3 V. _4 H3 u' b+ D
( H2 } B' {4 f9 O6 W2 u |- y$ p. } 调用方法:$ ?4 E0 a- j0 K
. s) G3 J; m- K) wX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
+ a- y+ f" i# E! }. {" m: v0 h. F' `8 m5 f
X2=mapminmax('reverse',Xn, Xps);%反归一化
1 T7 ^5 G- |( b, o h9 M8 ~& v9 z( a# e3 O, o, }3 F
x=[1,-1,2; 2,0,0; 0,1,-1]
; F$ V/ ?: h( b0 \1 a8 |6 c[x1,Xps]=mapminmax(x,0,1)6 N3 n) L* s' C3 d% Z
* S+ @0 U! D4 ?
8 [% B$ ~1 e' R
: r: s2 q# c% S* [7 P对于python中的axis=0 和axis=1的问题* O m# v- y/ @; @6 K" [8 T
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
% @3 g7 T; f/ G- C0 C换句话说:
. n- S7 V/ W. L0 P `$ V
8 V7 `" }& R. ]% ^/ Q使用0值表示沿着每一列或行标签\索引值向下执行方法9 W9 l0 Y3 R/ l$ l
使用1值表示沿着每一行或者列标签模向执行对应的方法: a8 b& Z$ E, ]
7 N+ M; Y+ ~/ l. H% e Y) }
. G: l* \( G+ }
* b2 _4 S$ S* R" J
python的sklearn中 scale函数
8 X+ g4 L$ c0 g+ N7 W1 标准化,均值去除和按方差比例缩放
- W) l% b1 W$ j) v6 U! Q2 i (Standardization, or mean removal and variance scaling)1 h( |: J1 o5 U' {3 G( o4 |8 {
8 R6 H8 ^7 a: T8 T/ s5 _
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。4 D" l9 @+ s8 P. n- _3 D, u
B" T' U V& Y" ~from sklearn import preprocessing " H7 c- R& R2 Y0 y; Y3 o) a
import numpy as np ( @/ ~% N" b, h
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
- t* B: `3 o$ G4 aX_scaled = preprocessing.scale(X)
+ E7 P m, V Y) o1 v; p% ~" r9 y, U1 m2 |) {! L; Z0 s' }
#output :X_scaled = [[ 0. -1.22474487 1.33630621]8 h% I/ G& T) ~; P
[ 1.22474487 0. -0.26726124]
5 ?1 y1 y; F+ d. o( O$ |7 _ [-1.22474487 1.22474487 -1.06904497]]8 j$ d( z, o X$ D1 n, n B" b0 l# E
#scaled之后的数据列为零均值,单位方差" p J0 ~7 G( ]/ ]1 S% X1 z& b
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 7 V; G2 y! ^" Z
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])$ {* G: R( {8 ^4 z& Y/ N, O3 q
. u. N! B0 C& Q& J0 W% r4 v% k4 I# e
1 \) G- m6 h( d. [# Q% w: g- V3 M) f: Q4 I5 D$ ]: A p: H l1 t
StandardScaler C: S3 {: O8 p" i0 j+ _2 ~# H
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
1 X/ r! V2 W; o; d# Y5 F% a0 k* e K+ @* C% {# Q* C
from sklearn.preprocessing import StandardScaler
4 w6 U2 L3 H. w; U _, G* s8 yx=[[10001,2],[16020,4],[12008,6],[13131,8]] b' Q7 T* F- F* Y% [& c
X_scaler = StandardScaler()
, L# F0 d3 I- ~7 g0 ~$ wX_train = X_scaler.fit_transform(x)% C, U# ~ B7 J% K
X_train
9 l" H1 y7 P2 J4 {#结果如下
: d6 m) r. G0 rarray([[-1.2817325 , -1.34164079],, P4 @, R# W" P
[ 1.48440157, -0.4472136 ],
# g6 [. Z" X W* e1 n [-0.35938143, 0.4472136 ],4 \# w7 |% M- O( N
[ 0.15671236, 1.34164079]])
# S5 u( d# U- x7 i9 |
; R, B& S# V4 |9 g8 d/ H& ~8 h$ U
) ^; M- A u7 b! I; x* T3 i+ L8 e1 ~+ h6 w" g- L- Y
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。2 G* m( k/ C7 L: }0 d% s
from sklearn.preprocessing import StandardScaler
' i: U) u$ [" T# Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]6 a# ?' T w5 [2 K
X_scaler = StandardScaler()- o( p# v4 G9 S4 ~) A \2 \
X_train = X_scaler.fit_transform(x)
; T: Z# L5 L; e1 s' ?X_train
/ K( R; N2 O$ N1 o4 H( ~# n5 \#结果如下
" p# M. L4 O' u v3 _array([[-1.2817325 , -1.34164079],1 C. x5 k5 r5 b# d: u! r
[ 1.48440157, -0.4472136 ],
& F2 @$ i1 z, o8 d [-0.35938143, 0.4472136 ],2 Y+ Q8 Y0 w' ^
[ 0.15671236, 1.34164079]])
( p3 W& d1 L8 M" `" m. C) |
; L3 J/ n2 a7 q/ L/ @# Hscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
6 L2 ^! _" f6 Y+ z* ^scaler.mean_ #out: array([ 1., 0. , 0.33333333]) 3 y9 w" ?6 H" ]
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
; T6 h" u/ _/ W9 r# m2 V- b#测试将该scaler用于输入数据,变换之后得到的结果同上
! [1 d- G, Q) i( Lscaler.transform(X)
/ i/ \6 f9 d6 Q" t: s#out:
{4 ~& T, p1 i J2 y& v5 d' Tarray([[ 0., -1.22474487, 1.33630621], 5 L+ M [$ P. o; W s) t
[ 1.22474487, 0. , -0.26726124],
, p. j$ m- Q! \. I8 H, a$ m3 I [-1.22474487,1.22474487, -1.06904497]]) * L/ r. W" }5 C7 x
scaler.transform([[-1., 1., 0.]]) #scale the new data
9 k) v% i/ V4 P, c2 ]# o# out: array([[-2.44948974, 1.22474487, -0.26726124]])3 n& ]2 k- r8 i
W8 F: a2 R+ r: j5 M! d# ^2 将数据特征缩放至某一范围(scalingfeatures to a range)
8 w% i0 B( V; m; S
+ |5 }6 \- ~3 [! c, O- ^ T* R i. m7 g6 _+ b7 Y: Z: f3 j
2.1 MinMaxScaler (最小最大值标准化)( }% H t) I4 m) U! h
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 ! U w$ U1 P1 |8 n% `9 y
/ Y% Q# w4 H" x' Y: _5 Z Z @+ t
from sklearn.preprocessing import MinMaxScaler. Q3 C$ p9 z+ m% h
x=[[10001,2],[16020,4],[12008,6],[13131,8]]9 @" I' z0 W9 u2 S5 A* I" w0 y. d3 z/ l
min_max_scaler = MinMaxScaler()' n9 F, D3 V5 g9 f
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
: T9 A6 ~6 ^. y; n2 M& b/ ~
" }' Q' Q) J# fmin_max_scaler = MinMaxScaler(feature_range=(-1,1))
" C- j& u0 t! T# m- fX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果 ~2 o8 n; R; e6 x! v% T, f {8 E) ]
* o5 y6 ~1 \- Q- e& ]
MinMaxScaler的实现
& I1 G+ E" S3 w$ E8 N( HX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))' @/ o) }( F: h0 v; v0 ~
X_scaled = X_std / (max - min) + min7 a/ g. G. }1 _% l; n! F
' ]* J5 q- \) a' h1 S' k* n
这是 向量化的表达方式,说明X是矩阵,其中+ _' C! k% _9 N, S6 f0 }% }1 l& a
! S4 h* H; ?4 s4 E0 J, {5 G
X_std:将X归一化到[0,1]之间" X3 p) x1 p1 Y5 A' x
X.min(axis=0)表示列最小值9 F$ s q( N) S) ^1 E
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
0 j9 a& M) ]' r4 G
, u7 S& X" ?+ l Z
. y: ^8 t @' U/ W2.2 MaxAbsScaler(绝对值最大标准化) |' ?" `# ~/ A' g
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
; y" P' h9 y$ |, {' h9 a, r% Q
) f* C( K+ ]# \$ p U3 y: a) N+ vX_train = np.array([[ 1., -1., 2.],( g0 N, ^, H/ t9 t) Y
[ 2., 0., 0.],: e9 L5 L0 d; S5 n. J* e9 a0 r
[ 0., 1., -1.]])
: h g' C, v% H5 _5 Nmax_abs_scaler = preprocessing.MaxAbsScaler()* g9 @/ V$ k7 k* t0 P% l5 L
X_train_maxabs = max_abs_scaler.fit_transform(X_train)" s! {: D- L8 X" a& ^
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])5 ~* U* k2 D$ x5 L; I' ^6 B: _
X_test = np.array([[ -3., -1., 4.]])* G! @* {4 ]/ w0 t2 ^) \4 J
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
+ L+ d2 k! D5 o# n# X( M/ zmax_abs_scaler.scale_ #out: array([ 2., 1., 2.])
) T1 w6 `6 y8 ^/ q0 m* P6 E; _6 g5 }- A
3 g5 E) N2 X8 W; d
, ?! `- C3 I& W9 z% W& D) i
: u6 f2 Z: o4 Z! l2 a
! u! s# m3 v' [; t; O' a9 U2 \3 g7 U2 N* c% {
' M' o% N- Y! h0 W1 Q+ O
+ m i/ T' X: N$ ?4 H
' N6 E, |7 w& q2 S: c7 U. S) |$ ?) K) v: d" D* q
————————————————1 t/ L1 p# R/ S( }- x
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ X0 Z9 I4 {1 ^+ `8 ]! l, z原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
% Z7 Q4 Y/ Z# ~5 i6 U7 f7 i3 t3 c" d4 ~+ K( I0 q" K& i
5 R$ i. u' h; W; O
|
zan
|