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

sklearn Preprocessing 数据预处理

[复制链接]
8 n' T4 u7 y6 o. S

sklearn Preprocessing 模块

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

标准化和归一化:

6 ?4 g% I: K( i4 o, m5 {

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

+ @# a# H: ?7 c y

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

6 d A# N# S x. f$ L- L, ]

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

/ |; M7 L9 h0 V* u% I: K

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

) d- J' p; {9 K/ k* |/ ]4 V! Z

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

* `$ @. s4 E2 E% ?4 V. m

导入模块:

( O" @* D8 x: q0 a
from sklearn.preprocessing import StandardScaler) N# ^# E5 M# o: o8 z; } from sklearn.preprocessing import MinMaxScaler 2 {2 u5 @ J* J5 q9 T; ` from matplotlib improt gridspec - Q1 c5 n) x$ b( Y% z2 x! V import numpy as np# T$ p0 U2 p: H" Z, i7 J/ }& @" G import matpotlib.pyplot as plt
- A% j4 |0 U; o( `% j- }# @0 y

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

! i5 m8 H8 i" @/ Z

标准化的过程分为两步:

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

x_scale = preprocessing.scale(x)

; a, X2 `6 u0 F: Y T% j
std = StandardScaler()# \% a+ }7 T: R data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]]) ; E, P. E3 D r$ T$ l) X7 V# S- Q7 W+ r # 将标准化后的数据转换为原始数据。 4 K, R7 L* m4 {' N, F# n. D std.inverse_transform()
/ j/ E9 M* L5 G1 t& o6 P

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

! e( h$ [( d" h* x$ @3 a
x_scale.mean(axis=0)# 均值
7 g$ X( ?! f+ g! h, j3 K) Q9 g

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

2 Q' O+ c' ^" I$ o% g* h
x_scale.mean(axis=1)
M( H' v( J' W- N l1 J

`

1 a3 J% _5 T4 g! w
cps = np.random.random_integers(0, 100, (100, 2)) w, S3 Z' _% S g, m; w. [6 d # 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集. 2 m- ^# W- ^: b6 `8 [7 S ss = StandardScaler() * t! B7 `" {; Q( B9 I$ o std_cps = ss.fit_transform(cps) - _1 y* b% ~, J1 O gs = gridspec.GridSpec(5,5)# M/ v1 {) \6 u. E# F fig = plt.figure() 1 G' s* M3 u+ z8 K+ e( R9 ^7 ~ ax1 = fig.add_subplot(gs[0:2, 1:4]) z' g9 x0 }+ E1 W0 { ax2 = fig.add_subplot(gs[3:5, 1:4]) ( Q+ }3 e7 K9 H ax1.scatter(cps[:, 0], cps[:, 1]) $ z. D7 z! l: N4 l1 K9 v ax2.scatter(std_cps[:, 0], std_cps[:, 1]) 3 t7 v5 { K T8 `2 A4 B plt.show()
: W( ?. H5 N& Y, o- E

`

/ A9 b% v4 C q* O) Z
from sklearn.preprocessing import StandardScaler5 G- l9 i6 X, e9 e, X from sklearn.preprocessing import MinMaxScaler 2 C4 m; w3 l5 S5 j" t* F from matplotlib import gridspec 1 V/ c9 ] B4 v+ n7 I import numpy as np 2 V' M. Y; \0 J' q+ A7 V7 ] import matplotlib.pyplot as plt . N! f% c/ R! ~ data = np.random.uniform(0, 100, 10)[:, np.newaxis]; U: i: p3 C B5 B" k4 Y ss = StandardScaler() 1 a: s& C$ f& F6 K% d- w std_data = ss.fit_transform(data)/ G+ V8 `% s1 g origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据 & |8 B# _- r( K print(data is 原始数据,data), d$ s4 h- d p, b) n$ Y- d/ G print(after standard 标准化后的数据,std_data)( |" r: o. ?" ]. u1 L1 r7 E W print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data) 2 O. F3 ?9 ]: B9 C print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data))
F7 ~. r$ j0 @0 G+ M/ O8 D

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

4 B1 u8 ~( Y9 ^& ?( w9 U; E0 n
data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据. ?5 F6 Y2 l: [, n0 M mm = MinMaxScaler()# 创建MinMaxScaler 对象 1 ^: y3 _+ e5 _ mm_data = mm.fit_transform(data) # 归一化数据 3 L3 E3 K* m5 t1 a/ g, w* o7 p origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据 7 Z# v8 R) F7 @# o2 ? print(data is ,data) , q+ y# l0 }/ z) h- _+ K6 g5 s print(after Min Max ,mm_data)# S/ @1 z2 x" h' L. E1 y5 D5 E$ ]( v print(origin data is ,origin_data)
# g* q( I: P1 n, _2 N2 m

MinMaxScaler和MaxAbsCaler:

8 }: r& C" F* U

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

+ q, ~0 }5 P: W, [

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

6 ?# s: t/ |. p- n8 G* m- |
min_max_scaler = preprocessing.MinMaxScaler()* O/ y3 |& j: e) w: M& B- I x_minmax = min_max_scaler.fit_transform(x) ; h3 J6 w- h6 [) U6 Z% v x_minmax
* v: ]# M6 i: y$ i

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

3 k5 g! R7 s R& Y
x_test = np.array([[-3., -1., 4.]])4 t' N. h! i9 i4 J, y: k x_test_minmax = min_max_scaler.transform(x_test)( C. N/ g9 l. q+ b, Y) x; [ x_test_minmax
! e6 v5 A: R5 Q6 ? @2 _

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

; B9 ~! x* F# L! B4 m: i3 T
max_abs_scaler = preprocessing.MaxAbsScaler() % Q" w9 n+ G) j4 Z* k; _% J# T x_train_maxsbs = max_abs_scaler.fit_transform(x) 6 L! j" p) g ^ x_train_maxsbs
7 r6 H7 `1 G5 p

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

! c( d9 E! x& B3 z1 w2 `
x_test = np.array([[-3., -1., 4.]]) 1 g, p! c* L2 p( D4 v0 H% G1 V: L x_test_maxabs = max_abs_scaler.transform(x_test) / I5 v5 U0 e3 e0 q J- e5 u x_test_maxabs
; j. e# |" }6 f. z! j2 D4 c7 l

针对规模化稀疏数据

/ r$ u8 i# ~2 O" D+ s4 `3 {* a

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

9 z2 t. X# m9 k+ Y

MaxAbsScaler,和maxabs_scale

0 f5 c9 s: Y G9 e

针对规模化有异常的数据

1 a: n0 o( @6 X! m+ {2 V

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

+ D& k3 U& ^4 F3 _: X/ }

正则化Normalization

& x7 f1 s# J. `& n) d. N4 x

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

9 d: t* w9 X( j
x_normalized = preprocessing.normalize(x, norm=l2): v3 e3 n% b6 F# ~- g print x 9 ]4 F( k* ~* j print x_normalized
i2 C7 G# ^: w% M2 S6 k* M

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

! F7 k: D4 R% s4 M
normalizer = preprocessing.Normalizer().fit(x)/ S% f0 d* R- p( L; q! d normalizer
* Q7 \& M: t) I+ x% L

# 对训练数据进行正则

& }3 d s7 s8 f, |" ]" ^
normalizer.transform(x)
4 V) _4 O- y' ~& k+ ?( r9 N

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

/ Y( ]5 I5 E4 ?+ T# N8 U& |
normalizer.transform([[-1., 1., 0.]])
8 x9 w+ u* b# ~# ]- V

二值化

2 Y' M n9 k- K# E' \1 I

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

9 g& ^% |0 I, {$ x3 r. y
from sklearn import preprocessing 8 [' d6 t9 M% a5 p* A import numpy as np, _7 j4 W1 N0 ?8 S$ j C$ F 3 Y# Z! o' s! s0 o* p5 O- I* {5 D # 创建一组特征数据,每一行表示一个样本,每一列表示一个特征 8 g7 Z) l) k2 P% d x = np.array([[1., -1., 2.], $ D1 a0 m% l; g& G( D [2., 0., 0.],9 G8 U% o) M- [9 u7 w [0., 1., -1.]]) 9 d, t9 y1 G4 {/ J , b6 k$ s4 U5 \# O, }+ n binarizer = preprocessing.Binarizer().fit(x) 0 N9 [" X0 n# M, F. K! W1 s3 ^8 p binarizer.transform(x)* j" l5 q$ f J1 K! ^* o $ ?9 m* N; r4 \7 p: i& t binarizer = preprocessing.Binarizer(threshold=1.5)% N. h3 p' R% g# O# r# v( n binarizer.transform(x)
+ I, @$ l, d1 S( i/ N }

为类别特征编码

' S4 X+ T6 }" j7 }! V

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

$ ~' }, y2 l1 s) O1 L

OneHotEncoder

/ [1 N+ V# ?8 N( K& u

弥补缺失数据

3 z4 Q9 p& Q& `1 `" T. o

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

# i9 Z- x' v0 ?3 _
import numpy as np * L0 o/ U0 ~' {/ y) B% { Z- g from sklearn.preprocessing import Imputer( U" U8 r$ a6 Y9 \ imp = Imputer(missing_values=NaN, strategy=mean, axis=0), M- a# @# V- c; W( f0 O9 G imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]]) 8 [) C9 E1 J+ z8 N; H, V. B x = [[np.nan, 2], [6, np.nan], [7, 6]] 8 R& c7 u( |" z imp.transform(x)
- N0 R4 f! ?- S" \

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

) S8 X2 ?; q; r2 x7 I) k
import scipy.sparse as sp 9 `! r3 \, J& { # 创建一个稀疏矩阵 $ _# f" e7 s+ F) j# t1 G' I x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) 2 q6 \. y9 |, V, Z imp = Imputer(missing_values=0, strategy=mean, verbose=0) ( c& }. L% |! l B imp.fit domain name is for sale. Inquire now.(x) & |" z. }% L# R: U9 M2 T: x! ^6 r x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]]) ( K7 ~ v" o, U( s+ H- A imp.transform(x_test)
m* A. I0 q' `+ c. m9 _

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

) v2 q G6 R4 }! f

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

, J ^" [0 J. S+ V! _( U

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

% e9 M: C- C \! L

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

- Y! v7 e& J5 i: Y# t0 j

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

% O }) T! ?7 A- G

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

1 Q8 v- \! Z: _* Q- U

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

0 w' H) }7 T k8 g+ }

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

+ U* r$ n3 o$ F- K

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

1 ?4 h: Y: Y1 i6 X; Y

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

`0 o4 T0 ?5 f9 n7 J3 t

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

: T/ k& Z' W3 t/ U# _2 }2 I% r

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

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

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

0 C# v+ x) Z& d$ H- r: L9 y& a' C0 Q( H7 n7 h) |# X5 U) Y, [+ } * K4 g1 ~- F# u7 q u7 j3 a ! @1 d1 D1 T/ Y$ q, f$ n4 l9 z! ?( I! s 8 N8 t1 `& N/ Y* K$ e; }0 h
回复

举报 使用道具

相关帖子

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