sklearn中的preprocessing数据预处理

sklearn中的preprocessing数据预处理
1. sklearn preprocessing
Standardization即标准化,尽量将数据转化为均值为零,⽅差为⼀的数据,形如标准正态分布(⾼斯分布)。实际中我们会忽略数据的分布情况,仅仅是通过改变均值来集中数据,然后将⾮连续特征除以他们的标准差。
潜流湿地1.1 标准化:去均值,⽅差规模化
Standardization标准化:将特征数据的分布调整成标准正太分布,也叫⾼斯分布,也就是使得数据的均值为0,⽅差为1.
标准化的原因在于如果有些特征的⽅差过⼤,则会主导⽬标函数从⽽使参数估计器⽆法正确地去学习其他特征。
标准化的过程为两步:去均值的中⼼化(均值变为0);⽅差的规模化(⽅差变为1)。
(1) 在sklearn.preprocessing中提供了⼀个scale的⽅法
In [149]:from sklearn import preprocessing
In [150]:import numpy as np
In [151]: X = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
In [152]: X_scaled = preprocessing.scale(X)
In [153]: X_scaled
Out[153]:
array([[0.,-1.22474487,1.33630621],
[1.22474487,0.,-0.26726124],
[-1.22474487,1.22474487,-1.06904497]])
#scaled之后的数据零均值,单位⽅差
In [154]: an(axis=0)
Out[154]: array([0.,0.,0.])
# # axis=1表⽰对每⼀⾏去做这个操作,axis=0表⽰对每⼀列做相同的这个操作
In [155]: X_scaled.std(axis=0)
Out[155]: array([1.,1.,1.])
(2) StandardScaler计算训练集的平均值和标准差,以便测试数据集使⽤相同的变换
preprocessing这个模块还提供了⼀个实⽤类StandarScaler,它可以在训练数据集上做了标准转换操作之后,把相同的转换应⽤到测试训练集中。
这样就可以对训练数据,测试数据应⽤相同的转换,以后有新的数据进来也可以直接调⽤,不⽤再重新把数据放在⼀起再计算⼀次了。
>>>from sklearn.preprocessing import StandardScaler
>>> data =[[0,0],[0,0],[1,1],[1,1]]
>>> scaler = StandardScaler()
>>>print(scaler.fit(data))# 调⽤fit⽅法,根据已有的训练数据创建⼀个标准化的转换器
StandardScaler(copy=True, with_mean=True, with_std=True)
>>>an_)
[0.50.5]
>>>ansform(data))# 使⽤上⾯这个转换器去转换数据data,调⽤transform⽅法
[[-1.-1.]
[-1.-1.]
[1.1.]
[1.1.]]
>>>ansform([[2,2]]))# 对于新来的⼀组样本,也想得到相同的转换
[[3.3.]]
注 :
1)StandardScaler()中可以传⼊两个参数:with_mean,with_std.这两个都是布尔型的参数,默认情况下都是true,但也可以⾃定义成false.即不要均值中⼼化或者不要⽅差规模化为1.
2)scale和StandardScaler可以⽤于回归模型中的⽬标值处理。
(3) 将数据特征缩放⾄某⼀范围(from sklearn.preprocessing import MinMaxScaler)
也就是使得特征的分布是在⼀个给定最⼩值和最⼤值的范围内的。⼀般情况下是在[0,1]之间,或者是特征中绝对值最⼤的那个数为1,其他数以此维标准分布在[[-1,1]之间
以上两者分别可以通过MinMaxScaler 或者 MaxAbsScaler⽅法来实现。
之所以需要将特征规模化到⼀定的[0,1]范围内,是为了对付那些标准差相当⼩的特征并且保留下稀疏数据中的0值。
MinMaxScaler(最⼩最⼤值标准化)
In [159]: from  sklearn import  preprocessing
# 将数据缩放⾄[0, 1]间。训练过程: fit_transform()
辣椒红素的提取
In [160]: X_train = np .array ([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
In [161]: min_max_scaler = preprocessing .MinMaxScaler ()
In [162]: X_train_minmax = min_max_scaler .fit_transform (X_train )
In [163]: X_train_minmax
Out [163]:
array ([[0.5      , 0.        , 1.        ],
[1.        , 0.5      , 0.33333333],
[0.        , 1.        , 0.        ]])
# 将上述得到的scale 参数应⽤⾄测试数据
In [164]: X_test = np .array ([[ -3., -1., 4.]])
In [165]: X_test_minmax = min_max_scaler .transform (X_test )
In [166]: X_test_minmax
Out [166]: array ([[-1.5      ,  0.        ,  1.66666667]])
# 可以⽤以下⽅法查看scaler 的属性
In [167]: min_max_scaler .scale_
Out [167]: array ([0.5      , 0.5      , 0.33333333])
In [168]: min_max_scaler .min_
Out [168]: array ([0.        , 0.5      , 0.33333333])
MaxAbsScaler(绝对值最⼤标准化)
与上述标准化⽅法相似,但是它通过除以最⼤值将训练集缩放⾄[-1,1]。这意味着数据已经以0为中⼼或者是含有⾮常多0的稀疏数据。X _std =(X .max (axis =0)−X .min (axis =0))
(X −X .min (axis =0))X _scaler =+(max −min )X td s min
In [169]: X_train = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
In [170]: max_abs_scaler = preprocessing.MaxAbsScaler()
In [171]: X_train_maxabs =max_abs_scaler.fit_transform(X_train)
In [172]: X_train_maxabs
Out[172]:
彩油墨array([[0.5,-1.,1.],
[1.,0.,0.],
[0.,1.,-0.5]])
In [173]: X_test = np.array([[-3.,-1.,4.]])
In [174]: X_test_maxabs = max_ansform(X_test)
In [175]: X_test_maxabs
Out[175]: array([[-1.5,-1.,2.]])
In [176]: max_abs_scaler.scale_
Out[176]: array([2.,1.,2.])
(4) 规模化稀疏数据
对稀疏数据进⾏去均值的中⼼化会破坏稀疏的数据结构。此时可以⽤其他⽅法对稀疏的输⼊数据进⾏转换,特别是那些特征之间的数据规模不⼀样的数据。MaxAbsScaler 和 maxabs_scale这两个⽅法是专门为稀疏数据的规模化所设计的。
(5) 规模化有异常值的数据
如果数据有许多异常值,那么使⽤数据的均值与⽅差去做标准化就不⾏了。
在这⾥,你可以使⽤robust_scale 和 RobustScaler这两个⽅法。它会根据中位数或者四分位数去中⼼化数据。
1.2 正则化Normalization
正则化是将样本在向量空间模型上的⼀个转换,经常被使⽤在分类与聚类中。
函数normalize 提供了⼀个快速有简单的⽅式在⼀个单向量上来实现这正则化的功能。正则化有l1,l2等,这些都可以⽤上:
In [42]:import numpy as np
# # 创建⼀组特征数据,每⼀⾏表⽰⼀个样本,每⼀列表⽰⼀个特征
In [43]: x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
In [44]:from sklearn import preprocessing
In [45]: x_normalized = alize(x, norm='l2')
In [46]: x
Out[46]:
array([[1.,-1.,2.],
[2.,0.,0.],
[0.,1.,-1.]])
In [47]: x_normalized
Out[47]:
array([[0.40824829,-0.40824829,0.81649658],
[1.,0.,0.],
[0.,0.70710678,-0.70710678]])
# preprocessing这个模块还提供了⼀个实⽤类Normalizer,实⽤transform⽅法同样也可以对新的数据进⾏同样的转换In [48]: normalizer = preprocessing.Normalizer().fit(x)
In [49]: normalizer
Out[49]: Normalizer(copy=True, norm='l2')
#  对训练数据进⾏正则
In [50]: ansform(x)
Out[50]:
array([[0.40824829,-0.40824829,0.81649658],
悬浮机器人[1.,0.,0.],
[0.,0.70710678,-0.70710678]])
方波信号发生器# 对新的测试数据进⾏正则
In [51]: ansform([[-1.,1.,0.]])
Out[51]: array([[-0.70710678,0.70710678,0.]])
normalize和Normalizer都既可以⽤在密集数组也可以⽤在稀疏矩阵(scipy.sparse)中
1.3 特征的⼆值化
特征的⼆值化是指将数值型的特征数据转换成布尔类型的值。可以使⽤使⽤类Binarizer。
In [52]: binarizer = preprocessing.Binarizer().fit(x)
In [53]: ansform(x)# 默认是根据0来⼆值化,⼤于0的都标记为1,⼩于等于0的都标记为0
Out[53]:
array([[1.,0.,1.],
[1.,0.,0.],
[0.,1.,0.]])
In [54]: binarizer = preprocessing.Binarizer(threshold=1.5)# 也可以⾃⼰设置这个阀值,只需传出参数threshold即可
In [55]: ansform(x)
Out[55]:
array([[0.,0.,1.],
[1.,0.,0.],
[0.,0.,0.]])
binarize and Binarizer都可以⽤在密集向量和稀疏矩阵上。
1.4 类别特征编码
我们知道特征可能是连续型的也可能是类别型的变量,⽐如说:
特征⼀的特征值:[“male”, “female”],
卷染机特征⼆的特征值:[“from Europe”, “from US”, “from Asia”],
特征三的特征值:[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”].
这些类别特征⽆法直接进⼊模型,它们需要被转换成整数来表征,⽐如:
[“male”, “from US”, “uses Internet Explorer”] 对应的编码 [0, 1, 3]
[“female”, “from Asia”, “uses Chrome”] 对应的编码 [1, 2, 1].
...
然⽽上⾯这种表征的⽅式仍然不能直接为scikit-learn的模型所⽤,因为模型会把它们当成序列型的连续变量。
要想使得类别型的变量能最终被模型直接使⽤,可以使⽤one-of-k编码或者one-hot编码。这些都可以通过OneHotEncoder实现,它可以将有n种值的⼀个特征变成n个⼆元的特征。
In [61]: enc = preprocessing.OneHotEncoder()
In [62]: enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
Out[62]:
OneHotEncoder(categorical_features='all', dtype=<class'numpy.float64'>,
handle_unknown='error', n_values='auto', sparse=True)
In [63]: ansform([[0,1,3]]).toarray()
Out[63]: array([[1.,0.,0.,1.,0.,0.,0.,0.,1.]])
In [64]: enc = preprocessing.OneHotEncoder(n_values=[2,3,4])
In [65]: enc.fit([[1,2,3],[0,2,0]])
Out[65]:
OneHotEncoder(categorical_features='all', dtype=<class'numpy.float64'>,
handle_unknown='error', n_values=[2,3,4], sparse=True)
In [66]: ansform([[1,0,0]]).toarray()
Out[66]: array([[0.,1.,1.,0.,0.,1.,0.,0.,0.]])
特征1中有(0,1)两个值,特征2中有(0,1,2)3个值,特征3中有(0,1,2,3)4个值,所以编码之后总共有9个⼆元特征。
但也会存在这样的情况,某些特征中可能对⼀些值有缺失,⽐如明明有男⼥两个性别,样本数据中都是男性,这样就会默认被判别为只有⼀类值。这个时候我们可以向OneHotEncoder传如参数n_values,⽤来指明每个特征中的值的总个数,如上enc =
preprocessing.OneHotEncoder(n_values=[2,3,4])
1.5 弥补缺失数据
在scikit-learn的模型中都是假设输⼊的数据是数值型的,并且都是有意义的,如果有缺失数据是通过NAN,或者空值表⽰的话,就⽆法识别与计算了。
要弥补缺失值,可以使⽤均值,中位数,众数等等。Imputer这个类可以实现。

本文发布于:2024-09-23 05:30:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/314723.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   特征   均值   训练   分布   模型   样本
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议