|
! J+ K4 l* r. G/ e" S- l4 A j sklearn Preprocessing 模块 对数据进行预处理的优点之一就是能够让模型尽快收敛.标准化和归一化:
/ R- C% D0 j6 o' z& |! g 归一化是标准化的一种方式, ( s- y2 z. u' \0 J2 M F( ^
归一化是将数据映射到[0,1]这个区间中,
# A2 R1 @7 R/ ]6 G9 R" i$ i9 E1 s 标准化是将数据按照比例缩放,使之放到一个特定区间中, % r& w& i; \% A3 O, z' D! [2 e
标准化后的数据均值为0,标准差等于1,因而标准化的数据可正可负. " ~' d* ^4 v5 t5 X& d8 @; z- z
如果原始数据不符合高斯分布的话,标准化后的数据效果并不好.(标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征.) $ I& L8 R# N. ^. R- J
导入模块:
$ {4 i/ p p3 c from sklearn.preprocessing import StandardScaler3 j: w5 V1 z- F3 N7 v' W0 X; {1 l
from sklearn.preprocessing import MinMaxScaler
8 {4 a2 x) U/ T L from matplotlib improt gridspec
, O8 J$ J$ @* [% `: i5 A5 O import numpy as np
; C$ D! k5 ]7 q% c import matpotlib.pyplot as plt
1 v: `; Z& V. B7 J% Z" \ 使用sklearn 进行标准化和标准化还原: A& n& m4 m1 z) \. x) b7 Y/ ]
标准化的过程分为两步: 去均值的中心化(均值变为0);方差的规模化(方差变为1).将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的x_scale = preprocessing.scale(x) : _& c) B. y' `0 R0 A# z2 R) e2 g$ m
std = StandardScaler()
; H+ A' d; O) [' H9 s# S: ~ data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]])% m9 K+ _4 ~& J2 Q8 r
7 ^. G4 S/ {) U: o) B: s # 将标准化后的数据转换为原始数据。
# y) X7 ?) o; N! X/ X: x std.inverse_transform()
. i2 e$ D' I. d4 H, c# L; e 查看标准化后的数据的均值与方差
* j0 `. D! {: o# L x_scale.mean(axis=0)# 均值
O. M. o5 F) q; s* w& E) m # axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作
+ [$ I0 v" I7 T x_scale.mean(axis=1)
d d7 _" L4 e* P, W/ j! U$ e2 L" Q% B/ { `
. d" c- [2 ~4 a5 T cps = np.random.random_integers(0, 100, (100, 2))9 C* C$ K+ a, T% L; d# ^
# 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集.
+ I8 [/ m2 H1 ^( A ss = StandardScaler()
7 ^7 u0 I5 X# M% H std_cps = ss.fit_transform(cps)" x) I, z5 J. U
gs = gridspec.GridSpec(5,5)
5 c' | x' @4 F! r* Z. ~: J4 A fig = plt.figure()
" b8 [# v. m& ?4 S8 P ax1 = fig.add_subplot(gs[0:2, 1:4])
|# @, C. \2 k: M- Q9 L ax2 = fig.add_subplot(gs[3:5, 1:4])
" H8 M1 L" Q( J& ` ax1.scatter(cps[:, 0], cps[:, 1])% O2 F3 {' Q& y( [2 F+ S+ l# ~2 s
ax2.scatter(std_cps[:, 0], std_cps[:, 1])4 {7 h/ p! d. w6 k# A4 O
plt.show() 5 T) m: t+ b3 ]9 s' ^. t9 Z2 N
` 5 G0 Q; K5 ]2 {3 v
from sklearn.preprocessing import StandardScaler0 S# _5 {. ]6 N2 W: E) V4 a) z
from sklearn.preprocessing import MinMaxScaler
0 G, x" n Q+ s* K: E7 @# _; z# D from matplotlib import gridspec
! }8 N9 r( W; c% C( |' t6 q7 X5 C import numpy as np
5 @$ w3 }& y) Q% f$ J& M+ D" Z import matplotlib.pyplot as plt
0 @8 t* O8 D2 y' b data = np.random.uniform(0, 100, 10)[:, np.newaxis]0 P! r7 r! O! e
ss = StandardScaler(): l6 p! z3 C, O% R9 e1 y
std_data = ss.fit_transform(data)9 R; m A9 w) N
origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据
# M \! w% ^3 ~ | print(data is 原始数据,data)
' K! S- G1 H# p& I1 ^- [3 ~- C9 {: t, D print(after standard 标准化后的数据,std_data)0 Z) j, e8 c3 _1 h+ e
print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data)
# H/ m( i/ |: A; }& T8 b& v print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data))
0 r" d. y- v }& I* X 使用sklearn 进行数据的归一化和归一化还原.
8 ^$ ~/ N/ g7 h% o data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据+ z) h' W2 A- z* R. T1 @3 K$ q
mm = MinMaxScaler()# 创建MinMaxScaler 对象+ r. d7 u- A$ r5 x3 z# z
mm_data = mm.fit_transform(data) # 归一化数据
, l- S! k- \4 R7 N origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据
3 A* a! _9 Z- p" C7 B print(data is ,data): A4 l3 V$ I- z1 {
print(after Min Max ,mm_data) n2 z2 Y6 U- Y" v( x( b
print(origin data is ,origin_data)
2 U% V; M N, r: |' w+ u5 b MinMaxScaler和MaxAbsCaler:3 v8 c3 d' A$ O; n1 V
MinMaxScaler:使得特征的分布在一个给定的最小值和最大值的范围内.一般情况下载0`1之间(为了对付哪些标准差相当小的特征并保留下稀疏数据中的0值.)
+ ^3 j- p [1 C8 u" U+ @! ~4 @7 c6 v MaxAbsScaler:或者是特征中的绝对值最大的那个数为1,其他依次为标准分布在-1`1之间
& `; m p; F& `( Z- J min_max_scaler = preprocessing.MinMaxScaler() D+ [1 I# G% _8 N
x_minmax = min_max_scaler.fit_transform(x)) l9 P) Y( A5 d: _7 F
x_minmax * y& ^. U x# V1 m* u9 P
对于新进来的数据,采用如下方式进行函数调用: & v) @8 j+ n+ L' n0 W& A$ [
x_test = np.array([[-3., -1., 4.]])
9 l2 p1 [9 p+ v0 B7 m x_test_minmax = min_max_scaler.transform(x_test)' m+ w$ C8 W: ~+ ^
x_test_minmax : B: v/ v. f+ f: N" w
MaxAbsScaler:数据会被规模化到-1`1之间,就是特征中,所有数据都会除以最大值,该方法对哪些已经中心化均值为0,或者稀疏的数据有意义. ! T. ]7 o& Z% Z$ X
max_abs_scaler = preprocessing.MaxAbsScaler()1 A! F6 l* F% _! V! q- | n0 ?
x_train_maxsbs = max_abs_scaler.fit_transform(x)
1 F) ~% r' X0 A* e% C% l2 j$ @; \! ] x_train_maxsbs
* W, k7 S( F" K2 a4 k # 同理,也可以对新的数据集进行同样的转换
9 A: m/ [: y& A* X& ]4 W" V# k. g x_test = np.array([[-3., -1., 4.]])' ]# ^9 R5 f6 `, n& O z
x_test_maxabs = max_abs_scaler.transform(x_test)
9 i. O8 u8 |! K$ z1 S0 q+ C: \& g x_test_maxabs
+ Q0 b* C# F2 f' p* r! i 针对规模化稀疏数据
O# l& F! f0 h/ f6 y4 W 对稀疏数据去均值的中心化会破坏稀疏的数据结构,使用如下两个方法进行处理: + _9 i0 M" w$ I7 @
MaxAbsScaler,和maxabs_scale 9 f3 b/ y* b% D0 j- A ]2 W" j: a2 C
针对规模化有异常的数据
T' E$ Q3 @4 n! U9 { 数据集中有很多异常值,就不能使用数据的均值和方差去做标准化了.可以使用robust_scale和RobustScaler ,更具中位数或者四分位数去中心化数据. % l# b G- W, s
正则化Normalization
. L8 G+ I- U* I1 N0 z 正则化是将样本在向量空间模型上的一个转换,常常被使用在分类和聚类中,使用函数normalize实现一个单向量的正则化功能.正则化化有I1,I2等
" r! L4 k5 O- E8 p" X7 i# n x_normalized = preprocessing.normalize(x, norm=l2)
( _0 B, o6 f5 i" F. q9 z print x
" g% L. q* L) ~. A) S print x_normalized
7 |. B; ]0 O/ s$ ^ o # 根据训练数据创建一个正则器 Normalizer(copy=True, norm=l2)
$ P* c; N& t* L3 g# y* }" W- Q normalizer = preprocessing.Normalizer().fit(x)
6 l J; k: @ r2 S3 \ normalizer ' [% o, {+ s' u G0 E$ H3 P
# 对训练数据进行正则 2 R. G! m. E+ i( W. W
normalizer.transform(x) 9 W J7 Q- a; S% F
# 对新的测试数据进行正则
2 f" r% h7 m9 A5 D. n3 [ normalizer.transform([[-1., 1., 0.]])
) i8 I: U# _: g& ]0 E1 W 二值化' l- U( C- x/ ]9 b( |; j- b" z
特征的二值化(指将数值型的特征数据转换为布尔类型的值,使用实用类Binarizer),默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0.通过设置threshold参数来更改该阈值
- c* {- ~/ F7 y; W& R from sklearn import preprocessing- m: C" \0 c+ _8 a; j% f
import numpy as np
+ u8 c' O. } v" n8 B( u; x! m& \& a0 y0 A, Q
# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征/ a5 ~2 W. P6 q8 q0 b
x = np.array([[1., -1., 2.],
* D0 L8 w; c8 u/ _3 R [2., 0., 0.],
; Q1 g7 Y. w$ ~8 j1 v9 V! ~ [0., 1., -1.]]), i, U0 @& r" V4 N) R1 e1 w
( L* x1 i" e9 c# L; x/ S0 @* x
binarizer = preprocessing.Binarizer().fit(x)
. }) v7 e/ o" f) v+ J( o' | binarizer.transform(x)3 x; `, @( h$ U6 ?
& x1 G& v3 ^: G
binarizer = preprocessing.Binarizer(threshold=1.5)
; |& |6 \: x; L- ` binarizer.transform(x)
+ Z/ N% h j- y: G+ T. v 为类别特征编码
) l- a+ o. G- t1 H- R t: u (比如性别:male,来自于哪个国家或地区:from US,使用什么浏览器:users Chrome) 可以转换为 013 或者是其他的数值型编码. ' W$ j1 ]5 B, x; c
OneHotEncoder
0 `" h0 f" `+ i/ N, y" w6 L; M 弥补缺失数据
9 X1 R6 ^, p. T1 R7 N& a) T, D/ S* x 可以使用均值,中位数,众数等等弥补缺失数据,可以使用Imputer实现.
3 `6 s+ f2 k4 d7 a, B import numpy as np
! N4 Q" L3 l+ }/ D from sklearn.preprocessing import Imputer5 y) m* t) N* X/ n" Y( @& N4 o
imp = Imputer(missing_values=NaN, strategy=mean, axis=0)
' }. L3 ?; c0 Q$ i4 P imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]]) a( U1 D% ^3 a
x = [[np.nan, 2], [6, np.nan], [7, 6]]* x# F3 S, s" U6 V# ?6 Y
imp.transform(x) `; B8 |. _) @4 H4 y' X9 S( v
Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值
$ X- O. [* m# ?' c) K; K import scipy.sparse as sp; `- T! h3 t% O* T& O t
# 创建一个稀疏矩阵& b: J% g% h( ?. N$ q. h9 `
x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
8 N; N( B7 g) V/ M( D5 K imp = Imputer(missing_values=0, strategy=mean, verbose=0) p% O5 D) L: @1 K2 a
imp.fit domain name is for sale. Inquire now.(x)- Q, X; z4 Q `9 ]4 X
x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])/ T. O* z3 V. Z1 T$ K: C
imp.transform(x_test) 7 W2 U3 C& {+ `; Z! @( o! ]0 N5 i
当我们拿到一批原始的数据
: g/ _* a2 }* d. U @ c+ A 首先要明确有多少特征,哪些是连续的,哪些是类别的。 . q: y( m# z- W3 ]2 ^7 W
检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
6 S, m/ Z9 u5 U 对连续的数值型特征进行标准化,使得均值为0,方差为1。 : M j- R( u! D# S1 T) @: J
对类别型的特征进行one-hot编码。 5 z. D7 z4 `: b. L2 \- G9 u# B) }" Z
将需要转换成类别型数据的连续型数据进行二值化。
4 h0 A% S+ g F3 ]1 b( Z 为防止过拟合或者其他原因,选择是否要将数据进行正则化。
3 }5 o: S6 b* H( z; _' x2 _" r 在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
4 L D# n3 f( W5 J- u; t) P 根据实际问题分析是否需要对特征进行相应的函数转换。 3 g/ i: }$ S" r8 |2 T4 J
标准化和归一化的缺点:每当有新的数据进来时,就要重新计算所有的点
5 {. T9 K% Q) v/ Z0 I 因此针对动态的数据可以采用如下几种计算方法:
! @7 A6 H) I, ~7 d; ^* M. t 1.arctan反正切函数标准化. http://2.in函数标准化预处理数据的方法总结(使用sklearn-preprocessing)_【人工智能】王小草的博客-CSDN博客 6 o% k: [* d0 d" _, V, K, a
, o: Z- a' D$ z1 H- k5 S& F5 o7 x1 i3 l2 ~: |" |
; W, B \8 m2 ^3 [& k# k, C
* O, J5 p, e& |. c8 U |