sklearn 第二篇:数据预处理

sklearn.preprocessing包提供了几个常用的实用程序函数和变换器类,用于将原始特征向量更改为更适合下游估计器的表示。

转化器(Transformer)用于对数据的处理,例如标准化、降维以及特征选择等,提供的函数大致是:

  • fit(x,y):该方法接受输入和标签,计算出数据变换的方式。
  • transform(x):根据已经计算出的变换方式,返回对输入数据x变换后的结果(不改变x)
  • fit_transform(x,y) :该方法在计算出数据变换方式之后对输入x就地转换。

在转化器中,fit_transform()函数等价于先执行fit()函数,后执行transform()函数。

一,数据标准化

数据标准化是指对数据经过处理后,使每个特征中的数值的均值变为0,标准差变为1。有如下的数据,使用preprocessing包对数据进行标准化处理:

from sklearn import preprocessing
import numpy as np

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])

1,标准正态分布对

scale()是标准化的快捷方式:

X_scaled = preprocessing.scale(X_train)

fit-transform组合:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 

2,把数据缩放到范围

把数据缩放到给定的范围内,通常在0和1之间,或者使用每个特征的最大绝对值按比例缩放到单位大小。

MinMaxScaler(feature_range=(0, 1), copy=True)
MaxAbsScaler(copy=True)

把数据按照最大值和最小值缩放到0和1之间,缩放的公式如下,其中max和min是缩放区间的最大值和最小值:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

使用MinMaxScaler()函数进行缩放:

scaler = preprocessing.MinMaxScaler()
X_scaled=scaler.fit_transform(X_train)

二,数据归一化

通过对原始数据进行线性变换把数据映射到[0,1]或[-1,1]之间,常用的变换函数为:

sklearn提供函数normalize或者fit-transform组合来实现数据的归一化。参数norm是用于标准化每个非0数据的范式,可用的值是 l1和l2 范式。

from sklearn import preprocessing

X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')

normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
normalizer.transform(X)                            

#out
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

三,对分类数据进行编码

把分类数据(标称数据)转换为数值编码,以整数的方式表示。

1,顺序编码

 顺序编码把每一个categorical 特征变换成有序的整数数字特征 (0 到 n_categories - 1),然而,这种整数表示不能直接用于所有scikit-learn估计器,

enc = preprocessing.OrdinalEncoder()
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)  
enc.transform([['female', 'from US', 'uses Safari']])

这样的整数特征表示并不能在scikit-learn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。

因为估计器期望连续输入,并且把类别解释为有序的,但是,集合通常是无序的,无法实现顺序。

2,OneHot编码

另外一种将标称型特征转换为能够被scikit-learn中模型使用的编码是one-of-K, 又称为 独热码或 dummy encoding。 这种编码类型已经在类OneHotEncoder中实现。该类把每一个具有n_categories个可能取值的categorical特征变换为长度为n_categories的二进制特征向量,里面只有一个地方是1,其余位置都是0。

enc = preprocessing.OneHotEncoder()
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)  
enc.transform([['female', 'from US', 'uses Safari']])

三,离散化

 离散化 (Discretization) 也叫 分箱(binning),用于把连续特征划分为离散特征值。

sklearn.preprocessing.KBinsDiscretizer(n_bins=5, encode=’onehot’, strategy=’quantile’)

参数注释:

n_bins:分箱的数量,默认值是5,也可以是列表,指定各个特征的分箱数量,例如,[feature1_bins,feature2_bins,...]

encode:编码方式,{‘onehot’, ‘onehot-dense’, ‘ordinal’}, (default=’onehot’)

  • onehot:以onehot方式编码,返回稀疏矩阵
  • onehot-dense:以onehot方式编码,返回密集矩阵
  • ordinal:以ordinal方式编码,返回分箱的序号

strategy:定义分箱宽度的策略,{‘uniform’, ‘quantile’, ‘kmeans’}, (default=’quantile’)

  • uniform:每个分箱等宽
  • quantile:每个分箱中拥有相同数量的数据点
  • kmeans:每个箱中的值具有与1D k均值簇最近的中心

 举个例子:

from sklearn import preprocessing
X = np.array([[ -3., 5., 15 ],
              [  0., 6., 14 ],
              [  6., 3., 11 ]])
est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X)
est.transform(X) 
#out
array([[ 0., 1., 1.],
       [ 1., 1., 1.],
       [ 2., 0., 0.]])

参考文档:

归一化和标准化的一些理解

5.3. Preprocessing data

猜你喜欢

转载自www.cnblogs.com/ljhdo/p/10600702.html
今日推荐