数据预处理 | 机器学习之特征工程

作者:苏小保(jacksu) 华为工程师 擅长分布式系统、大数据、机器学习。github地址:https://github.com/jacksu

通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:

不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。

信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。

定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征**(https://stats.idre.ucla.edu/):假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。

存在缺失值:因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或其他占位符。

信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

无量钢化

1

标准化

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

公式为:(X-mean)/std 计算时对每个属性/每列分别进行。

将数据按属性(按列进行)减去其均值,并除以其方差。得到结果是,对于每个属性(每列)来说所有数据都聚集在0附近,方差为1。

from sklearn.datasets import load_irisimport numpy as np  X = np.array([[ 1., -1.,  2.],               [ 2.,  0.,  0.],               [ 0.,  1., -1.]])from sklearn import preprocessing X_scaled = preprocessing.scale(X) print(X_scaled) print(X_scaled.mean(axis=0)) print(X_scaled.std(axis=0))
out
[[ 0.         -1.22474487  1.33630621]  [ 1.22474487  0.         -0.26726124]  [-1.22474487  1.22474487 -1.06904497]] [ 0.  0.  0.] [ 1.  1.  1.]

sklearn 还提供了StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。

scaler = preprocessing.StandardScaler().fit(X) print(scaler) print(scaler.mean_)                                      print(scaler.scale_)                                      print(scaler.transform(X)) scaler.transform([[-1.,  1., 0.]])
out
StandardScaler(copy=True, with_mean=True, with_std=True) [ 1.          0.          0.33333333] [ 0.81649658  0.81649658  1.24721913] [[ 0.         -1.22474487  1.33630621]  [ 1.22474487  0.         -0.26726124]  [-1.22474487  1.22474487 -1.06904497]] Out[9]: array([[-2.44948974,  1.22474487, -0.26726124]]) 

区间缩放

另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现。

使用这种方法的目的包括:

1、对于方差非常小的属性可以增强其稳定性。 2、维持稀疏矩阵中为0的条目。

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) print(X_train_minmax) 
out
[[ 0.5         0.          1.        ]  [ 1.          0.5         0.33333333]  [ 0.          1.          0.        ]]

归一化

归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:

该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

X_normalized = preprocessing.normalize(X_train, norm='l2') print(X_normalized) normalizer = preprocessing.Normalizer().fit(X_train) normalizer.transform(X_train)
out
[[ 0.40824829 -0.40824829  0.81649658]  [ 1.          0.          0.        ]  [ 0.          0.70710678 -0.70710678]] Out[16]: array([[ 0.40824829, -0.40824829,  0.81649658],        [ 1.        ,  0.        ,  0.        ],        [ 0.        ,  0.70710678, -0.70710678]])

后面接着介绍数据预处理

参考

1、关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化(http://www.cnblogs.com/chaosimple/p/4153167.html)

2、统计数据归一化与标准化(http://blog.csdn.net/mpbchina/article/details/7573519)

3、标准化和归一化什么区别?(https://www.zhihu.com/question/20467170)

4、特征工程到底是什么?(https://www.zhihu.com/question/29316149)

5、sklearn preprocess(http://sklearn.lzjqsdd.com/modules/preprocessing.html)

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-11-02

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习从入门到成神

机器学习之决策树(Decision Tree)及其Python代码实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

571
来自专栏PPV课数据科学社区

2017校招数据分析岗笔试/面试知识点

2017校招正在火热的进行,后面会不断更新涉及到的相关知识点。尽管听说今年几个大互联网公司招的人超少,但好像哪一年都说是就业困难,能够进去当然最好,不能进去是不...

2767
来自专栏ATYUN订阅号

使用Python计算非参数的秩相关

当两个变量都有良好理解的高斯分布时,很容易计算和解释。而当我们不知道变量的分布时,我们必须使用非参数的秩相关(Rank Correlation,或称为等级相关)...

843
来自专栏IT派

理解SVM的三层境界(二)

第二层、深入SVM 2.1、从线性可分到线性不可分 2.1.1、从原始问题到对偶问题的求解 接着考虑之前得到的目标函数: ? 由于求 的最大值相当于求 ...

2723
来自专栏机器学习之旅

应用:数据预处理-异常值识别

上四分位数Q3,又叫做升序数列的75%位点 下四分位数Q1,又叫做升序数列的25%位点 箱式图检验就是摘除大于Q3+3/2*(Q3-Q1),小于Q1-3/2...

743
来自专栏小小挖掘机

数据城堡参赛代码实战篇(六)---使用sklearn进行数据标准化及参数寻优

小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编介绍了一下我们准备使用的分类算法...

3207
来自专栏机器学习从入门到成神

机器学习之从极大似然估计到最大熵原理以及EM算法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

681
来自专栏大学生计算机视觉学习DeepLearning

cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

1264
来自专栏大数据挖掘DT机器学习

如何用Python实现支持向量机(SVM)

SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集。 SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火...

3399
来自专栏AI研习社

如何有效处理特征范围差异大且类型不一的数据?

原题目如下: 1. 特征类型混杂: 连续变量,离散变量,描述变量共存 2. 不同变量之间取值差异大: 例如有些变量取值在 0~1 但有些取值为 10000-5...

3877

扫描关注云+社区