在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36355 点 威望 11 点 阅读权限 255 积分 13867 相册 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。% ?, l! X( T9 z% F$ C! P
# J& O) E. x. C
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
8 [/ t. U7 b' ~- q8 B6 E7 D4 w# x 当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
) K5 a) o2 _+ S3 R2 @ 数据变换的目的:. O' o1 {# u F" N) |: i
对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
5 _9 @2 s! `3 e) T; M8 r' N
" w6 u8 K, H. l0 l2 c$ l 定义 : 设有n个数据的序列 ,则称映射
% z; b- S3 Y$ ]2 N
. \: p; J3 g. F ?, b Z$ n( g 0 L. Z# f1 O, W! k. ~. e
3 k( W( z$ k2 w, o: `& w. I& ? 为序列 x到序列 y 的数据变换。 1 x1 Z! G( _4 x+ j0 L0 V* C: |
7 i' M8 O4 b7 Z4 ^2 g 数据变换的七种常见方式
+ m3 b5 f l; B7 y0 f" J 此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
# ~" `. Z; F+ v. {( m7 S7 j
. f4 `3 _! w( \) u 初值化变换- V- V1 E% I4 Z% o
# a& W7 s/ \: {4 Q6 f " {; `. ^$ \ i6 ]: m
也就是要对每一个数据,都除以第一个数据。. c" @& c4 z7 U7 k
9 N" L2 j7 ]6 e0 O, c. n, L. x 均值化变换7 k, Y' K0 K3 X' x8 @) Y
7 y& _0 @- q. o4 G; O
" G/ B2 g/ }: U3 y" ?( Q! M
对每一个数据,都除以均值。- |. i) N5 K7 J: r8 w
2 i& |$ e7 O0 O6 D% V, m" ]; I! f h 百分比变换- l* n4 x6 Z& f; f7 D% S5 n
5 s0 o5 P( {, I3 A2 N2 e
+ q) e( ]# t) A% L% o( `4 k4 n 分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。0 S# J! H, c i3 k3 E7 `
, p; Y6 C! e3 Y9 f0 T6 k# x 倍数变换
2 r( b; a9 b% ~, V 3 x% h7 @7 v ]; K* U: g; B
& t$ Y' y# p- ?1 }# ]; B7 }
归一化变换0 D2 ^ P* \# M* L, w) u! r1 m
: `) R+ h4 j' I/ |. z3 W `+ p
7 s8 \, [: f3 D/ L 其中 为大于零的某个值,称 是归一化变换。 8 d" Z2 v5 Q% X, J( j$ R" F2 @5 G c
5 j% u' _# v/ i/ V& w% ~- B# w
( t; b1 C( M$ B* T9 r# f 极差最大值化变换4 j3 n* F, r8 O$ i, B3 \7 M4 I" ^
* f4 W; e$ ?8 @! l8 B % k5 A* `8 i) j. A! j" A/ |
( @+ h& ^) Q6 P% _& P4 }
9 e$ l* n9 Q" M 区间值化变换
' Q% e, t% @) m, }
7 T3 s3 H6 H# X9 L) E- B1 g
0 D8 Z/ ?( [; i! |/ V; w* v ,
- L1 h+ N, I" f; \+ {; w% Q" A 0 t" b, E5 y$ q1 e' k9 O" R' I
1. matlab 的mapminmax归一化函数* R" z4 G2 ~; f+ `3 M
函数用法:
2 _0 Q* x* T- y0 r& D, P [Xn,Xps]=mapminmax(X,min,max)4 \: T" j3 a, b- f
e+ x7 Z; n2 v, C/ q- M5 B
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。
! H$ ]1 ?$ T Z$ S+ R
) Z% r _* {( i1 h- U (2)min,max规定X的归一化范围,根据需要自行设置
" _+ u9 H x, P5 t
/ {. f+ M5 G j! B2 T. T (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
6 x: \$ Y7 j( i6 \7 U1 g; o " P7 k6 n' i' d5 u; I
调用方法:7 Q1 {1 w1 B+ P, l
1 N* `1 ~+ n9 b: _! j' ]% ? X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化6 K! a! P; A' c ?
+ q ?5 j; g N8 s" N3 T* @ X2=mapminmax('reverse',Xn, Xps);%反归一化
$ z ~% o8 Y2 B- U 0 l% j4 Y0 U4 K3 P; J
x=[1,-1,2; 2,0,0; 0,1,-1]. m4 V) j2 Y5 {; q m+ a
[x1,Xps]=mapminmax(x,0,1)$ k1 X( x: a# X+ h0 K7 C# [( S$ c
6 [% ~8 t! `5 r6 r% Q1 P
2 A$ ~7 e' I4 m" Z: U
$ `' v6 S. r& C' ]( c8 U* c$ d 对于python中的axis=0 和axis=1的问题
! r$ c r. R7 b, E; K 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
" p; P: k9 Y: D8 C3 _( {8 [ \ 换句话说:
0 v5 h) b& T" W4 w/ x
0 I" D' y; A: Y5 Q2 ~2 H 使用0值表示沿着每一列或行标签\索引值向下执行方法3 q0 W3 @/ ^. Z/ d) c( P
使用1值表示沿着每一行或者列标签模向执行对应的方法
" t% l+ c7 }( M) D1 o7 | + O- @" d( h% z8 ?- W
& S: R2 a0 F" k% j9 ?
) c& P0 ?- ?7 u9 c. { python的sklearn中 scale函数
6 ~# O0 Y2 ?- y# I; T 1 标准化,均值去除和按方差比例缩放1 i1 [( d5 k6 }$ g; w {2 y
(Standardization, or mean removal and variance scaling)
+ c! m7 Q& L% ]! I7 {' {
6 P+ E* G- y0 `: R8 W; I* H$ g3 f 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。% z0 p w$ a \; q
* j8 R4 M5 Q8 s$ a
from sklearn import preprocessing 4 h5 y9 G: c9 g5 i4 P1 m- ]
import numpy as np
# z, o* J+ V+ x X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
# [' O. b% t1 O9 V& P. H X_scaled = preprocessing.scale(X) % |; Y% z; |* c& K+ R- w' J! ^
0 z% o) Y# x% W #output :X_scaled = [[ 0. -1.22474487 1.33630621]
- p o c5 @3 B/ g# b- q [ 1.22474487 0. -0.26726124]7 Y: E: a0 k8 |" r7 [; f
[-1.22474487 1.22474487 -1.06904497]]
# j0 A4 a' F1 s6 O% B7 u1 O3 N #scaled之后的数据列为零均值,单位方差
, ]) V1 z% E2 h0 l/ u4 _ X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 1 s! f$ J' t6 J9 S0 e9 g3 N* }, \
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
- y1 ^" x& T: k* a$ X/ ?" h+ w+ ?
. B* r- r! t1 x m/ C( p ! h: V/ v" @- @9 a; H" p. F
. r# ^# v e( p0 K
StandardScaler
1 V0 p9 {! F/ g Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
( p' M. u. {7 M/ O+ O, X4 T( k+ s # T# l5 a' n" Q
from sklearn.preprocessing import StandardScaler' O3 v! H! @2 E) h# ]
x=[[10001,2],[16020,4],[12008,6],[13131,8]]% u/ Y% N2 d5 Q/ h
X_scaler = StandardScaler()5 B' x: W6 v ^8 s* l
X_train = X_scaler.fit_transform(x)
/ ^ L( q# W4 j' _ X_train, V3 L% m& v; K. M2 g: x
#结果如下
; L' V- ]( `7 P) l+ `5 I array([[-1.2817325 , -1.34164079],$ q8 T3 p8 s q. q* N8 _
[ 1.48440157, -0.4472136 ],0 x- M9 T! E" b9 { f
[-0.35938143, 0.4472136 ],
o" c& _1 q! x3 J, l. }+ |1 ~ [ 0.15671236, 1.34164079]])
' V3 h' j- W4 j$ \! z
G& ?7 i8 y$ v ( m- L- f9 O9 ^7 w2 q! L$ m3 ~
3 \$ M1 s2 u+ I, u; }
注 :
若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。 scale和StandardScaler可以用于回归模型中的目标值处理。. e2 D/ ]& P, T1 |% u* Z3 q* V
from sklearn.preprocessing import StandardScaler' O1 P$ H4 @1 q5 \
x=[[10001,2],[16020,4],[12008,6],[13131,8]]6 A) t- X6 t# X5 B6 L
X_scaler = StandardScaler()
% J3 I5 ~! {, E! j X_train = X_scaler.fit_transform(x)+ B# `. Z5 H1 M/ C/ b5 p1 Q5 X
X_train
, d+ A4 r& b' b8 n #结果如下7 Q) U' w; p2 N0 \) S" Q" J
array([[-1.2817325 , -1.34164079],
6 E$ [. B- l3 ]/ U [ 1.48440157, -0.4472136 ],
j, q) k" m9 ?, w# e [-0.35938143, 0.4472136 ],4 ~0 Y# n( K, x( b. ^* ]( g
[ 0.15671236, 1.34164079]])+ p- k3 m9 `( @, P% V E
' d* V2 e( q j scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
, L) {( ]! e5 ?' o3 r, r% O. N' b scaler.mean_ #out: array([ 1., 0. , 0.33333333]) 2 p( u% l4 b1 E8 G" `
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) 9 X7 f' Z% ~$ n; g+ k! }/ a
#测试将该scaler用于输入数据,变换之后得到的结果同上8 T8 s! Z! S* \ S& M& A: f- z. ?
scaler.transform(X)
3 Z. r/ J* f: ~! k5 ] #out: # e9 ^$ H4 Y5 E! J9 _
array([[ 0., -1.22474487, 1.33630621],
7 A* [; `+ u- b+ C. V [ 1.22474487, 0. , -0.26726124], . [1 \ h5 i$ M% e: q, Z/ O$ D1 h
[-1.22474487,1.22474487, -1.06904497]]) - _1 H+ Y- V7 R7 U* l
scaler.transform([[-1., 1., 0.]]) #scale the new data
2 w. @* C* U+ g # out: array([[-2.44948974, 1.22474487, -0.26726124]])0 y6 O& l! \ R6 C# K& G c
+ H. @& `# G$ \ z8 s, w
2 将数据特征缩放至某一范围(scalingfeatures to a range): H- ]9 t% P$ v( h
' Q' F* B, k5 I; |; c+ w + Y0 W& p& N3 W; d/ @! |2 |
2.1 MinMaxScaler (最小最大值标准化)8 r4 F+ S" W" k3 u. [
它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 ; ^& k- b9 ?2 j g r
6 a9 P" _( { M! J8 r2 u
from sklearn.preprocessing import MinMaxScaler/ p4 E( N9 |3 S5 w* a7 v9 M) |7 Q6 K
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
, U# Z5 `4 L/ {6 ? min_max_scaler = MinMaxScaler(). W4 o' |2 H( l } @
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
* G# |9 k1 N0 E, o* Q 4 c/ W' q8 L- d% U5 V# \) g4 V4 b7 R
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
2 t! e8 j5 _0 n7 U X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果$ e% `) M3 k Q2 f4 F) Y8 p
% t' W+ |- B% T! u2 b9 K MinMaxScaler的实现
2 M5 C+ {3 V. w/ m' M, K, _ X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
" Q9 [, K, i) K1 o/ c& K X_scaled = X_std / (max - min) + min
! g9 `7 P8 D4 k& H& U 1 e& d7 L7 J1 k/ P
这是 向量化的表达方式,说明X是矩阵,其中/ D3 U- p0 \, D- Q# F( [
! m; t# X; j2 M. S- k U X_std:将X归一化到[0,1]之间
0 X2 |" b' G( q: j+ F X.min(axis=0)表示列最小值- |. g# R4 z. `: _. m5 H; d
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
. p5 y( T7 W2 e
: j+ o& M- I& f) Y4 @ . q1 O) e* |6 g; ~1 Z* }4 J! w6 q
2.2 MaxAbsScaler(绝对值最大标准化)
$ u# f! Y: `, i% Q) H0 |( p- U' t 与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。* R! {5 k% d8 t6 T0 Q1 @
2 t" X$ j$ k- o$ x$ M' Y
X_train = np.array([[ 1., -1., 2.],1 m% Z; {, V% o8 v8 a$ p! i5 Z
[ 2., 0., 0.],
2 x3 N- t1 \ W [ 0., 1., -1.]])1 t! c7 k- l9 N+ x' [
max_abs_scaler = preprocessing.MaxAbsScaler()
7 O- q/ f6 E# Z' e0 q X_train_maxabs = max_abs_scaler.fit_transform(X_train)
% `' ?8 [- i# `' o* j: H" ?( P* Z # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
4 ]7 y) M: Z- `" t" u+ @+ H X_test = np.array([[ -3., -1., 4.]])3 U5 E4 K- t1 @& P4 {
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
; d+ _0 v9 `/ i, a Z$ L max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
6 W- T1 X) x+ E7 C
: `* \: N2 o0 h+ A
/ M: r) O' F/ Y6 c9 g
# O' Q/ g; R) _ % t8 f4 Q) |, \( N! p, q1 I& e* Y
( y& I. T6 H0 h: ~1 A' n N9 [
2 I" {, N; K ?+ R3 e$ M, N
9 g9 A4 ]8 _; e4 s2 f8 ]
; o+ v9 j. }, r- t' ~ ( t1 y: Y# s1 |# P
+ T9 c* M3 N! V. m ————————————————
1 B, j+ b6 O- x1 g 版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( }: F" h$ e# k% m
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
% { L# y: @- p$ u0 N1 j6 k
8 b. ~( {: `9 n a+ R$ a1 F
6 f+ g; U- ~$ F9 \3 Q& u% L
zan