- 在线时间
- 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。
. X" M; B* W% y* x0 |- T7 k- {" h
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler6 R* H' _$ f/ g7 y0 b
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
/ V; `9 o0 w8 e2 F K4 y数据变换的目的:# `0 `/ v0 E K5 L# P4 ~
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。+ p2 K" X: ?/ g7 J: T
1 ?8 s$ d) D L* T6 H2 O
定义 : 设有n个数据的序列 ,则称映射% j( |. M, v* E5 K" ]9 G
% ~5 Y; d) S- l 1 C2 I) \) L* L3 |4 a
+ j) ]$ X q6 r& k
为序列 x到序列 y 的数据变换。 ! z7 K% b1 \! o% r8 |
1 u* G1 j9 {, f$ ~ ~
数据变换的七种常见方式
, O- M' }) t3 l此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。) L+ U0 c8 W! w6 s5 }5 [1 z
9 L+ @; q: N6 ]3 d- y v; T& u
初值化变换
+ Z5 i2 g0 ]* q ^& U1 x$ P
* z2 U8 s8 d* h) v6 ~![]()
! G3 f, K3 n& z 也就是要对每一个数据,都除以第一个数据。+ S# l& c4 |. U6 Y% W2 A! q# D* \
4 l% _" R; W2 U1 l' |6 K" N8 k
均值化变换
# w+ z! H3 Y) V
3 M' |% G) d6 h* d9 G 7 u- {: S& c8 b& C
对每一个数据,都除以均值。( w9 n8 v$ K3 N
: W0 r0 [$ R/ V/ a$ t* ?- B
百分比变换 W/ J3 a1 ?# m) u; j
: ]. f# f4 }( q0 t5 ?
![]()
8 F# A3 d. c/ w5 O/ s+ o分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。) x7 [3 y7 v# a
7 U4 u# f' E3 H4 E4 W) n/ V, p# Y倍数变换0 B6 c# H4 Q9 c8 T6 q; B. N
1 w: j3 w! p t- @
" t, x: B8 n5 [
归一化变换# p- y$ _! A) j- ?& \
! y- C8 q7 p. a
![]()
. Q7 |0 z$ V# G9 o I8 j 其中 为大于零的某个值,称 是归一化变换。 A* N" }( L; ?$ i) A1 d4 X( Q
/ _* p/ j( G2 w( s
- e- `# n5 R! s; [1 W6 `) O极差最大值化变换6 p9 a9 }5 q( x) j! S
: v; u% K3 }+ c$ h
![]()
* o7 T" Y$ ?. g+ X* s2 N3 G& q7 @* M# r& b4 z- A8 }
1 Z( @& S1 e: E$ V9 M. m区间值化变换& M2 t/ f4 \) U8 V; p& F
Q F2 F7 g4 A& Q: ? * A( H- v2 b- T& d8 D' J3 y
,+ s0 \9 J! e/ @5 B4 s. f
: F* h# Q0 ]. K$ ~/ J' _1. matlab 的mapminmax归一化函数
; K0 K- k8 B$ |7 w8 I* m% y函数用法:
% F7 N/ _! K* y9 s [Xn,Xps]=mapminmax(X,min,max)
. v( o# B5 H- d+ e) u) o. U; ~( r) K8 w# Q- u
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
# b* U9 s( c0 F* J0 A8 U$ d9 O0 |/ D2 G1 T' q
(2)min,max规定X的归一化范围,根据需要自行设置
# W: t. L1 Z6 P
% t# R0 _) C( Q: }0 j2 s (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 % u0 D% i; V9 i* _; S {# H: y5 p7 D
/ t, h% p* g: ^! E 调用方法:6 @: s/ X$ o5 T$ }9 u. F. T
_1 F9 h9 K2 J: ?! {9 H
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
6 g$ l3 O1 A7 ^
6 r7 Q2 \& q8 m2 Y! oX2=mapminmax('reverse',Xn, Xps);%反归一化
3 A5 D) f2 ]7 s1 X3 D+ J8 b" v: N& ^* y; ]. J+ F# q' q
x=[1,-1,2; 2,0,0; 0,1,-1]( q# W# T" l6 ?6 ?
[x1,Xps]=mapminmax(x,0,1): K) A! Y6 O- q- l; h
5 l( ^1 Z7 D$ W+ y% N
1 R& J0 R7 w4 ]5 d: l, l" r8 \: s0 }+ H4 X
对于python中的axis=0 和axis=1的问题
) f- g. @8 ^$ T7 r8 N% ]% `$ t 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
5 O7 j& C: |; }& \% E+ I# x% L换句话说:
2 B6 B9 B6 i- r, q$ i3 J% d+ `$ R- }$ K+ n
使用0值表示沿着每一列或行标签\索引值向下执行方法9 ~( F s) x" x! v/ R/ r
使用1值表示沿着每一行或者列标签模向执行对应的方法' u0 |+ g, }7 A" U5 M: G) Z$ B: a
$ u9 ?! ], y0 D" \4 R8 c; O
- f' P O& D' i. ^; v7 ~. U
0 P* d4 a. [7 \0 t7 X6 _* B, v$ fpython的sklearn中 scale函数. K. ~' S( N/ c) R" @- ~) S
1 标准化,均值去除和按方差比例缩放) q1 r, J# H* a* i2 d
(Standardization, or mean removal and variance scaling)
& d7 T" x4 ?1 @8 f/ ]& f
3 E8 [- ^$ H. E 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。3 L5 X& m t8 }% g, J$ G
9 w( s4 p2 P8 V( F8 g3 ~! n
from sklearn import preprocessing
! F2 ^* y& ~( R/ K: v# {import numpy as np 0 M& P* q- V* i/ w
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
: q6 N) r5 T' B& n* E' _6 Z0 [X_scaled = preprocessing.scale(X)
7 ~. t3 z5 _2 U* } Q4 ^+ S- r N* X. R! ^, d
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
4 Y+ _; W2 R$ E4 ? [ 1.22474487 0. -0.26726124], g9 \6 l) }1 D" A4 V% P$ i+ k
[-1.22474487 1.22474487 -1.06904497]]
8 {$ q- \5 m! c3 O#scaled之后的数据列为零均值,单位方差
! D7 e! X/ q! {) k1 o2 D3 fX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 2 h- q0 h- T2 W g5 E$ l
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])1 x1 u) b3 W- n2 y4 u# U/ ?0 i
) `/ v& ?2 J+ B9 _) q/ |% i. e5 |# a4 e; P, \, O
! v% ~7 n+ ^+ x* y! ]
StandardScaler
- `" l: @8 E$ j! ?; Y6 s6 TStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)5 E3 W# V! N1 K- F5 I& I* b" u
) G/ u% J* j/ ?# n/ V% j# G/ _from sklearn.preprocessing import StandardScaler
3 G! o7 o2 G. Q! r7 A! K6 m. mx=[[10001,2],[16020,4],[12008,6],[13131,8]]
: v: V% B8 M- |# b( P; p f wX_scaler = StandardScaler()2 m4 k: y9 T. J8 Y
X_train = X_scaler.fit_transform(x)
( b9 U4 m- a7 xX_train F" N* b& ]/ F+ |! Q, M$ B
#结果如下
) L- i3 t H% |' narray([[-1.2817325 , -1.34164079],
3 L3 ]' E/ G( P7 H2 y1 `2 I' ~ [ 1.48440157, -0.4472136 ],
- ~ |2 p7 U; Y, Q& l [-0.35938143, 0.4472136 ]," y1 Y+ o5 z8 [
[ 0.15671236, 1.34164079]]): B/ O: w6 W5 _& J. U
# S4 K. E; V, t
1 r, p7 p. l: G* M
8 D) L( n5 f T# R6 {% |4 h7 x注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
; D8 b2 p7 {$ c) X6 Y/ m6 } from sklearn.preprocessing import StandardScaler
" ~$ @5 u$ f! i: d# Ux=[[10001,2],[16020,4],[12008,6],[13131,8]]
7 \& N# |& T5 s9 s4 E0 D# VX_scaler = StandardScaler()
! I/ m$ O5 m- g+ D0 {X_train = X_scaler.fit_transform(x)# ^& R# f/ G- ^1 ?! _
X_train
8 l, F, C0 [1 N L1 f#结果如下
! i/ A) W9 ~! m6 Z8 Marray([[-1.2817325 , -1.34164079],
6 Q" T1 s5 x% ], l [ 1.48440157, -0.4472136 ],& l/ o9 I2 ]' A0 u: o* L9 A
[-0.35938143, 0.4472136 ],! J8 K" v {! Q" A% V
[ 0.15671236, 1.34164079]])
4 U" l0 @4 n) s9 s- G5 c
V, {# @# D, t; F: [1 oscaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
" Y, B: G( `$ U0 z) nscaler.mean_ #out: array([ 1., 0. , 0.33333333])
|6 g/ }6 b$ }5 V9 x. [3 Fscaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
, k: D" x$ z; K) P$ w#测试将该scaler用于输入数据,变换之后得到的结果同上 D3 a# Q. l V/ T6 @2 @+ y" q
scaler.transform(X)
9 F6 a1 f6 ~) l, z' e3 K0 O* \! u#out:
% Q8 {) q$ O [. L+ _* X harray([[ 0., -1.22474487, 1.33630621], / x1 J9 P; K! w/ B$ D5 m
[ 1.22474487, 0. , -0.26726124],
& U5 `7 [, Z4 ^2 E; n1 j [-1.22474487,1.22474487, -1.06904497]])
+ b( N0 |" [0 a, i6 g6 R9 |% h" p# _8 m7 wscaler.transform([[-1., 1., 0.]]) #scale the new data
/ R) U. E+ N7 x* i2 _# out: array([[-2.44948974, 1.22474487, -0.26726124]])( A7 v2 Z2 g+ H3 u' G( q
8 {2 i% @3 f9 C9 Z1 P6 _2 将数据特征缩放至某一范围(scalingfeatures to a range); h$ d& w5 U* M' L' g
4 K/ _9 h/ \) C4 f6 s+ Y
) V& u9 i$ a# `% q( b& j2.1 MinMaxScaler (最小最大值标准化)$ `2 Z' O# E1 l. f0 d6 Z' T
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 ) `8 f4 G" w" T+ t+ ^
$ m# q+ U- T+ }& p# V$ g0 V$ q& z+ ffrom sklearn.preprocessing import MinMaxScaler# l& f& Z0 ]+ R0 S- U6 {
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
* P% |: J* D# S Amin_max_scaler = MinMaxScaler()
M8 F& }* O" E9 K' VX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
) ]& p: P G0 n9 I$ ~' ^: |" M7 c5 V- `
min_max_scaler = MinMaxScaler(feature_range=(-1,1))3 v# m3 `. ~. J) F W& F- a6 z
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果4 b$ h0 |; e0 h" ]1 P
+ _ j' Y2 K0 V* X! C7 w
MinMaxScaler的实现
3 K9 r' E" } n; B) j7 I- MX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
/ q5 g6 V8 ?4 q, ]% C8 rX_scaled = X_std / (max - min) + min
1 d q1 G* v0 o8 T- U& _ q s8 D
这是 向量化的表达方式,说明X是矩阵,其中
! a& d" V ^* H$ U9 M' I7 y
j5 V' j- c" b: h4 I9 f* JX_std:将X归一化到[0,1]之间
# k+ H- X* K. cX.min(axis=0)表示列最小值% P; F9 y, ] X2 x! `3 v) S0 P
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
# O+ u/ h, R" u% M! ~: x
( j8 ~& J# m% }7 O* F6 |2 t3 k
& w9 b1 u4 d4 J- f0 C2.2 MaxAbsScaler(绝对值最大标准化)
% `7 P' `* H$ g) m 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
0 ~, }4 g- G" {3 U: j" d9 I0 ^& I
: T6 _8 I0 Q. i& BX_train = np.array([[ 1., -1., 2.],5 C' j6 O% W9 @& {3 E# u) |
[ 2., 0., 0.],
/ Y- z8 h+ `8 J8 a- T [ 0., 1., -1.]])5 B6 {+ N9 @9 j1 Y: f) A
max_abs_scaler = preprocessing.MaxAbsScaler()- N9 O$ d* p! ~+ X6 g o
X_train_maxabs = max_abs_scaler.fit_transform(X_train)- ~2 J3 j- V( n& x' Z
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])+ L- o( \: G1 h' c! ~% Y; M
X_test = np.array([[ -3., -1., 4.]])! `, y' t& X9 \* U( ~( s
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]]), S' ?" A- k: w: C; {- P% g
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])" z3 {* P3 @! b7 v" s1 v! N! P' v
! s; l3 o( t- L. y% w7 L' h4 E* L4 A5 H+ m0 S* Q; o+ t/ h7 b
& l0 x3 g1 ^0 F
& h! r2 R8 o2 U6 n/ r
5 _2 D( \2 L6 W! Z2 ~% ^$ C( D( m" J+ o: q8 @$ r) U$ e
6 A3 M4 k, H* @4 x$ ~
( }, @" X" [; v' J' o6 C$ p
8 h. V" b# j- n% P9 o! n
" ]/ P# Z1 t7 `
————————————————5 ^/ v3 |1 B1 e4 W/ t
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 R% p. ` n& `2 L# N. L0 m8 M原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
K3 ]! H$ U$ o5 T- R
6 R* H# S2 l$ w+ h3 w5 [, v: G& H4 t: f4 c Z! V
|
zan
|