章神的私房菜之数据预处理

作者:章华燕

编辑:徐松

Scikit-learn实战之数据预处理

——Data Preprocessing


各位看官,我们又见面了,

今天我们继续学习开源包

Scikit-learn

功能之数据预处理

一、数据预处理之重要性和必要性:

对于Scikit-learn中实现的许多机器学习估计来说,对数据集进行规范化是一个通用的需求。如果个别的特征或多或少的不服从与通常的数据分布:例如标准正态分布(均值为0,方差为1),这时算法的效果可能会表现得很差。 实际应用中,我们经常忽略数据分布的形状而仅仅将数据在每个维度特征的均值去除以使其数据集中,然后通过除以某个非常量的方差进行比例化。 例如,在一个机器学习的目标函数中使用的许多元素被假设为以零为中心并且在相同的阶上具有相同的方差。如果某一特征的幅值方差大于其它的特征,他可能会支配目标函数并且使得算法不能够按照我们期望的从其他的特征维度进行学习。

在Scikit-learn中的sklearn.preprocessing包提供了一些公共的实用函数和转换类来将特征行向量转换成更适合于接下来的估计的表示。那么具体如何实现的呢?接着往下看。

二、数据标准化的常用几种方法:

2.1 标准化预处理:

又叫正态化处理,使处理后的样本数据,均值为0方差为1.

具体代码

>>> from sklearn import preprocessing
>>> import numpy as np
>>> X = np.array([[ 1., -1.,  2.],
...               [ 2.,  0.,  0.],
...               [ 0.,  1., -1.]])
>>> X_scaled = preprocessing.scale(X)
>>> X_scaled                                          
array([[ 0.  ..., -1.22...,  1.33...],
           [ 1.22...,  0.  ..., -0.26...],
           [-1.22...,  1.22..., -1.06...]])

标准化后:

>>> X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])
>>> X_scaled.std(axis=0)
array([ 1.,  1.,  1.])

2.2 将特征缩放到一个范围:

一个可供选择的标准化方法是缩放特征到一个给定最大值和最小值之间,经常这个给定的最大值和最小值取值为 0 和 1,或者对每个特征的最大值得绝对值进行归一化。这两种操作可以由MinMaxScalerMaxAbsScaler 来实现。

具体代码

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
           [ 1.        ,  0.5       ,  0.33333333],
           [ 0.        ,  1.        ,  0.        ]])
如果 MinMaxScaler 被指定一个确切的范围 [ min , max ],完整的计算公式如下:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std / (max - min) + min

2.3 稀疏矩阵的缩放:

中心化稀疏数据将会破坏数据的稀疏性,因此这是一件敏感的事情。然而,缩放稀疏输入是有意义的,尤其是特征在不同的尺度上时。

MaxAbsScalermaxabs_scale 是专门为缩放稀疏数据设计的,并且这是被推荐的方法。然而, scale 和 StandardScaler可以接受scipy.sparse矩阵作为输入,只要with_mean=False显试的传递给了构造函数。否则一个ValueError异常将会被抛出。注意,缩放类既接受被压缩的行稀疏矩阵又接受被压缩的列稀疏的矩阵结构(参看scipy.sparse.csr_matrix 和 scipy.sparse.csc_matrix)。任何其它的稀疏输入都会被转化成压缩的行表示。为了避免不必要的内存复制,推荐选择CSR 或者 CSC 表示输入流。

最后,如果希望中心化的数据足够小,那么一个可选的方案就是可以使用稀疏矩阵的toarray方法来将输入转化成一个矩阵。


2.4 缩放具有异常点的数据:

如果你的数据包含很多异常点,那么使用均值和方差来缩放数据似乎效果不是很好。在这种情况下,你可以使用 robust_scale 和 RobustScaler 来替代。他们使用更鲁棒的方法来估计数据的中心和范围。


三、归一化:

归一化是将单个的样本缩放到统一规范的处理过程。如果你想使用二次形式例如点积或者任何其他的核来度量两个样本的相似性的话,这个处理过程非常有用。 这个假设是基于向量空间模型经常被使用于文本分类或者聚类的环境中。函数 normalize提供了一个快速和简单的方法在一个类数组的数据集上来执行该操作,使用 L1 或者L2 范式。

具体代码


>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')
>>> X_normalized                                      
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

preprocessing 模块进一步提供了一个有用的类 Normalizer 来使用 Transformer API(尽管它的fit方法在这种情况下是没有用的)来实现相同的操作。因此该类适合于在 sklearn.pipeline.Pipeline 之前的步骤使用。

>>> normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
>>> normalizer
Normalizer(copy=True, norm='l2')‍

这个归一化实例可以在后续的样本向量中作为任何转换器来使用:

>>> normalizer.transform(X)                            
array([[ 0.40..., -0.40...,  0.81...],
       [ 1. ...,  0. ...,  0. ...],
       [ 0. ...,  0.70..., -0.70...]])
>>> normalizer.transform([[-1.,  1., 0.]])             
array([[-0.70...,  0.70...,  0. ...]])

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

Scikit-learn使用总结

在机器学习和数据挖掘的应用中,scikit-learn是一个功能强大的python包。在数据量不是过大的情况下,可以解决大部分问题。学习使用scikit-lea...

3697
来自专栏智能算法

KNN最近邻算法及其Python实现

k-NN是一种基本的分类和回归方法,用于分类时,算法思路较简单:通过计算不同特征之间的距离方法来得到最近的k个训练实例,根据k个实例的类别采用多数表决等方式进...

4837
来自专栏ATYUN订阅号

【学术】如何在神经网络中选择正确的激活函数

在神经网络中,激活函数是必须选择的众多参数之一,以通过神经网络获得最优的成果和性能。 在这篇文章中,我将假设你已经理解了神经网络工作的基本原理,并将详细介绍涉及...

33510
来自专栏机器人网

从零开始,了解元学习

传统的机器学习研究模式是:获取特定任务的大型数据集,然后用这个数据集从头开始训练模型。很明显,这和人类利用以往经验,仅仅通过少量样本就迅速完成学习的情况相差甚远...

962
来自专栏量化投资与机器学习

【Python机器学习】系列之线性回归篇【深度详细】

谢谢大家的支持!现在该公众号开通了评论留言功能,你们对每篇推文的留言与问题,可以通过【写评论】给圈主留言,圈主会及时回复您的留言。 本次推文介绍用线性模型处理回...

5049
来自专栏机器之心

入门 | 从零开始,了解元学习

2269
来自专栏绿巨人专栏

神经网络学习笔记 - 激活函数的作用、定义和微分证明

33213
来自专栏编程

深度学习中的损失函数总结以及Center Loss函数笔记

目标函数,损失函数,代价函数 损失函数度量的是预测值与真实值之间的差异.损失函数通常写做L(y_,y).y_代表了预测值,y代表了真实值. 目标函数可以看做是优...

4128
来自专栏ATYUN订阅号

机器学习入门——使用python进行监督学习

? 什么是监督学习? 在监督学习中,我们首先要导入包含训练特征和目标特征的数据集。监督式学习算法会学习训练样本与其相关的目标变量之间的关系,并应用学到的关系对...

37410
来自专栏人工智能头条

小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)

2288

扫描关注云+社区