|
2 C5 T% ~# A5 ^0 @4 A" | sklearn Preprocessing 模块 对数据进行预处理的优点之一就是能够让模型尽快收敛.标准化和归一化: 5 d: p' u1 _! j
归一化是标准化的一种方式, * }$ E3 T. R2 F F
归一化是将数据映射到[0,1]这个区间中, & k, C* A e7 H% X7 n
标准化是将数据按照比例缩放,使之放到一个特定区间中, & B: O W7 q1 A. N9 r; q
标准化后的数据均值为0,标准差等于1,因而标准化的数据可正可负. , W" k* n! u/ u5 j1 F
如果原始数据不符合高斯分布的话,标准化后的数据效果并不好.(标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征.)
! _& j) i; i7 ^+ [3 h 导入模块: 8 B. Z& E9 D2 H W3 I9 d& n
from sklearn.preprocessing import StandardScaler6 [- |+ m; K3 X6 p& x- Y3 K! O' c
from sklearn.preprocessing import MinMaxScaler$ {6 n3 p# v: e2 e* n) u: z0 H& Z
from matplotlib improt gridspec
! e4 M& @( a$ s6 T3 X& R import numpy as np! J* z) r! ^' `
import matpotlib.pyplot as plt
2 Z7 Q( p+ w3 [0 f 使用sklearn 进行标准化和标准化还原
+ ]/ @3 X/ ?1 ]5 g 标准化的过程分为两步: 去均值的中心化(均值变为0);方差的规模化(方差变为1).将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的x_scale = preprocessing.scale(x) , B/ G# v5 [5 K- m" G" ^0 M. |
std = StandardScaler()
. C/ }" C! b$ K( O B z e data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]])
" Q. ~- ^& c: v! _7 h- e; g( _* i- K( J3 V" L
# 将标准化后的数据转换为原始数据。
' e4 i# K' H. c' E# X) ^+ m2 b std.inverse_transform()
- |. u. W& i, O' W$ o0 s& |: w 查看标准化后的数据的均值与方差
& l9 ~( o* _; ^9 Q' O$ \# ] x_scale.mean(axis=0)# 均值
3 G, Q, {0 |9 P$ O6 X3 j& e # axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作 6 k( o" g5 e$ x; D! K2 v: G. U4 A
x_scale.mean(axis=1)
& E, ^3 d" [4 b4 L `
# M: L0 T, H' b cps = np.random.random_integers(0, 100, (100, 2))$ g8 R% P* Y- k- r
# 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集.& E* P/ S" ^- E# ~; e7 }! I
ss = StandardScaler()
) p8 w: ^4 Z0 F* v1 ]) j- i( r std_cps = ss.fit_transform(cps)' T# c4 a: w& ]
gs = gridspec.GridSpec(5,5)
2 m1 s6 m/ n0 u9 f9 \& r fig = plt.figure()
( {4 V5 x' l3 Q! _/ W ax1 = fig.add_subplot(gs[0:2, 1:4])
+ W8 G* Z. R7 h5 U8 t! B ax2 = fig.add_subplot(gs[3:5, 1:4])
2 N5 E' T9 ?6 i ax1.scatter(cps[:, 0], cps[:, 1])
; E5 @( p' @. p( t, G6 I* h ax2.scatter(std_cps[:, 0], std_cps[:, 1])7 a2 @7 W6 Z& }
plt.show() 3 r' R6 Z% u+ G2 t# M) F& Y
`
- a! s4 r) k" p. T* k* S from sklearn.preprocessing import StandardScaler% m6 S L/ Y# i0 o" A" k$ F' a* w
from sklearn.preprocessing import MinMaxScaler
1 e# u" D" s& i% k5 X4 t4 P' z5 N from matplotlib import gridspec
$ ?; d' x) x# A7 q7 m import numpy as np, m V: T- w( |
import matplotlib.pyplot as plt ?) d7 G( o/ V
data = np.random.uniform(0, 100, 10)[:, np.newaxis]- F5 n; x# E- l' w' \( y2 ?7 Q
ss = StandardScaler()
' { ]2 Q' Q! F5 G2 ^ std_data = ss.fit_transform(data)4 E6 A5 c6 g2 Y- s5 B" o7 F
origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据
, K, o3 j, [ v, L7 J print(data is 原始数据,data)4 q! |: m# G) t( F3 y
print(after standard 标准化后的数据,std_data)
- q0 s) G$ X8 o3 v% T' `' \ print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data)' e" e# y8 z( Q+ w
print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data))
2 W1 v q( c0 @4 L/ H/ t, Q 使用sklearn 进行数据的归一化和归一化还原.7 z' c1 E8 P# b
data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据# _# S3 h- Z, M9 O. r5 k
mm = MinMaxScaler()# 创建MinMaxScaler 对象
- V& M" d4 [+ e9 g, L- y' [& a mm_data = mm.fit_transform(data) # 归一化数据
7 y+ j4 X5 p' G$ d$ s origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据
+ u# O* X n5 R4 m6 D1 T print(data is ,data)
, O# Y* e! ~" ]$ P% ~& t print(after Min Max ,mm_data)( a! Z o7 Q5 v: W: _! ?6 _
print(origin data is ,origin_data)
) C2 G, n+ R0 Y) E; @1 V$ j: V2 j. f MinMaxScaler和MaxAbsCaler:0 ]" w- N/ g" v A$ _
MinMaxScaler:使得特征的分布在一个给定的最小值和最大值的范围内.一般情况下载0`1之间(为了对付哪些标准差相当小的特征并保留下稀疏数据中的0值.) 4 M& x. \% N, M( o4 s" G5 q
MaxAbsScaler:或者是特征中的绝对值最大的那个数为1,其他依次为标准分布在-1`1之间 - ?% ]6 R# E. _9 B# i
min_max_scaler = preprocessing.MinMaxScaler() P& b4 o$ e( }* [ \+ y; c0 I3 j
x_minmax = min_max_scaler.fit_transform(x)* w: ~$ S Y5 g' d5 U9 J" R' N
x_minmax
. q# F a2 g! x) g 对于新进来的数据,采用如下方式进行函数调用: 6 t/ O( v0 M* X) w
x_test = np.array([[-3., -1., 4.]])
$ u% v$ r, z( i7 a1 b' j/ ~ x_test_minmax = min_max_scaler.transform(x_test). p2 k8 i& H' a' ?9 G7 w
x_test_minmax
3 [4 A; l& l4 [0 X' C& O5 W MaxAbsScaler:数据会被规模化到-1`1之间,就是特征中,所有数据都会除以最大值,该方法对哪些已经中心化均值为0,或者稀疏的数据有意义.
n. t' k( \1 x+ `7 P+ y$ g# k max_abs_scaler = preprocessing.MaxAbsScaler(): j# u) F, {# F: k2 B
x_train_maxsbs = max_abs_scaler.fit_transform(x)
3 l4 i; }9 E- ~- w& v x_train_maxsbs
7 H. N% Y+ x1 h$ S; q: s) b6 W # 同理,也可以对新的数据集进行同样的转换 ( }" q+ E3 f' U% e; ?" A. Z, X8 v
x_test = np.array([[-3., -1., 4.]])( F: i% H" \6 r b! h% w' m5 ^
x_test_maxabs = max_abs_scaler.transform(x_test): t. X7 R, ~7 N7 v d( ~! d) B: ?
x_test_maxabs
& a+ t9 f, M+ g+ Q2 w. m! k 针对规模化稀疏数据. w0 h% x4 z4 z3 {& n! ~& V" D
对稀疏数据去均值的中心化会破坏稀疏的数据结构,使用如下两个方法进行处理: 5 m w) ~4 G! F8 W" X
MaxAbsScaler,和maxabs_scale 9 b" t; h1 I: N8 ?; ~. Z1 `! j
针对规模化有异常的数据8 j7 F F6 v7 H# b1 V) P5 f- l
数据集中有很多异常值,就不能使用数据的均值和方差去做标准化了.可以使用robust_scale和RobustScaler ,更具中位数或者四分位数去中心化数据.
3 k' @& u) `& N3 p1 h 正则化Normalization
% ~8 k( O3 b2 i; i 正则化是将样本在向量空间模型上的一个转换,常常被使用在分类和聚类中,使用函数normalize实现一个单向量的正则化功能.正则化化有I1,I2等 ) Z* p# I3 l5 E
x_normalized = preprocessing.normalize(x, norm=l2)6 U/ m, \8 w# [8 |; v1 k. e) R
print x
; _+ S9 b0 Z' q print x_normalized * ^3 N# f; E( Y6 T
# 根据训练数据创建一个正则器 Normalizer(copy=True, norm=l2)
4 z4 u5 u2 n- O normalizer = preprocessing.Normalizer().fit(x)
' S2 h2 t' C& @2 c2 h1 v normalizer 6 T$ Y3 q, _, S. z" Y
# 对训练数据进行正则
, v) F9 [2 h# O& }" ~) P; I normalizer.transform(x)
( Y* c" i3 w, E0 ?, A3 d9 h/ r7 ~ # 对新的测试数据进行正则
' ^& Z+ z8 r: n$ _* T9 `& ]; C/ d6 d normalizer.transform([[-1., 1., 0.]]) . y% y3 A4 N6 b* M. ?
二值化
/ Q! u( a5 z& V 特征的二值化(指将数值型的特征数据转换为布尔类型的值,使用实用类Binarizer),默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0.通过设置threshold参数来更改该阈值 ( o, i) k3 ^9 t* s# D+ Q4 j
from sklearn import preprocessing- P( y/ c/ T) Q
import numpy as np7 c9 B# i5 T, H, w6 A# E1 B9 f
! q0 I& d2 Q. {
# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征* f' q! a# X# n# w' y6 |6 u/ k% S
x = np.array([[1., -1., 2.],% d1 e4 H. d4 S' f4 L" {. N$ c# ]2 w
[2., 0., 0.],2 @6 t: f; k' u6 [+ G4 J
[0., 1., -1.]])/ x0 i T. Z4 L4 Q; {7 _
. X& o. A1 p; k1 E' F
binarizer = preprocessing.Binarizer().fit(x)/ ?& A" \' p v0 d4 Q
binarizer.transform(x)
4 H! h7 Q0 z) t* X" o! e
: _: U9 G2 s5 Y" {* V binarizer = preprocessing.Binarizer(threshold=1.5)
W6 a8 s6 K- S5 I) H binarizer.transform(x)
* z0 p( a! j& M3 j5 i 为类别特征编码6 R/ ~5 ]$ F" J/ j I% L
(比如性别:male,来自于哪个国家或地区:from US,使用什么浏览器:users Chrome) 可以转换为 013 或者是其他的数值型编码. . T+ g5 |: m/ o6 d
OneHotEncoder
) R$ t8 _2 ?+ c4 l7 C 弥补缺失数据) g4 m2 d: N1 b2 F
可以使用均值,中位数,众数等等弥补缺失数据,可以使用Imputer实现.
' D8 p) y; @5 L& C" p8 Z1 v import numpy as np
% @( ?; d8 A. k4 i5 {9 R from sklearn.preprocessing import Imputer$ @! v& B; c& Z' {& M
imp = Imputer(missing_values=NaN, strategy=mean, axis=0), [* {. y' g3 v A3 ?
imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]])
5 W$ k+ {, b* \; f7 I. \! B x = [[np.nan, 2], [6, np.nan], [7, 6]]" u3 O& {. l; `: C- q+ ]9 ^6 h
imp.transform(x) # ?6 i \% {1 j9 L+ ]8 f; o
Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值 ; m" ~- u4 Q& F" \8 W9 g
import scipy.sparse as sp
+ p K: c7 o3 f, F) u # 创建一个稀疏矩阵0 G0 o; T' P8 `' z+ a
x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
8 Q9 n& F, P) o. ?% Y! _, ^. @ imp = Imputer(missing_values=0, strategy=mean, verbose=0)
7 c! n% a, x; `; P imp.fit domain name is for sale. Inquire now.(x)' @4 x' P8 Q# u) d/ E% m: h! k" Q) z
x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])( a( q# H9 j" L2 o9 A v
imp.transform(x_test) 9 ?3 [3 t. \2 F) B% p! z* _; j
当我们拿到一批原始的数据 1 l" v! s1 e B8 U& _
首先要明确有多少特征,哪些是连续的,哪些是类别的。
, V; x7 a! c* U9 r 检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。 + X* ]1 z) U" ] |+ {6 y- \: M
对连续的数值型特征进行标准化,使得均值为0,方差为1。 - V2 M% F: X7 ~8 o
对类别型的特征进行one-hot编码。 6 _; s1 k/ x1 _& s+ x, `
将需要转换成类别型数据的连续型数据进行二值化。 , e# T* H$ x' ^7 Q! m+ |) l
为防止过拟合或者其他原因,选择是否要将数据进行正则化。 6 W% H2 i7 |( k, d. }2 Y% @7 c
在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。 ! I5 j: J0 D+ F* g- y: S- J: A
根据实际问题分析是否需要对特征进行相应的函数转换。 ; \, ]) N/ O# P! v$ P
标准化和归一化的缺点:每当有新的数据进来时,就要重新计算所有的点 " a8 Q/ c5 F) m8 t
因此针对动态的数据可以采用如下几种计算方法: " a2 I' K9 Y0 e! ~6 t
1.arctan反正切函数标准化. http://2.in函数标准化预处理数据的方法总结(使用sklearn-preprocessing)_【人工智能】王小草的博客-CSDN博客 9 Y, O, P! c% r" e( V% }2 R
1 c8 x/ s. z' T% ~
* \' i; B. q3 u9 N
8 t! F, ]# w; ?: o' x1 F- U* o. f0 @7 `& F' D
|