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

sklearn Preprocessing 数据预处理

[复制链接]
9 s+ C: b: }+ \1 G! h

sklearn Preprocessing 模块

对数据进行预处理的优点之一就是能够让模型尽快收敛.

标准化和归一化:

( r, _4 t8 C* T% K- Y9 X6 {; M

归一化是标准化的一种方式,

9 I, g5 Z F/ |; x$ `9 p7 b

归一化是将数据映射到[0,1]这个区间中,

8 k" j$ S; F$ Q/ r/ A' ~2 X2 P+ @1 d* J

标准化是将数据按照比例缩放,使之放到一个特定区间中,

# I/ _! }) `' ]. e

标准化后的数据均值为0,标准差等于1,因而标准化的数据可正可负.

( t4 i& [2 L# w

如果原始数据不符合高斯分布的话,标准化后的数据效果并不好.(标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征.)

/ A5 F7 |$ J. D1 o: `' N9 E

导入模块:

) P, p. |; g, |1 n
from sklearn.preprocessing import StandardScaler 1 ]; j% D5 A2 ]- T0 L0 `0 C" k$ ^- W% ] from sklearn.preprocessing import MinMaxScaler( ?/ r! P! `) N1 t { from matplotlib improt gridspec) Y1 ~% V# c, \; Z" |4 q5 w, O import numpy as np 4 ]' w! v% c* K4 G! F, E* v; r import matpotlib.pyplot as plt
, k2 w4 @6 t) G3 m5 j; Y

使用sklearn 进行标准化和标准化还原

/ Z' A% ?& g% d' }

标准化的过程分为两步:

去均值的中心化(均值变为0);方差的规模化(方差变为1).将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的

x_scale = preprocessing.scale(x)

( o# X" V; ?/ P9 v/ L$ t
std = StandardScaler()& z8 X+ b; Y: r/ x3 a data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]])+ G0 k3 x/ U$ s3 [0 J# U7 [* A" x : y5 h* _: z& b' g) I0 | # 将标准化后的数据转换为原始数据。 G8 n6 s) D: Y3 G std.inverse_transform()
. s7 P5 F2 ~: v

查看标准化后的数据的均值与方差

( s' I% [9 K; N! I
x_scale.mean(axis=0)# 均值
: D- H* y/ r# |: S+ s

# axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作

4 V2 D+ G7 d% O0 X3 b
x_scale.mean(axis=1)
& o4 l% @ o* ^) i( j0 v

`

8 ~3 R( V1 i. Z4 b' N
cps = np.random.random_integers(0, 100, (100, 2))2 q& L/ b4 x$ O y) V! D # 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集.' y( ~" e! J3 D, ~- Y" P6 @! C ss = StandardScaler(). q7 w1 ^$ J; w std_cps = ss.fit_transform(cps)2 A9 O7 p& p9 u, ^8 ?! z gs = gridspec.GridSpec(5,5) 3 v9 y. `- ]. E- J% @7 J1 z e- k fig = plt.figure()( D9 Q% C% T; m' E& n9 G ax1 = fig.add_subplot(gs[0:2, 1:4]) , ?+ \' W* G* X1 E ax2 = fig.add_subplot(gs[3:5, 1:4]) & U% o1 W: d3 G& z& k) W ax1.scatter(cps[:, 0], cps[:, 1])# M4 z" v* q, S6 ^; h ax2.scatter(std_cps[:, 0], std_cps[:, 1])2 H) F8 z( d9 M/ K1 d% P2 P; i plt.show()
5 r: X9 e( c8 k! V

`

& D4 P( K, A6 y9 L
from sklearn.preprocessing import StandardScaler y9 Q9 I- |9 e( F4 y from sklearn.preprocessing import MinMaxScaler 9 k K* B- z# c6 C( u from matplotlib import gridspec 0 k2 E' r3 `* A% g2 {1 w& { import numpy as np" g$ w4 c9 m- P/ A9 O3 ^. j, \7 f; L import matplotlib.pyplot as plt+ Y( W) J) i! n w$ o% B- s8 P data = np.random.uniform(0, 100, 10)[:, np.newaxis]5 D. Y5 H$ E) E5 ` ss = StandardScaler()! f7 K, F( O+ J: V: T! {$ W std_data = ss.fit_transform(data)6 o g' C, L0 i, m$ { U origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据" L4 x8 ]6 T* b; D! S4 _% [ print(data is 原始数据,data) 2 H1 B- D9 M. C9 j, {' h! s print(after standard 标准化后的数据,std_data)* M% k" U, z' O+ Y0 f0 C* Q, `+ o print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data) 8 G0 d6 W% B& ^7 u/ [' a print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data))
' r+ X2 {! h8 u5 q( W

使用sklearn 进行数据的归一化和归一化还原.

, H( O) E8 l# Z2 M
data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据2 D5 Q% |! x" a. C) U" S mm = MinMaxScaler()# 创建MinMaxScaler 对象# s: L" }" a- v0 F' f' G8 j mm_data = mm.fit_transform(data) # 归一化数据 3 g' Q7 V. {8 y" g# e7 B& Q origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据 + e3 ~* i% o0 d& f8 H5 u print(data is ,data) ; C/ z0 l( N7 y) p5 m$ W print(after Min Max ,mm_data)* g* y, H1 a. C' F/ F* z { print(origin data is ,origin_data)
; }8 E: h- \/ B& s" ]: ^

MinMaxScaler和MaxAbsCaler:

" Z; s4 D" D# O

MinMaxScaler:使得特征的分布在一个给定的最小值和最大值的范围内.一般情况下载0`1之间(为了对付哪些标准差相当小的特征并保留下稀疏数据中的0值.)

) {0 g: J8 `* ~; e7 Q1 e- X- K' @- m

MaxAbsScaler:或者是特征中的绝对值最大的那个数为1,其他依次为标准分布在-1`1之间

9 x7 ?: A* H/ H- m, z& K! b
min_max_scaler = preprocessing.MinMaxScaler()+ l7 Y) T; H2 M4 `( e x_minmax = min_max_scaler.fit_transform(x) ) Z( S6 D7 D% V3 Y1 W x_minmax
) Q R2 B! O- N- L% {( K/ U/ O7 H* [

对于新进来的数据,采用如下方式进行函数调用:

9 X# B: E2 O1 h
x_test = np.array([[-3., -1., 4.]])3 x, b; G. V! D# U x_test_minmax = min_max_scaler.transform(x_test) + h* q# F$ v" S0 I5 y: @: |+ L5 [ x_test_minmax
" @# O) B! R4 l7 C+ j h; {9 L

MaxAbsScaler:数据会被规模化到-1`1之间,就是特征中,所有数据都会除以最大值,该方法对哪些已经中心化均值为0,或者稀疏的数据有意义.

# ?- _# S+ W5 W' u6 g
max_abs_scaler = preprocessing.MaxAbsScaler()# a1 Y/ ?5 o$ h/ Z x_train_maxsbs = max_abs_scaler.fit_transform(x)* `6 N- ?$ {* b7 u$ W( L& h" H8 s x_train_maxsbs
$ c8 O( `% K3 Y; {7 z$ F1 C

# 同理,也可以对新的数据集进行同样的转换

; `0 w5 I* I$ n6 Q; O
x_test = np.array([[-3., -1., 4.]])" m. H6 V3 v, G" Z" A5 S x_test_maxabs = max_abs_scaler.transform(x_test)8 B! o5 S* Q- q- n# v; | x_test_maxabs
0 }$ ?7 a1 p" m2 {/ r7 }1 e

针对规模化稀疏数据

: q' G' w9 |$ N' O4 B

对稀疏数据去均值的中心化会破坏稀疏的数据结构,使用如下两个方法进行处理:

# Z4 N$ Y+ h3 P& [' m& q

MaxAbsScaler,和maxabs_scale

- H `3 J. G0 T' n7 \

针对规模化有异常的数据

' m B+ @) x% L; m0 H

数据集中有很多异常值,就不能使用数据的均值和方差去做标准化了.可以使用robust_scale和RobustScaler ,更具中位数或者四分位数去中心化数据.

, Q! c7 r0 g6 n& ]5 p. i

正则化Normalization

: Z8 J8 F+ a0 D% d5 ^8 x9 K

正则化是将样本在向量空间模型上的一个转换,常常被使用在分类和聚类中,使用函数normalize实现一个单向量的正则化功能.正则化化有I1,I2等

* R/ H3 U5 D# r9 o0 a" n, u6 ]
x_normalized = preprocessing.normalize(x, norm=l2) & `/ t: b/ |1 c c8 d print x " S/ M' ]2 Q: ^5 G7 l7 I print x_normalized
" i+ Q& T6 X# m% o9 z* x

# 根据训练数据创建一个正则器 Normalizer(copy=True, norm=l2)

' S4 ^) e4 ]1 q0 j
normalizer = preprocessing.Normalizer().fit(x)1 n/ z( Z, J4 [. Q9 N normalizer
; J+ J. D5 K# A1 S7 V7 }

# 对训练数据进行正则

: B; S1 A9 w' A) S0 w- E
normalizer.transform(x)
' z% \# O/ E* F' \6 C% ]' X! _, @

# 对新的测试数据进行正则

+ G8 t( b$ m! n! [- U& o
normalizer.transform([[-1., 1., 0.]])
1 e9 W, ~+ }2 H

二值化

9 P3 h7 L# A" D, _4 O

特征的二值化(指将数值型的特征数据转换为布尔类型的值,使用实用类Binarizer),默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0.通过设置threshold参数来更改该阈值

4 { x. ]: K7 ~) a- d
from sklearn import preprocessing 8 F" ]. m+ v; j import numpy as np: \, g0 p1 p0 [$ _, e . {) S9 u \3 m4 @+ a # 创建一组特征数据,每一行表示一个样本,每一列表示一个特征 $ t/ ^: U0 ?5 R Z% _9 r x = np.array([[1., -1., 2.], 4 I, N4 i v4 q [2., 0., 0.],/ `! D8 \5 M; Z* z. }0 _ [0., 1., -1.]]) 6 h: `' }: b: L& M7 F* e% f- U& ^! f3 D' x5 x1 _ binarizer = preprocessing.Binarizer().fit(x)5 D [" G5 ~* i binarizer.transform(x) ) c1 {! U2 |! k+ t- ]1 D; g' A8 ]$ V$ w) d& S# F binarizer = preprocessing.Binarizer(threshold=1.5)$ E. G/ X& m' p0 `! B binarizer.transform(x)
0 u5 ^9 `" }. ^9 B

为类别特征编码

. ^1 P! y) k, L# j

(比如性别:male,来自于哪个国家或地区:from US,使用什么浏览器:users Chrome) 可以转换为 013 或者是其他的数值型编码.

' n2 }- Q- ?0 v {$ K: N; s

OneHotEncoder

7 _6 e4 A5 ~ C1 a' C; V

弥补缺失数据

z1 k8 q( [! P6 S9 }/ k6 N

可以使用均值,中位数,众数等等弥补缺失数据,可以使用Imputer实现.

( M# ~5 J- h1 r$ s" x" v5 X6 ?
import numpy as np ! M" O/ `( I; U from sklearn.preprocessing import Imputer" H' C. Y( ~: _; n$ T7 p4 j imp = Imputer(missing_values=NaN, strategy=mean, axis=0) H) V2 }. j, e! b( _ imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]]) " d2 s! r( T3 x5 l. L- K; n/ b x = [[np.nan, 2], [6, np.nan], [7, 6]] ! T4 M' x% M' ^: W imp.transform(x)
. m$ {6 ?/ K+ S# M- {

Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值

7 G1 J) A1 i- X
import scipy.sparse as sp, g/ S" @( V# r) M- @4 }9 [ # 创建一个稀疏矩阵. A" I+ D. R n3 s; g x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])% _4 r7 B0 J D imp = Imputer(missing_values=0, strategy=mean, verbose=0) ' Y# g, b% ?7 a% R2 j imp.fit domain name is for sale. Inquire now.(x) 1 @) @ R$ `, s% }& q: j$ W( u x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])3 q# E$ M. H% H imp.transform(x_test)
7 t# N% q) Q. _

当我们拿到一批原始的数据

# R- _4 I. f; P8 s! r# e

首先要明确有多少特征,哪些是连续的,哪些是类别的。

# X6 }2 H, K6 g, ~+ c1 j) M

检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。

0 x4 R6 \) l9 o# l8 f

对连续的数值型特征进行标准化,使得均值为0,方差为1。

' j9 t0 \" u, Q9 q0 P* O

对类别型的特征进行one-hot编码。

9 P3 N" x* @. t* v4 c, c3 Y

将需要转换成类别型数据的连续型数据进行二值化。

( h0 H. x* n! d2 g' u

为防止过拟合或者其他原因,选择是否要将数据进行正则化。

" w7 \( E! m. t" P2 i1 ]! E

在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。

# e/ O5 c$ k# E- o, j

根据实际问题分析是否需要对特征进行相应的函数转换。

% T- q) a% u9 }4 X' V+ }

标准化和归一化的缺点:每当有新的数据进来时,就要重新计算所有的点

4 N, `% t# v6 B- u D( F+ G. E4 H) ?

因此针对动态的数据可以采用如下几种计算方法:

3 S: l( P6 J4 }+ M

1.arctan反正切函数标准化.

http://2.in函数标准化

预处理数据的方法总结(使用sklearn-preprocessing)_【人工智能】王小草的博客-CSDN博客

' X _" n3 j! w$ }2 l 1 ?) C8 M$ h' G4 T2 l& p! `" U3 q5 X: E. V. {- `8 P% C* {9 A , r! H' j1 _1 o/ s ; O9 z5 g: ?, A4 ?/ e# \
回复

举报 使用道具

相关帖子

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