特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。 - M1 I4 S/ ^& a7 v- a3 I2 i* X+ g( E; A0 c: q( J5 n
当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler0 t V( v# l/ X! \
当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler- \- n4 C# [5 @
数据变换的目的: 6 c7 Z ]; q' H; [3 p0 q 对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。 ( j2 V% q, j1 W2 X: F " d; `. C4 e- m. I' ?# ~ 定义 : 设有n个数据的序列 ,则称映射 : [8 B' _7 W9 O % X8 P" P1 n0 a& R 8 J( d$ h) I. x9 m6 S- w0 _ 5 G# Y- Y3 O# y 为序列 x到序列 y 的数据变换。 $ I6 o# g: T* R. g: {3 t. m/ ?: [! I r x
数据变换的七种常见方式5 ?6 R6 @1 ? ~( G+ F
此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。. A' R* r; }$ p2 K8 p9 z
2 z3 ^- X& Y, C5 M9 p7 e. k. j9 @
初值化变换 1 v! {$ R, o2 O5 s+ P+ Q7 A& J1 N! o( L5 _- z4 o* P* w ) X; o% B) \! B0 ]1 K 也就是要对每一个数据,都除以第一个数据。 9 [: ~( }& h& h6 H: _' ~; o3 G7 X C0 V( U& f
均值化变换 " ^) Q+ R2 x: l5 G! N; y6 \" H% F2 r& d2 \( I. w! e , v! G: @. e: Q/ I; L! }
对每一个数据,都除以均值。/ C( U) B- @2 N
! b! ?1 U2 I) F& L0 P
百分比变换- B+ I" n. U+ u# M) U+ |
. v8 b9 u7 T& W& l/ W " y9 p" q3 z( c! B分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。# M, W3 k0 K. n& U5 R3 H$ L
. ^: W* L4 y5 F5 m6 r倍数变换 / n# L- a6 F8 F # W; g! J9 T, u5 Y% y G9 s + B# g. I- { A) y% }! |归一化变换- A# O6 g! W( O" B4 ^
5 z' @. W9 T; y+ f4 [6 ]9 U( X6 u3 m$ E3 d3 Y
其中 为大于零的某个值,称 是归一化变换。 ! I9 c/ |! I0 T% w J" c: B% Z `6 T3 |4 F" |% h) m6 n! Q9 x ! V1 [3 [/ R7 \4 |, l0 d r0 o极差最大值化变换. v3 J0 @& N4 m% y' E
: `8 k' X, M& F$ ]3 y5 a' R9 ` * w0 Z( i. s6 d' D1 D $ a; Y7 b9 Q' p3 K: ?# D( \ `0 P4 b+ O" c
区间值化变换 ) F. Q9 s- v$ `. e8 y 4 N& [! j" R( \/ Y, D 4 Y; P; c; W+ n1 q/ O; h9 N v ,. j. [1 v4 P' J( q; t8 ?. f
0 K% p. f6 {6 F
1. matlab 的mapminmax归一化函数 & \/ i. T" Y3 }' b: t+ I H函数用法:( h( m: Q, p7 o: {
[Xn,Xps]=mapminmax(X,min,max) 6 h B+ w. K' o+ T- b$ g, A& l. P* R+ G1 q% J# R" b9 u. j1 s# H* b5 }" J
说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。# E' w! |9 _! p( T p
7 {& u, G x1 E' I! s (2)min,max规定X的归一化范围,根据需要自行设置. s5 l7 c" u% r9 Z
4 D. }" @: s# T% d2 ^1 i$ n
(3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用 + e+ _8 L$ L4 |9 p% L
- Z" i8 M o& T# K
调用方法: 6 U) I2 ~; t! Q0 m0 ~" J; M: y- o- \2 c6 f; e9 c% }& N
X1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化 % G& O; ]9 _$ B$ ?4 }/ r- k( M& w
X2=mapminmax('reverse',Xn, Xps);%反归一化$ b; s# a3 ~ z8 B m
0 w3 Y7 N3 V8 l8 G7 l
x=[1,-1,2; 2,0,0; 0,1,-1]1 b# H# P% f& a6 x# ^# M
[x1,Xps]=mapminmax(x,0,1) # a4 @. c/ B9 Q" A' s 2 z' A8 z; i/ o + _( x2 \4 x8 d8 X 3 t" f5 ]4 e) I- ]' \7 v1 ~# |/ G: @1 u对于python中的axis=0 和axis=1的问题 ( W- ?- ]2 B8 R6 y4 | 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注) % {) f, f: Y! P- d换句话说: ) E/ W# v* g7 {1 Y $ u( F4 v5 q1 P' d" L使用0值表示沿着每一列或行标签\索引值向下执行方法 # p6 a5 Z* W6 Y/ J' W使用1值表示沿着每一行或者列标签模向执行对应的方法8 g/ p! X& r W5 F; u4 k2 ? 7 m5 z5 k' T; a& X- o# G $ l* F+ y8 m+ d2 G0 m; y. o, h- c- q- U
python的sklearn中 scale函数 ( k: i' |9 E6 F3 r h& s5 J1 标准化,均值去除和按方差比例缩放4 I! [. N( @; W, q B7 t" J8 W) N q
(Standardization, or mean removal and variance scaling) # N. B# F: B5 C 5 U+ P/ _+ Q: [" u, `4 x m 数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。 ) j1 ~3 |1 G" D( f3 r! G" J+ z" @% Q: B, \5 Y+ V
from sklearn import preprocessing ! ~) O, f0 v( a, w
import numpy as np 8 D/ e- d" V$ t- ^' V( }6 `8 j/ [
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) 1 @+ Z2 L3 t! [X_scaled = preprocessing.scale(X) & {/ f, X7 y- p% I3 ~ - N/ ]' d4 a, K+ A& C. p#output :X_scaled = [[ 0. -1.22474487 1.33630621], Z% T; }8 S0 Y% U5 |! o1 B3 u3 E
[ 1.22474487 0. -0.26726124] 0 N8 Z' H6 t3 [ [-1.22474487 1.22474487 -1.06904497]]2 ~2 u6 T$ K0 X# U; O( {
#scaled之后的数据列为零均值,单位方差 8 C2 }0 W- T. z/ X kX_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) 5 K; s( y% k3 n/ \ K
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])) c; x2 c5 G4 w3 W) W
k- C% @2 z7 W2 q, W8 X
9 a7 a" R7 ?! \ y8 |' ^6 i1 g% F
( {2 Z) l+ z, Z# u+ R
StandardScaler ! O8 G3 J* m7 f2 N( `
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)! q, o! x8 ]* G/ [/ r8 u