|
8 i$ m- J& Y1 w! }
sklearn Preprocessing 模块 对数据进行预处理的优点之一就是能够让模型尽快收敛.标准化和归一化:
/ |/ ]. {) @, B9 N. z* }: m9 y 归一化是标准化的一种方式,
5 O5 M- O# U% ^* i 归一化是将数据映射到[0,1]这个区间中,
6 w! I [+ \! b1 A 标准化是将数据按照比例缩放,使之放到一个特定区间中,
5 Z- q9 F$ P; e2 W/ V+ ^ 标准化后的数据均值为0,标准差等于1,因而标准化的数据可正可负. / Q& W5 @6 s1 R0 l4 `% Q
如果原始数据不符合高斯分布的话,标准化后的数据效果并不好.(标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征.)
0 S/ |1 E$ c& ^( Z, f; c 导入模块:
; d- ~5 t$ C/ y1 G% c) x3 p from sklearn.preprocessing import StandardScaler9 O+ o) g3 z) T; P( F/ k# S
from sklearn.preprocessing import MinMaxScaler
6 C% F/ ?( i8 t7 a from matplotlib improt gridspec
3 K3 V3 t4 H6 U7 n import numpy as np
$ ~ q$ c$ E# {% X import matpotlib.pyplot as plt # f3 R5 ^1 N! [/ [0 J0 ]/ w
使用sklearn 进行标准化和标准化还原
M( w2 ]* H6 T4 F* e- G 标准化的过程分为两步: 去均值的中心化(均值变为0);方差的规模化(方差变为1).将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的x_scale = preprocessing.scale(x) 0 |( n; J3 i7 }, S
std = StandardScaler()/ f- U. b5 R; S" U! W9 c( g
data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]])% e2 v& H7 v+ V' P2 p1 {2 w1 x
4 C- }3 H0 k5 a$ a
# 将标准化后的数据转换为原始数据。
1 p. A9 I6 u: b1 a" ]% ?$ \ std.inverse_transform() 0 ^0 e5 D3 N; H B2 B! H7 k
查看标准化后的数据的均值与方差
$ Y$ r2 ?; d5 w+ y$ o# M* t4 \5 ^ x_scale.mean(axis=0)# 均值
4 N$ _. F7 B- n* t3 R0 ~ # axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作 $ a# }3 W+ Y4 x {( z
x_scale.mean(axis=1)
: J' G# R" U w/ n w U2 s( n3 L1 | ` ( M" d0 i s* ` G
cps = np.random.random_integers(0, 100, (100, 2))
2 I5 E# u& ~8 @% v7 f( Q; w # 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集.1 J. `, ]$ d7 k, h v4 J
ss = StandardScaler()& W* P6 h$ H, N7 v3 t, p- e) K
std_cps = ss.fit_transform(cps)
1 d2 d& G4 \7 f& t gs = gridspec.GridSpec(5,5)* p6 s; ~* J" v* v7 p) c
fig = plt.figure()6 x6 X. |- F- k
ax1 = fig.add_subplot(gs[0:2, 1:4])$ v0 y$ H2 P3 A% n3 r! h
ax2 = fig.add_subplot(gs[3:5, 1:4]), R3 C% o$ c6 c% d* ?
ax1.scatter(cps[:, 0], cps[:, 1])
, b% W) {2 Z# s; a" R, M ax2.scatter(std_cps[:, 0], std_cps[:, 1])
: Q# Z5 V) q* s plt.show()
4 B7 L' m* {3 [& }% O2 |3 s `
1 g/ U3 h% p" H3 X8 K& B6 P% u from sklearn.preprocessing import StandardScaler* {8 P6 U: Y8 L& \. Q& F. h) r
from sklearn.preprocessing import MinMaxScaler
$ e* \& M" z) E0 K) a4 u from matplotlib import gridspec
/ ^( O5 @, q4 ?1 h import numpy as np( Q! C2 s$ V3 ~9 l2 j5 X0 c. H; k
import matplotlib.pyplot as plt# T! L4 q- ]8 h/ B( `
data = np.random.uniform(0, 100, 10)[:, np.newaxis]7 X0 m! `/ }5 p q# x; f3 m) }
ss = StandardScaler()& ?% W0 [$ g" P! Q5 w0 ], z$ @
std_data = ss.fit_transform(data)
8 b! v* p! A( E9 `4 k origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据; }* [: r9 u# Y$ G- A1 j
print(data is 原始数据,data)
! l2 K1 O* `4 u print(after standard 标准化后的数据,std_data)
: K1 ?+ C% Y$ J+ L8 q' D6 e print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data)+ F* ~$ }* e1 k+ k" R8 @$ ]: z
print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data)) 3 k C4 ^. O- \4 y/ M6 n* p
使用sklearn 进行数据的归一化和归一化还原.4 t6 n' P' B2 F5 ~, b
data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据9 T) k& V( F0 {- p5 b# Q- X8 h
mm = MinMaxScaler()# 创建MinMaxScaler 对象
: D6 D& l, W' w$ k mm_data = mm.fit_transform(data) # 归一化数据
4 O8 U# y8 H+ H3 r$ @+ O origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据, _, U" l9 C0 l5 ]" g" H5 `
print(data is ,data)- H$ O) W% k2 L; c% O
print(after Min Max ,mm_data)1 [7 ]* j( V( C1 j' A7 N; H
print(origin data is ,origin_data) 9 S5 u1 Q# {" _9 x/ b
MinMaxScaler和MaxAbsCaler:5 m% V& j% [: ^, o7 W
MinMaxScaler:使得特征的分布在一个给定的最小值和最大值的范围内.一般情况下载0`1之间(为了对付哪些标准差相当小的特征并保留下稀疏数据中的0值.)
2 ?% `" [+ l( ]) Q MaxAbsScaler:或者是特征中的绝对值最大的那个数为1,其他依次为标准分布在-1`1之间 $ l0 R$ o4 }& E E3 T- n: M
min_max_scaler = preprocessing.MinMaxScaler()
4 B+ L# W8 j8 K) {& v x_minmax = min_max_scaler.fit_transform(x)
5 [- d7 q5 x+ ]7 Y, I8 y9 |& Q x_minmax
- l4 F" P) `2 c, T7 J6 b 对于新进来的数据,采用如下方式进行函数调用:
1 n& t3 v1 ?% I ?7 D x_test = np.array([[-3., -1., 4.]])% [8 f- Q4 I' q4 V7 h, {
x_test_minmax = min_max_scaler.transform(x_test)/ s$ x/ J5 L- X; Q
x_test_minmax , t- ?6 a3 p, o1 ~
MaxAbsScaler:数据会被规模化到-1`1之间,就是特征中,所有数据都会除以最大值,该方法对哪些已经中心化均值为0,或者稀疏的数据有意义.
& [( C: B+ q% |7 H max_abs_scaler = preprocessing.MaxAbsScaler()3 `2 x6 D$ ^1 d# Z1 ?
x_train_maxsbs = max_abs_scaler.fit_transform(x)0 \* i) J, z& c; h4 L6 n: k' p+ n
x_train_maxsbs & U, B# Q$ e' o5 ^" w0 ~- C
# 同理,也可以对新的数据集进行同样的转换
3 A; F7 V- h; c5 U3 N4 s/ \; B x_test = np.array([[-3., -1., 4.]])5 A- `& u% r! X, T: B4 |$ p
x_test_maxabs = max_abs_scaler.transform(x_test)
0 K, I! n; `$ o; _* G/ P x_test_maxabs
( K6 [6 t: h$ o% g: R 针对规模化稀疏数据) R) s# l: o! b
对稀疏数据去均值的中心化会破坏稀疏的数据结构,使用如下两个方法进行处理: C* Y$ D/ x/ q& Y- A, ]
MaxAbsScaler,和maxabs_scale
5 a' \! g, Z4 X- P) g! }) A7 l 针对规模化有异常的数据
. t+ T9 B8 j: j( }2 T 数据集中有很多异常值,就不能使用数据的均值和方差去做标准化了.可以使用robust_scale和RobustScaler ,更具中位数或者四分位数去中心化数据.
- E# o7 N+ w! }# D4 L 正则化Normalization
; ]$ N+ q8 ?& J+ [3 s 正则化是将样本在向量空间模型上的一个转换,常常被使用在分类和聚类中,使用函数normalize实现一个单向量的正则化功能.正则化化有I1,I2等
3 |" f3 V) T7 Q; N' j( o: Y x_normalized = preprocessing.normalize(x, norm=l2)
+ O- _# m* @& `) i print x
' z4 q* j& x8 ?) W, X# j* F print x_normalized ( G7 O f4 J" A" G
# 根据训练数据创建一个正则器 Normalizer(copy=True, norm=l2) 5 v( M6 c: g4 G
normalizer = preprocessing.Normalizer().fit(x)7 y- E" G3 m* m8 R+ F3 ~2 e
normalizer 2 Z. h& H" U5 z( m4 ^5 z4 P
# 对训练数据进行正则 : m" T2 O: V) k5 O. a6 }
normalizer.transform(x)
8 d+ ~# y; K x# Z, k; U& S # 对新的测试数据进行正则 2 e% b g( h" @( E; D
normalizer.transform([[-1., 1., 0.]]) 6 C7 i) P/ E% ~ E
二值化9 U9 b' |5 ~ I( f( m
特征的二值化(指将数值型的特征数据转换为布尔类型的值,使用实用类Binarizer),默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0.通过设置threshold参数来更改该阈值 0 ~* B8 N3 P0 w! X
from sklearn import preprocessing
. |# Z# r, D# I4 g& d import numpy as np
1 F+ b7 p! u0 A! Z0 \9 Z, i- w/ E
# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征* Y+ k7 k0 y3 C) e1 S; n
x = np.array([[1., -1., 2.],4 s) B9 Z: l0 c, W4 \
[2., 0., 0.],8 y6 r6 i! k' d8 s. A8 M5 ~
[0., 1., -1.]])( z/ i9 r% A. v
6 Q! w! w/ r/ Z3 L
binarizer = preprocessing.Binarizer().fit(x)
2 ~# R" c9 j! o; U8 T binarizer.transform(x)
, K5 X( o$ q8 r/ V5 I, w3 h7 _1 t2 x$ U+ w7 @' N' u
binarizer = preprocessing.Binarizer(threshold=1.5), c# @$ E; s5 \- c* u
binarizer.transform(x) ) u' I6 x* L& @& D: O7 ~; Q) _8 T
为类别特征编码
2 ]3 M5 n% r l! p2 T% h6 P1 Z. ?1 j4 t (比如性别:male,来自于哪个国家或地区:from US,使用什么浏览器:users Chrome) 可以转换为 013 或者是其他的数值型编码.
: O0 H) \' r, I4 x' V7 \1 m5 S OneHotEncoder
% G H+ a) I, p0 S" H9 o 弥补缺失数据
- ?2 N; X) A6 z4 E 可以使用均值,中位数,众数等等弥补缺失数据,可以使用Imputer实现.
* u+ W9 ^# G ]0 j import numpy as np1 T8 e, m. R$ x0 `& R. ?
from sklearn.preprocessing import Imputer2 f+ o# k, l$ E2 S: f
imp = Imputer(missing_values=NaN, strategy=mean, axis=0): W2 @5 d3 R# g! ^+ Q0 A
imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]])
! r7 S: F( u6 W& a x = [[np.nan, 2], [6, np.nan], [7, 6]]* d0 D: t. `0 h- P$ D9 t7 G* y
imp.transform(x)
/ J- c8 x) I S Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值
; o! n2 R1 s: I: F, ]8 { import scipy.sparse as sp' v8 w) q' G1 L3 u
# 创建一个稀疏矩阵. W5 r0 ?& N: s9 i
x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])" O- k( N/ H5 u( {- h6 \4 ~# A: ?
imp = Imputer(missing_values=0, strategy=mean, verbose=0)8 V5 k; a' k1 y! t, T
imp.fit domain name is for sale. Inquire now.(x)
1 O" o% F* p' ~$ r x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
4 k7 W: O: P8 M9 ^9 U imp.transform(x_test) 7 V+ a' q1 T& o2 e8 ?5 {& Y
当我们拿到一批原始的数据 , _' H$ Y- z2 J$ y
首先要明确有多少特征,哪些是连续的,哪些是类别的。 7 a. Z, U, N5 M& D" n$ P: x
检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
" j/ ]7 I6 `' h9 s, s' R 对连续的数值型特征进行标准化,使得均值为0,方差为1。
& Y$ P9 I( I0 p8 P! r( T: l* u: C 对类别型的特征进行one-hot编码。
0 o, a* u! n2 Z 将需要转换成类别型数据的连续型数据进行二值化。
- ^* A/ q1 Z V/ w; t0 j7 N 为防止过拟合或者其他原因,选择是否要将数据进行正则化。 % K% M* M2 D4 d: [" e* w7 ~: O% X
在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。 B X- ^# L' K; f7 m: W9 i. f' A
根据实际问题分析是否需要对特征进行相应的函数转换。
$ Y9 x- E) t6 f, a3 u 标准化和归一化的缺点:每当有新的数据进来时,就要重新计算所有的点 ( f6 E0 r& d8 |7 h3 O0 j, K& ?3 F
因此针对动态的数据可以采用如下几种计算方法: ! ?5 [; f& c& s4 x% Z
1.arctan反正切函数标准化. http://2.in函数标准化预处理数据的方法总结(使用sklearn-preprocessing)_【人工智能】王小草的博客-CSDN博客
& g" Y$ u! X& w" v
, |" O% X% t6 Z" S5 L5 Z4 e9 @7 `8 _% B( ]
4 u; r# k/ _' D# M" w, K# o5 y# B
3 v- Z" h0 O% L' V0 K+ [
|