收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

sklearn Preprocessing 数据预处理

[复制链接]
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
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
天阶雨
活跃在6 天前
快速回复 返回顶部 返回列表