|
, H: v* G2 G# s9 Y sklearn Preprocessing 模块 对数据进行预处理的优点之一就是能够让模型尽快收敛.标准化和归一化: 8 u% v* {0 v4 i& s& i
归一化是标准化的一种方式,
L8 q% C+ V. _ 归一化是将数据映射到[0,1]这个区间中, 6 \; W" r, a3 Y: q
标准化是将数据按照比例缩放,使之放到一个特定区间中,
# G4 V4 Q; G* k! T* Q6 r8 T 标准化后的数据均值为0,标准差等于1,因而标准化的数据可正可负. / V$ ?% D' K: a- h+ {) Q' ]
如果原始数据不符合高斯分布的话,标准化后的数据效果并不好.(标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征.)
& n# r2 C, e, e! c0 _ 导入模块:
; V, W; i/ i9 T' D- L from sklearn.preprocessing import StandardScaler
& u/ d' ?9 |$ n2 | from sklearn.preprocessing import MinMaxScaler% ?7 B2 S" m2 o7 i; ~! H; v
from matplotlib improt gridspec) v B; A; V3 d; d
import numpy as np I7 u' x; }: Z7 o( x- {
import matpotlib.pyplot as plt 5 }, I" r6 A7 U& q5 t2 G6 I
使用sklearn 进行标准化和标准化还原
! F* @9 a& i- F9 ^4 A8 ? 标准化的过程分为两步: 去均值的中心化(均值变为0);方差的规模化(方差变为1).将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的x_scale = preprocessing.scale(x)
. i) P1 G, N# J std = StandardScaler()
+ _3 x0 Y! [8 }8 F0 L data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]])3 ?4 v5 s+ D) z- h7 O- q0 @/ n
( @" Q9 E5 u, N" C% W5 C) d' v # 将标准化后的数据转换为原始数据。6 ?/ k8 U5 @7 {+ u
std.inverse_transform()
6 b4 d7 s7 @' _3 v$ ~8 } 查看标准化后的数据的均值与方差 + b% w2 h( y9 q6 \6 P! x! B
x_scale.mean(axis=0)# 均值
% E0 K9 O8 s; U( J2 r # axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作 1 \7 _7 P1 B- Z1 ]% g* D; x3 u7 [" i# Q
x_scale.mean(axis=1)
: e# @1 H) E* [8 s4 ^* i ` 7 | |: U( h$ u( M9 _$ z9 J: V
cps = np.random.random_integers(0, 100, (100, 2))
& u) Z$ `% S9 X4 u5 C) v # 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集., N( U: f N4 m4 `5 ^% i0 V
ss = StandardScaler(); j- T# k- u2 k$ h; k) B3 M5 R
std_cps = ss.fit_transform(cps)3 }& j+ o' d5 Y/ ^ P! f- i
gs = gridspec.GridSpec(5,5) ~# m" t, N; [, J% R4 I) `# U& ~
fig = plt.figure()+ L* L' ?. U2 h
ax1 = fig.add_subplot(gs[0:2, 1:4])3 u) b0 O4 W Z" r$ O# X- h6 V2 l
ax2 = fig.add_subplot(gs[3:5, 1:4])( P' j( I6 L! ]- H! V
ax1.scatter(cps[:, 0], cps[:, 1])
8 R& L# v A# i. A6 W1 h# [3 Q ax2.scatter(std_cps[:, 0], std_cps[:, 1]); i% P7 ^" x( r; j% Y6 E( I
plt.show() $ Q; o, }6 U/ I' v( _) @8 w1 E
` ' ~, q! x7 L$ B8 ^
from sklearn.preprocessing import StandardScaler& u% l6 [6 R5 b! ~5 t
from sklearn.preprocessing import MinMaxScaler7 w. Q1 o0 o4 Z: s7 D) O
from matplotlib import gridspec3 f- B/ q0 s7 i0 R2 s
import numpy as np: o' d3 N' c# m7 O+ z5 x2 x/ C j. V
import matplotlib.pyplot as plt
0 X3 N( d3 {2 }- s* c data = np.random.uniform(0, 100, 10)[:, np.newaxis]2 c: A5 a- ~; M4 x# r: |" K
ss = StandardScaler()
$ V0 D! Y( k! C, Y std_data = ss.fit_transform(data)9 Y s1 y% L; m) [/ |
origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据
1 C0 t/ }0 }* y" h* K% E' Y7 f0 r print(data is 原始数据,data)( j6 X0 q: J/ Q+ R$ P0 r0 i
print(after standard 标准化后的数据,std_data); @ n9 r( a% E+ }7 h
print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data)
3 e3 ~$ r% r0 |7 e. ? print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data)) $ q$ t9 X% j" `+ C/ W: [
使用sklearn 进行数据的归一化和归一化还原.
4 ?# j! U; \: y+ X l ?: X data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据
- ?1 t4 X& z6 L+ E8 o mm = MinMaxScaler()# 创建MinMaxScaler 对象$ p7 {: B6 Z g; P: i
mm_data = mm.fit_transform(data) # 归一化数据: u" }* W! ~2 |
origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据' |, D3 W {2 ^' a5 U( u' D
print(data is ,data)
& A- ]4 L1 l" E- B print(after Min Max ,mm_data)
6 ? g" Z. j8 I print(origin data is ,origin_data)
! o" {& r; R; ]: j6 b. Y( I MinMaxScaler和MaxAbsCaler:
; ? X+ X5 x! v, m" c MinMaxScaler:使得特征的分布在一个给定的最小值和最大值的范围内.一般情况下载0`1之间(为了对付哪些标准差相当小的特征并保留下稀疏数据中的0值.)
1 r1 x! _: g# }! ^2 @ MaxAbsScaler:或者是特征中的绝对值最大的那个数为1,其他依次为标准分布在-1`1之间 / ?& v6 \: O3 `% G9 k: a$ m
min_max_scaler = preprocessing.MinMaxScaler()
& |# M! t- `. H, D1 [% r9 q# ^! f x_minmax = min_max_scaler.fit_transform(x)
1 ` t7 q; h# N1 v3 o5 D! M x_minmax
8 T; t6 M; m/ r6 I1 o+ F 对于新进来的数据,采用如下方式进行函数调用:
$ i, p+ G2 |; e f, c/ B x_test = np.array([[-3., -1., 4.]])
9 ]& `5 [( B2 E+ A! k3 ` x_test_minmax = min_max_scaler.transform(x_test)
6 t" o8 i% d& U3 r x_test_minmax % x* q5 ^' i" M7 b4 H6 D
MaxAbsScaler:数据会被规模化到-1`1之间,就是特征中,所有数据都会除以最大值,该方法对哪些已经中心化均值为0,或者稀疏的数据有意义. . a1 p F% E! w; J8 w/ U7 m
max_abs_scaler = preprocessing.MaxAbsScaler()
% `5 F& N; q6 E: e1 Y" J x_train_maxsbs = max_abs_scaler.fit_transform(x)
# t9 h0 ]6 J, K- X% \ x_train_maxsbs . v- g" `/ _/ P6 x, A$ S$ j7 a7 U" e
# 同理,也可以对新的数据集进行同样的转换 5 K1 s. y. ?8 L% H6 Q+ X2 O
x_test = np.array([[-3., -1., 4.]])
B% I5 o) r6 P+ f6 ]+ A3 [/ N x_test_maxabs = max_abs_scaler.transform(x_test). s; O& N3 g* `# F; J4 o0 g
x_test_maxabs 9 w- z2 D; g. v, X
针对规模化稀疏数据
3 N% N: G' U3 M 对稀疏数据去均值的中心化会破坏稀疏的数据结构,使用如下两个方法进行处理:
% c* j8 a% F1 ~2 T( g MaxAbsScaler,和maxabs_scale 9 r' M8 C; U+ `9 E4 P. L+ F
针对规模化有异常的数据, Y- N6 g0 S8 N( U3 L+ F
数据集中有很多异常值,就不能使用数据的均值和方差去做标准化了.可以使用robust_scale和RobustScaler ,更具中位数或者四分位数去中心化数据.
( y* {$ K/ I8 ` ~ K' H 正则化Normalization
: D2 k4 R& K. L7 W6 T9 S% u a 正则化是将样本在向量空间模型上的一个转换,常常被使用在分类和聚类中,使用函数normalize实现一个单向量的正则化功能.正则化化有I1,I2等
. I g/ p) w. G0 E$ y1 R x_normalized = preprocessing.normalize(x, norm=l2)( \4 ~( M# i, n
print x
! o$ m: F& L$ _ print x_normalized 4 \$ Q6 @3 C$ D$ K
# 根据训练数据创建一个正则器 Normalizer(copy=True, norm=l2) " ?, }% D" |7 {
normalizer = preprocessing.Normalizer().fit(x)
# ~6 @4 H3 \0 ~& z' y. z3 B normalizer
9 |9 @+ ?) b' B$ N) e- f x5 } # 对训练数据进行正则
9 K( G, J& g. z0 Y+ G3 T+ j normalizer.transform(x)
$ d0 }2 n% E9 }7 S; V |4 V& J+ ^ # 对新的测试数据进行正则 8 \) p! I( ~6 T2 R6 `- ^
normalizer.transform([[-1., 1., 0.]]) 4 A; f4 E1 a6 f# u
二值化
& O; Y8 H& z, Z' c 特征的二值化(指将数值型的特征数据转换为布尔类型的值,使用实用类Binarizer),默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0.通过设置threshold参数来更改该阈值
: t0 B& D z) `2 X. Q+ U' l- f from sklearn import preprocessing8 S7 W0 Z; |, i3 a! U# N; s6 A$ H
import numpy as np
9 K: c+ e O j. F8 d7 f) @8 s# G+ c' G' Q" d4 \5 f
# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征# R! L9 t9 y, |4 S; e$ E
x = np.array([[1., -1., 2.],
0 R! k3 @' F/ D5 o! M6 y [2., 0., 0.],
y: r# h& R7 B5 F [0., 1., -1.]])
. `" }. A7 D3 Y, z/ ]8 G/ l
, R2 t; Q* V& i# k A binarizer = preprocessing.Binarizer().fit(x)
8 E b! P$ {* e9 ^( j! H' [ binarizer.transform(x). R! {+ ]6 O' A F6 d% A% h# l9 {
5 ?5 }5 V% I' @- ^, F% N2 J binarizer = preprocessing.Binarizer(threshold=1.5)
4 h) f! p. Z4 K1 n- N* ?( d binarizer.transform(x)
# Z: b; Q% d* u. K 为类别特征编码( b+ D$ X; O9 H n& Z& V/ I& R
(比如性别:male,来自于哪个国家或地区:from US,使用什么浏览器:users Chrome) 可以转换为 013 或者是其他的数值型编码.
6 s/ }: W2 F! W. }" Q6 u+ G4 Y OneHotEncoder
; v- Z2 G; i7 w$ e! ~ 弥补缺失数据
9 R' h u8 b& N: s6 X/ U) _+ k 可以使用均值,中位数,众数等等弥补缺失数据,可以使用Imputer实现.
, O) b8 {. N* Q e7 {: t# c import numpy as np
?# D) ]8 M+ r+ z from sklearn.preprocessing import Imputer
4 ~+ A' [7 i d C: @0 V imp = Imputer(missing_values=NaN, strategy=mean, axis=0)
3 c0 c2 S7 f* \ J3 {4 c& g s% _* w imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]])% r6 _ Q% q$ I f3 E
x = [[np.nan, 2], [6, np.nan], [7, 6]]
8 m, |2 L) j) k, u# Q( w2 _ imp.transform(x) 0 y4 x; \- S! K0 ~- b4 F
Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值
$ L p' l9 ]; M& x9 I import scipy.sparse as sp$ k7 o. D5 E. u: h3 s
# 创建一个稀疏矩阵
3 e. I; o7 N, r5 @6 t x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])+ d( N3 E4 g& F/ y" v
imp = Imputer(missing_values=0, strategy=mean, verbose=0)# F% R. O- H% {% v* t6 ^
imp.fit domain name is for sale. Inquire now.(x)4 ~& ]8 r8 T( K) S. F- f
x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
' J% F3 |7 T/ N; U imp.transform(x_test) 3 d" o }. {! J3 p, ]; W
当我们拿到一批原始的数据 - P4 e. B5 H0 J) W
首先要明确有多少特征,哪些是连续的,哪些是类别的。
# D; m5 A9 U3 r! y 检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。 . K: u7 I# D' d
对连续的数值型特征进行标准化,使得均值为0,方差为1。 : F" R6 J$ n0 E' J6 Y; n2 W
对类别型的特征进行one-hot编码。 : I0 c4 N1 W0 }. O; M8 t+ t, q
将需要转换成类别型数据的连续型数据进行二值化。
; t9 @# _' H. h8 D* u6 B- a 为防止过拟合或者其他原因,选择是否要将数据进行正则化。
/ u+ D8 @6 ]) G# k 在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
6 ~# c- n. |& n7 g' p 根据实际问题分析是否需要对特征进行相应的函数转换。 * o( {5 T" z; z5 M* G" t8 m
标准化和归一化的缺点:每当有新的数据进来时,就要重新计算所有的点 % d: h: \. Z8 o9 E) q8 {5 Y
因此针对动态的数据可以采用如下几种计算方法: 3 E6 @" r/ F$ ?9 E
1.arctan反正切函数标准化. http://2.in函数标准化预处理数据的方法总结(使用sklearn-preprocessing)_【人工智能】王小草的博客-CSDN博客 : X1 Y9 W) c$ V3 S' V4 x% X
9 y2 A+ @# g$ |8 _+ _# i7 | j! L+ x: `( U2 A6 Z7 U
- n$ {" j% K4 j! [1 [( V
/ `; t/ ~( @+ Y4 v- V& ` |