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

sklearn Preprocessing 数据预处理

[复制链接]
" t' O& |+ X: I* E( o

sklearn Preprocessing 模块

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

标准化和归一化:

. C v& m8 k$ M' R& f3 `8 d

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

q7 K/ f% g/ l$ \, ^

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

: u! z' z( r1 k; [7 ^

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

- w t% z* j) A1 P9 l: L

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

! q5 j" M; x& h# S4 j

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

3 ]3 g. v2 c% R4 R8 h1 \

导入模块:

" g# C& I7 I( Y. w& D+ s7 H
from sklearn.preprocessing import StandardScaler) T; R2 t' P& V9 c/ ] from sklearn.preprocessing import MinMaxScaler0 i' b b3 D- {7 s' S- M from matplotlib improt gridspec1 G: E3 E8 z2 b: z; M import numpy as np0 u( X) q1 n" J import matpotlib.pyplot as plt
: O1 P- Y) V& I+ z* ^! b1 d2 D

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

7 U- {" C7 C# g& G# |4 L

标准化的过程分为两步:

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

x_scale = preprocessing.scale(x)

7 g) E+ b2 i8 s! `; g" L+ L
std = StandardScaler()+ K4 p1 p6 {4 h data = std.fit_transform(data[["RSSI0", "RANGES", "weekday", "hour", "RSS_mean", "RANGES_mean", day_label]]) ; B( ]7 u( d! s2 E% M9 r / Z/ I5 ?0 Z% \1 g # 将标准化后的数据转换为原始数据。! t7 J/ b0 {- u; w( {; U std.inverse_transform()
+ C8 x5 ~- I) h7 u# P" J) }8 ^

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

7 f% P5 u4 R9 V
x_scale.mean(axis=0)# 均值
! P1 v1 e" k! K! g( v) D1 `

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

) J! ~0 m# s" x5 |4 ]3 {) ]- F
x_scale.mean(axis=1)
1 E8 d1 @; q) w0 [" G2 w' G0 A

`

/ W* [8 N' { x$ _5 g4 M7 P
cps = np.random.random_integers(0, 100, (100, 2)) ! t3 a: z. C$ B" r' k( b# j) F. O8 j # 创建StandardScaler 对象,再调用fit_transform 方法,传入一个格式的参数数据作为训练集.! ~) B4 }+ Z7 Q0 B- K' K* @3 M ss = StandardScaler() 1 k# M, b) {( h7 N9 M7 D std_cps = ss.fit_transform(cps) ' ?( q4 ^1 H1 X/ l6 F3 F2 ]5 Q/ K gs = gridspec.GridSpec(5,5)* ]) b0 X( Z4 P8 W fig = plt.figure() 8 h- u6 g6 z$ a3 y ax1 = fig.add_subplot(gs[0:2, 1:4]) " ^0 A: @+ m# [7 X8 Q/ o ax2 = fig.add_subplot(gs[3:5, 1:4])0 \1 u. U* h7 W: z" u# \ ax1.scatter(cps[:, 0], cps[:, 1])3 [; H6 `7 `8 T5 C ax2.scatter(std_cps[:, 0], std_cps[:, 1]) 4 a' j5 Q S" h plt.show()
5 i _4 ] V( V, S! [

`

% e& j9 k9 i5 h9 _7 o3 j
from sklearn.preprocessing import StandardScaler + {; K+ D- o/ W& g from sklearn.preprocessing import MinMaxScaler 1 }0 T- i6 O1 K7 ? from matplotlib import gridspec $ @) Y. \6 Y6 b, J import numpy as np3 F5 z9 B8 B3 y7 v1 g; N# v! L import matplotlib.pyplot as plt% F5 c) K2 X# ~, ]3 S5 _' @1 S data = np.random.uniform(0, 100, 10)[:, np.newaxis]% D. W- M8 A, o1 {: g ss = StandardScaler()+ }7 ]" F& Y* U" d std_data = ss.fit_transform(data) # p5 l: F# x9 D$ `0 x* M* k origin_data = ss.inverse_transform(std_data) # 得到标准化之前的数据 7 a$ n( g6 i$ z& y7 X5 P. Y W) v print(data is 原始数据,data) 9 _9 v1 E8 k! J& e9 `# N) o' c5 O& ? print(after standard 标准化后的数据,std_data)6 y4 \# g S) d9 [' j! B1 e print(after inverse 通过inverse_transform该函数将标准化后的数据转化为原始数据:,origin_data) 4 i( Y! J: Q6 v/ k+ | print(after standard mean and std is 均值mean(均值) 和 标准差std(矩阵标准差),np.mean(std_data), np.std(std_data))
' }* T0 N1 G! l k5 d6 J

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

2 E2 y+ V8 ~; {% o7 N/ Y& d b; e
data = np.random.uniform(0, 100, 10)[:, np.newaxis] # 创建数据! Y1 a, b, G3 u5 \: A# H mm = MinMaxScaler()# 创建MinMaxScaler 对象' v6 O$ A: L5 x* {$ p, a9 e. y mm_data = mm.fit_transform(data) # 归一化数据3 N; ^- S& m- F8 M( p1 N( q' q origin_data = mm.inverse_transform(mm_data) # 转换成归一化之前的数据' v' J. \- O% E/ i& i print(data is ,data)8 L0 X# r1 \" [* h4 k0 M" p print(after Min Max ,mm_data) ( Z+ X. M9 W, t print(origin data is ,origin_data)
* N Y# L) X. \

MinMaxScaler和MaxAbsCaler:

0 w/ W8 u2 y. P( B7 V

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

. |8 T: b P9 Q7 B5 r

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

, n0 @& x: ~, g' d# I1 h* z. r" l
min_max_scaler = preprocessing.MinMaxScaler() $ p1 Y9 B P9 F6 M3 v% x x_minmax = min_max_scaler.fit_transform(x)9 z: h- A1 @& ] x_minmax
7 W& t+ E3 Y( b9 `

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

, b* ]. Y9 q8 R* _& i( x
x_test = np.array([[-3., -1., 4.]])5 A2 V* ]- ^$ Q6 M9 w: M) D6 t x_test_minmax = min_max_scaler.transform(x_test) ' f M( r+ z2 d x x_test_minmax
, C* n# h* A5 V! `3 X$ {

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

5 d% ~; L- @2 \' K( j. O& E3 ~2 I
max_abs_scaler = preprocessing.MaxAbsScaler() * i+ }3 \: K9 Z) |2 m x_train_maxsbs = max_abs_scaler.fit_transform(x) , e) i9 U4 ?+ U0 e x_train_maxsbs
' _% n# H2 @. M. t v' a- e* `

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

& b( _6 d8 b+ |8 w
x_test = np.array([[-3., -1., 4.]]) ^* O7 ]( m2 f3 |# }- X x_test_maxabs = max_abs_scaler.transform(x_test), o3 D4 ~, V( M9 x x_test_maxabs
) Q1 X. j8 c+ s! e* x7 W

针对规模化稀疏数据

5 P- E4 L, }8 T

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

7 O2 L% Z+ q7 C5 t- l

MaxAbsScaler,和maxabs_scale

: r; S& `7 r5 X. P4 E9 S

针对规模化有异常的数据

% {! l1 ]# j7 L0 Q! Z* e; c

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

" W. \" p0 i4 Q) J2 u# z' t

正则化Normalization

3 y+ }, X7 y! @ u

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

( r }( l7 I5 v" N. n
x_normalized = preprocessing.normalize(x, norm=l2) / \0 r* M2 u' F1 r9 s- E print x% N% i5 I! H- |+ |. n print x_normalized
$ m6 h3 U! t# T/ j# h

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

2 J* F4 W- R2 F$ V/ k# E
normalizer = preprocessing.Normalizer().fit(x)) c3 `& b4 R& e! j) e normalizer
3 K% G7 O( N& d

# 对训练数据进行正则

6 t3 m' x$ L$ D! \ j3 D& X( [. H% R9 z
normalizer.transform(x)
3 M+ g+ ^5 H6 f9 X

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

! \& [6 z; W% R. U6 D- A6 T
normalizer.transform([[-1., 1., 0.]])
0 ?5 K! c5 w. J* w/ N; E5 M7 Q, t

二值化

2 O8 O# q! {6 i9 ~ U

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

, T* C* E/ v8 ?; J! v0 [' M
from sklearn import preprocessing 0 { z9 |2 b, P5 \% D4 M4 s& f import numpy as np7 x" r# V f; l/ h( }/ E - B' x" ~* Z3 L+ ^ # 创建一组特征数据,每一行表示一个样本,每一列表示一个特征 5 x% f$ Z3 E9 q7 H s* @ x = np.array([[1., -1., 2.],3 x& @' i# u" H' }9 R [2., 0., 0.], 0 L6 L3 |- V2 [5 i& y [0., 1., -1.]])2 m0 f9 _$ V% ]' S7 O% N& m % n4 @, v4 a5 r! H; d8 G# O binarizer = preprocessing.Binarizer().fit(x) 1 \5 S3 v+ X+ ~7 l6 b: W; K binarizer.transform(x) ! s9 E& Y4 R1 b# f2 |! P 6 n& V' M2 `5 Y$ _6 t binarizer = preprocessing.Binarizer(threshold=1.5)# s- H# l4 ~" P2 B binarizer.transform(x)
7 G2 V, O$ y( o5 _, X

为类别特征编码

& } m+ x% a5 e; W S0 M; W! g

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

) ?) c8 u! |# b4 t. }

OneHotEncoder

) |) M% e' o U6 s. i

弥补缺失数据

* w: d0 x7 G$ h0 p) L

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

4 ~& b. i- D) X: `
import numpy as np r# i) _2 X. W' K from sklearn.preprocessing import Imputer2 U! `7 @2 ~' G" u; P* t8 ] imp = Imputer(missing_values=NaN, strategy=mean, axis=0) 8 Q$ M! W# @1 T9 O9 A! [ imp.fit domain name is for sale. Inquire now.([[1, 2], [np.nan, 3], [7, 6]]) + j B) A% ?' a( h1 o x = [[np.nan, 2], [6, np.nan], [7, 6]]) Q7 _1 ^& U L9 r, O8 X imp.transform(x)
3 T! _+ C# d, A: T) y8 C- P

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

, v. n( N6 q+ I
import scipy.sparse as sp" C: t* C" U+ R- b. E8 Q # 创建一个稀疏矩阵 ( z' h8 _; v& y6 V4 G$ ? x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])0 H: l3 q! @& [0 G6 W) B imp = Imputer(missing_values=0, strategy=mean, verbose=0)* v$ C+ }: v& Z imp.fit domain name is for sale. Inquire now.(x)" T: H$ w8 [1 P( O x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])7 D% b) K& F% c# q imp.transform(x_test)
$ d9 l9 o4 Q5 Y5 X& G* K

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

) `8 h+ z: U. V6 I6 P

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

; Q8 L, M# E! ]* v' G: `5 a# g

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

- H: ^& O! @# W; O# S' C; _5 }

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

& y; l' x, l, j/ d& p4 N5 l

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

# I2 l% ]% \* p( g% D' o

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

$ v2 a% i3 c0 Q3 I/ j- w# M% u( s

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

' @+ O3 {1 j$ g: C, S

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

& u4 ?0 P2 z) a2 Q5 D0 _; ^9 S1 f

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

% T# |) V& z( J. H

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

5 Q' a: s. b0 q# O# @% o/ m

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

& K: n2 a+ D% f- ?

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

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

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

M2 m7 ]- l* E, i+ i5 r1 j( s- t/ R 2 o8 C/ f& C* @& J3 b0 I# j0 Z/ F! t/ M ( C/ b: g u! x. Z0 f9 G3 T h+ L7 O1 ]4 _- `6 S2 `/ V
回复

举报 使用道具

相关帖子

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