- 在线时间
- 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。- M6 ]. Y! _) c' X. F# O% `0 L$ g
: S5 s- f8 y3 y3 ~( s当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
. S: y: Q J% }/ F }3 j, s+ M7 {当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler
0 i2 a9 @% W! m D1 ^1 K: S" G$ l数据变换的目的:
4 `2 ?4 X n$ g9 b 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
" K8 B& k! e* x' b2 w1 Y3 R( b/ ~& Z2 @% @0 i* e0 b
定义 : 设有n个数据的序列 ,则称映射
7 M/ ?1 ~* w# E2 u8 g
: B$ X6 o# ?: f* ?1 V3 Z# y- p$ [+ } 4 U1 @; d( r- L0 q8 ^, i
" Z- m; Y/ U8 L7 s/ W, p6 o 为序列 x到序列 y 的数据变换。
1 T8 V2 @ \# a& @
- F4 b( y1 S2 h) O数据变换的七种常见方式' i4 D( k; z$ R1 ?9 V: R$ P: [7 N
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。
/ S$ z' R+ _# p
* U2 m; K# m% W/ T1 N0 w1 i初值化变换1 s2 X, Y* ? |" G* c* f0 o
( L5 t% X* `8 {8 |. N9 L* { ! F2 ^2 y% @& `7 e
也就是要对每一个数据,都除以第一个数据。
6 M% E+ b. X$ M" {) \- i' J* l( O5 h: m' r6 f; E, A$ n
均值化变换7 I) x C3 H& _/ n# W
# g% `6 i; X! F/ H7 ` $ @0 \1 Y5 b9 X6 T# e y. q9 s
对每一个数据,都除以均值。* o6 J" o0 W- y* T4 T P
& R0 w. C' L6 D
百分比变换
% \7 Z# `- [5 m0 D0 R' W) G8 \( Q; h1 j" E! G. @! Z8 Z" b
; n: o6 `" w5 C) C! q
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。0 Z J8 p, {" i0 a( w \ ~" r
) v3 K4 ^3 u7 c/ ^
倍数变换& {) w0 i/ Z8 ~4 `* e, D
2 B f" |/ R! P7 I: ^& x, @
1 q7 Q4 \- s* \2 a O! v归一化变换0 b8 T% G0 j" W+ K# A. y
8 W6 c3 S2 L' Z5 I
![]()
$ |! E! l U' T0 v! O+ h9 t- i" u 其中 为大于零的某个值,称 是归一化变换。 3 C. y9 @5 f% J- N& _5 u# p2 }- U
. {; V: K3 }0 J: o% S
* H$ O1 U4 P4 H$ N8 v. I: c极差最大值化变换
/ j% R' D# \9 y5 x0 q1 k
8 }0 M% f1 \; I+ n8 G# f5 W![]()
5 D" j' N" E6 M& c' w5 f' U7 M# |- H6 h+ e7 m7 B& t( }0 [6 h5 C; {
) X9 M* i* s8 S4 o5 Q
区间值化变换
2 \! q# `" `4 c3 F! K
. U: D( X, V# `7 {) t![]()
B( @( v8 m3 o7 _ ,
7 g1 U. d! h/ e. d6 W. q4 `+ |3 g
7 O! T8 I$ M& }4 X& M: Z+ d1. matlab 的mapminmax归一化函数
* N. Y; [1 x* r# s/ F" l函数用法:; S. z' M7 A! \
[Xn,Xps]=mapminmax(X,min,max); P( Y) c6 A/ Q: M3 E3 c# V& J/ c3 J
* w8 ?) r( T0 o' A2 b# W
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。) Q* l3 d8 P0 P% y
; ^5 j ]# X, A9 ^+ C
(2)min,max规定X的归一化范围,根据需要自行设置
) j& H" S6 n; n, {! W$ h
# h! F& X1 Y5 O& c2 i5 ^ (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用
, _1 X1 U$ c, _' i7 x5 z: P
, b3 N! [$ G1 N! u3 s 调用方法:
8 C4 ^3 R9 F6 r+ [. ?+ B
. X W; b2 Q! ^' ?3 {) EX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
$ Y9 Q! {- D* s* |- j5 h9 [/ N+ C) u3 ^- U4 r+ @/ U
X2=mapminmax('reverse',Xn, Xps);%反归一化
% @ K7 {* @) g+ P+ @( Z; W* U/ J6 s# g
x=[1,-1,2; 2,0,0; 0,1,-1]0 b- Z2 B! p1 D1 n% }& T
[x1,Xps]=mapminmax(x,0,1), C" c7 C- g5 w: w) Y
5 ^/ S) n; e9 u# a) f
+ }; ~4 X( n: X8 B! U2 w( [- C% j1 w
对于python中的axis=0 和axis=1的问题& x+ c+ z8 Y- n$ z* l
如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)
; I7 Q s2 T! b% R换句话说:
+ ~/ x* z0 z4 c3 g8 `9 {
0 a0 x8 `& ^- F5 ^使用0值表示沿着每一列或行标签\索引值向下执行方法
8 P) t4 `, e/ ]3 ]& F/ t o8 J使用1值表示沿着每一行或者列标签模向执行对应的方法
2 K% {6 @: H2 N2 v" S![]()
4 ]% Z* _9 z( `# @5 m
& G" b% @0 ~! ]8 p# u& W. S# U, D) [# x- [2 N7 o- p4 V( N
python的sklearn中 scale函数& m$ q0 P' a) @5 S. P/ ~0 s
1 标准化,均值去除和按方差比例缩放
7 q4 i* M$ V7 j9 |+ v% L u& l) @ (Standardization, or mean removal and variance scaling)
. L8 x ?/ |; w! M K9 E7 L7 R- `) S* N0 d. X9 {" f8 r! T
数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。
# [9 ]2 x7 x; c1 r0 s3 J6 ]
; h2 \: }% s! T: |- H6 z" }from sklearn import preprocessing ) j6 D, ]4 x+ @; j/ @$ a
import numpy as np V8 S- U; T# l" g0 j2 U. i
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) 2 {) v0 `5 @( z
X_scaled = preprocessing.scale(X) - e# e; }% J/ \% H* e1 c4 U
' ?6 D X. X9 L+ U) Y
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
/ ?+ Y$ c, j: |7 x; X, M2 M [ 1.22474487 0. -0.26726124]
1 ^# D, L t$ D1 J2 y1 P [-1.22474487 1.22474487 -1.06904497]]
0 w: |+ V# Y* j& i#scaled之后的数据列为零均值,单位方差! k" a" l/ N, G$ X F' ^6 A
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
0 g0 q; E4 F+ }* {9 fX_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
5 ~8 a" @5 L+ f- d, M4 G6 R( ~
f( F) m" h' A2 v
' G( `- o& m' Z6 k. `
StandardScaler
" f+ k; D' w f% NStandardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)
, [# o b4 `- K+ u; K- t- Z
: R; i1 m8 }$ ?! e! }5 V8 x- c5 }from sklearn.preprocessing import StandardScaler
p% v3 s O' t% o# Q2 bx=[[10001,2],[16020,4],[12008,6],[13131,8]]
2 Y; ~! a. J0 ^% zX_scaler = StandardScaler()
# w Q' i1 w6 h: K$ EX_train = X_scaler.fit_transform(x)/ k, s5 \' K: }
X_train. w( l( v4 ]1 L4 i( R% N8 r
#结果如下
7 ?3 q B% k/ ?* J$ e# X$ i' Zarray([[-1.2817325 , -1.34164079],
( S/ _/ T% D) D# C [ 1.48440157, -0.4472136 ],
* ^7 t, O! @' X. `4 C* b [-0.35938143, 0.4472136 ],
7 a0 Y; d8 }( [$ P1 H [ 0.15671236, 1.34164079]])8 [9 x3 G& r/ ^
6 K! P5 J4 Y: g3 x* Q( S4 W4 e) v$ ], G/ R7 K7 n
0 G/ B% K* x8 W; l
注 : - 若设置with_mean=False 或者 with_std=False,则不做centering 或者scaling处理。
- scale和StandardScaler可以用于回归模型中的目标值处理。
( Y( U1 b( w7 W) o% E! O0 x from sklearn.preprocessing import StandardScaler: n! J/ _) L" J: h& U6 o( F( t" C
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
6 ~6 a" T( u c. \# G2 b; NX_scaler = StandardScaler()* y$ c1 |, W9 R- ]
X_train = X_scaler.fit_transform(x). Y* A& Y" v c4 O2 @+ Y: J: l2 h4 g
X_train0 p3 _4 ?* D3 U
#结果如下0 K6 M* ?- E0 C, W2 X' d
array([[-1.2817325 , -1.34164079],
% i8 R# d* P* p7 y- c [ 1.48440157, -0.4472136 ],
( B1 A. t( I! i+ ` [-0.35938143, 0.4472136 ],
+ A# ~, {* P# T6 ]$ D [ 0.15671236, 1.34164079]])
' V+ [: H% D' y( _
: ~+ {: A+ [0 Y- N( ~0 F- |scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)8 R9 D& o8 t# P& `, b. ^, w8 K
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
# A9 b- Z% F; Z2 m8 u! D8 lscaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) P p1 P$ T0 E8 ?. f8 Q
#测试将该scaler用于输入数据,变换之后得到的结果同上
0 R( c7 S3 `! S/ a2 bscaler.transform(X) ! O0 b7 o/ ^5 G: @* c
#out: ) l" L( g/ T8 M2 @2 E! |4 O+ R
array([[ 0., -1.22474487, 1.33630621], ' e9 h: @5 M5 v2 v, D. e
[ 1.22474487, 0. , -0.26726124], + U N! A" S) P3 [8 ~# b
[-1.22474487,1.22474487, -1.06904497]])
/ g- e) }0 X0 l8 S- Nscaler.transform([[-1., 1., 0.]]) #scale the new data
* b5 p. g# ?6 ]$ ?# out: array([[-2.44948974, 1.22474487, -0.26726124]])' u' S$ B* X1 I- h
; t- Z _4 M" a+ H2 V+ R3 E
2 将数据特征缩放至某一范围(scalingfeatures to a range)
: O' E l. ?0 Q1 x8 S
& M3 V) a6 n+ A, z& |. ^6 A' w+ f: g
) q1 @# c/ B6 @* A2 r! ~2.1 MinMaxScaler (最小最大值标准化)
9 W: b/ E5 y# r2 Y f 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。 / G! [3 {. Y) J: i/ G" l
" _* C1 x5 \: L* T
from sklearn.preprocessing import MinMaxScaler
: M7 S6 r: i0 ~$ Nx=[[10001,2],[16020,4],[12008,6],[13131,8]]
! i2 g/ M$ H! emin_max_scaler = MinMaxScaler()3 m! ]0 j$ c v0 q/ v* x
X_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,
6 g% b( Y* ~/ S( v. X7 n) C7 O' Q# l) {; t2 P) P
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
' k5 h( n" _. i! ?0 _' O8 wX_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果
8 {% W6 q! N& [% P3 }
% J0 K' u% X( V) I. K) T7 IMinMaxScaler的实现
% c' q8 D! t, s+ l5 tX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))9 B# r( J4 ^' \ ^9 m
X_scaled = X_std / (max - min) + min( x! _" G# a3 S, z% u/ P, H4 Y0 n
. q/ A- y4 R3 ]) e
这是 向量化的表达方式,说明X是矩阵,其中
! z9 x% _& {! g" C% o
; X7 n2 @( {8 c4 f0 R' N6 l8 aX_std:将X归一化到[0,1]之间
6 @( ?! ?9 K3 LX.min(axis=0)表示列最小值1 ^( V, ~% P" I
max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
- p. h1 q3 n1 c0 J1 w& m
; N4 p' h" ~2 R9 ^
" v9 W; c7 x5 a2.2 MaxAbsScaler(绝对值最大标准化)3 G5 P; z( |" z) Z1 l8 N' T/ f i5 s
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
" Z" g* v8 i5 X
8 O% v _+ Q: l2 WX_train = np.array([[ 1., -1., 2.],* f% q9 F; G9 ` G
[ 2., 0., 0.],+ }7 L5 p( C$ R. e- W8 _& D
[ 0., 1., -1.]])
( y, Q6 ^9 Z- ~max_abs_scaler = preprocessing.MaxAbsScaler()
/ P' d/ t; Y3 PX_train_maxabs = max_abs_scaler.fit_transform(X_train)
2 b6 d6 t7 t0 D0 o' ?0 U" ~4 l# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
) D: h$ A5 Y7 S9 K2 yX_test = np.array([[ -3., -1., 4.]])" Q0 v6 j P; V* Q7 ]* N$ h' G& [
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])7 Z! A0 p7 s8 b5 S' y
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])$ v' O" [5 Z8 N8 S
9 z* ~: z, r/ Z9 C9 ~1 B$ U! Z- o8 G \
2 h# g0 g3 }2 k& x# V) x2 F
- w$ Z, Z6 B& d ^+ f, s* y
# \8 W3 j4 I9 Y9 [' K+ r* u3 V0 Z: a: N. w( ~; U( ]
/ R1 z9 Q: g6 g1 w4 z
5 {( S/ q* [" O i3 l$ |$ _8 F
I- N% e1 q! a1 w% t/ d0 X- c0 T
. W& Y. c2 i% A, B* P9 ~* S1 `————————————————
; R4 d4 r0 M4 Z版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) d! C/ I0 e$ K, p3 @9 ]. M0 k原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
% E+ j% W: `# m* E, u
) [ u2 m0 ~& n# X1 N( i, |: g# \( M3 I) d" h" Y/ `$ I
|
zan
|