1 特征工程的概念

所谓数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。那么特征工程到底是什么呢?其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。

2 特征处理

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

(1)量纲不同:即特征的规格不一样,不能够放在一起比较。

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

(3)定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用OneHot的方式将定性特征转换为定量特征。OneHot的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。

(4)存在缺失值:缺失值需要补充。

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

2.1 无量纲化

无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化、归一化等。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]

2.1.1 标准化

在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。

标准化需要计算特征的均值和标准差,公式表达为:

均值:X

标准差:总体标准差和样本标准差

numpy.std() 求标准差的时候默认是除以 n 的,即是有偏的,np.std无偏样本标准差方式为加入参数 ddof = 1;

pandas.std() 默认是除以n-1 的,即是无偏的,如果想和numpy.std() 一样有偏,需要加上参数ddof=0 ,即pandas.std(ddof=0) ;DataFrame的describe()中就包含有std();

2.1.2 归一化

区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:

使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:

2.1.3标准化、中心化、归一化的区别

归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。

标准化和中心化的区别:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。

归一化和标准化的本质是缩放和平移,但区别是什么呢?在不涉及线性代数的前提下,我们给出一些直觉的解释:归一化的缩放是 “拍扁” 统一到区间(仅由极值决定),而标准化的缩放是更加 “弹性” “动态” 的,和整体样本的分布有很大的关系。值得注意:

归一化:缩放仅仅跟最大、最小值的差别有关。

标准化:缩放和每个点都有关系,通过方差(variance)体现出来。与归一化对比,标准化中所有数据点都有贡献(通过均值和标准差造成影响)。

当数据较为集中时, 更小,于是数据在标准化后就会更加分散。如果数据本身分布很广,那么 较大,数据就会被集中到更小的范围内。

从输出范围角度来看, 必须在 0-1 间。对比来看,显然 ,甚至在极端情况下 ,所以标准化的输出范围一定比归一化更广。

归一化: 输出范围在 0-1 之间

标准化:输出范围是负无穷到正无穷

什么时候用归一化?什么时候用标准化?

我们已经从第三部分得到了一些性质,因此可以得到以下结论:

  • 如果对输出结果范围有要求,用归一化
  • 如果数据较为稳定,不存在极端的最大最小值,用归一化
  • 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响

一般来说,建议优先使用标准化。在对输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出调整到 0-1,如果我们对于数据的分布有假设的话,更加有效方法是使用相对应的概率密度函数来转换

2.1.4为什么要归一化/标准化

        如前文所说,归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。

1.某些模型求解需要

在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。

2. 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)

3. 无量纲化

例如房子数量和收入,因为从业务层知道,这两者的重要性一样,所以把它们全部归一化。 这是从业务层面上作的处理。

4. 避免数值问题

太大的数会引发数值问题。

2.1.5 哪些模型必须归一化/标准化

(1)SVM

  不同的模型对特征的分布假设是不一样的。比如SVM 用高斯核的时候,所有维度共用一个方差,这不就假设特征分布是圆的么,输入椭圆的就坑了人家,所以简单的归一化都还不够好,来杯白化才有劲。比如用树的时候就是各个维度各算各的切分点,没所谓。

(2)KNN

  需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”。

(3)神经网络

  1)数值问题

  归一化/标准化可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig(tanh)的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。

  假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入 421·0.00243 == 0.421·2.43,会发现不相等,这就是一个数值问题。

  2)求解需要

  a. 初始化:在初始化时我们希望每个神经元初始化成有效的状态,tansig函数在[-1.7, 1.7]范围内有较好的非线性,所以我们希望函数的输入和神经元的初始化都能在合理的范围内使得每个神经元在初始时是有效的。(如果权值初始化在[-1,1]且输入没有归一化且过大,会使得神经元饱和)

  b. 梯度:以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。

  c. 学习率:由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea,而输入层到隐层的权值梯度为 2ew(1-a^2)x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。

  d.搜索轨迹:已解释

2.2 中心化

中心化:平均值为0,对标准差无要求

PCA中用到样本中心化

2.3 离散化

数据离散化是指将连续的数据进行分段,使其变为一段段离散化的区间。分段的原则有基于等距离、等频率或优化的方法。

2.2.1 离散化的原因

1、算法需要

        比如决策树、朴素贝叶斯等算法,都是基于离散型的数据展开的。如果要使用该类算法,必须将离散型的数据进行。有效的离散化能减小算法的时间和空间开销,提高系统对样本的分类聚类能力和抗噪声能力。

2、离散化的特征相对于连续型特征更易理解,更接近知识层面的表达

比如工资收入,月薪2000和月薪20000,从连续型特征来看高低薪的差异还要通过数值层面才能理解,但将其转换为离散型数据(底薪、高薪),则可以更加直观的表达出了我们心中所想的高薪和底薪。

3、可以有效的克服数据中隐藏的缺陷,使模型结果更加稳定

2.2.2 离散化的优势

         在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

1. 离散特征的增加和减少都很容易,易于模型的快速迭代;

2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

3. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

4. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

6. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

2.2.3 离散化的方法

2.2.3.1无监督学习方法

等宽法

等宽法即是将属性值分为具有相同宽度的区间,区间的个数k根据实际情况来决定。比如属性值在[0,60]之间,最小值为0,最大值为60,我们要将其分为3等分,则区间被划分为[0,20] 、[21,40] 、[41,60],每个属性值对应属于它的那个区间

规定划分区间的参数,取定长的间隔将特征放入不同的箱子中,这种方法对异常点比较敏感。,

等频法

等宽法即是将属性值分为具有相同宽度的区间,区间的个数k根据实际情况来决定。比如有60个样本,我们要将其分为k=3部分,则每部分的长度为20个样本。

根据频率划分箱子,会出现特征相同却不在一个箱子中的情况,需要在划分完成后进行微调。先对特征值进行sort,然后评估分割点,划分或者合并

二值化

定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:

基于聚类的方法

基于聚类的方法分为两个步骤,即:

选定聚类算法将其进行聚类

将在同一个簇内的属性值做为统一标记。

注:基于聚类的方法,簇的个数要根据聚类算法的实际情况来决定,比如对于k-means算法,簇的个数可以自己决定,但对于DBSCAN,则是算法找寻簇的个数。

2.2.3.2有监督学习方法:

1R方法

将前面的m个实例放入箱子中如果后面实例放入箱子时,比对当前实例的标签是否与箱子中大部分实例标签相同,如果相同就放入,如果不相同就形成下一个m大小的新箱子,将实例全部放入箱子后,将箱子中大多数实例标签作为箱子的标签,再将标签相同的箱子合并

基于信息熵的方法

        使用合成或者分裂的方法根据熵计算和阈值判定来JUDGE是合成还是分裂。

基于卡方的方法

        将数值特征的每个不同值看做一个区间对每个相邻的区间计算卡方统计量,如果大就合并,如果不大于阈值就停止。

2.2.4 总结

模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。

2.3 OneHot

2.4 缺失值处理

2.5 数据变换

参考资料:

https://blog.csdn.net/zhenaoxi1077/article/details/82791281

对于特征离散化、特征交叉、连续特征离散化经典的解释

https://blog.csdn.net/ccblogger/article/details/80180892

特征工程系列(一):特征工程的概念/特征的处理相关推荐

  1. 特征构造系列3:笛卡尔乘积特征构造以及遗传编程特征构造

    文章目录 1.笛卡尔乘积特征构造 1.1 原理 1.2 类别特征进行笛卡尔乘积特征组合 1.3 连续值特征进行笛卡尔乘积特征组合 2.遗传编程特征构造 2.1 原理 2.2 gplearn 2.3 遗 ...

  2. [特征工程系列一] 论特征的重要性

    满打满算,还有十天左右就要过年了,这些天大家或多或少都有点浮躁.反过来想,趁大家都懈怠的时候,正是学习的最佳时机.趁着这几天,也给自己加点码,去认真的再看一下特征工程.我给自己列了下面的这一份学习清单 ...

  3. 特征工程系列:自动化特征构造

    特征工程系列:自动化特征构造 原创: JunLiang 木东居士  今天 0x00 前言 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程在机器学习中占有相当重要的 ...

  4. 数据工程系列精讲(第一讲): Data-centric AI 之特征工程

    前言 这两年我们观察到越来越多的算法工程师重视数据的特征工程,AI业界大佬吴恩达教授在2021年提出了从model-centric AI切换到data-centric AI的论调,我个人认为data- ...

  5. 特征工程系列:特征筛选的原理与实现(下)

    0x00 前言 我们在<特征工程系列:特征筛选的原理与实现(上)>中介绍了特征选择的分类,并详细介绍了过滤式特征筛选的原理与实现.本篇继续介绍封装式和嵌入式特征筛选的原理与实现. 0x01 ...

  6. [特征工程系列五]基于蒙特卡洛搜索树的半自动特征工程方案

    不知道有多少同学坚持看完了特征工程系列1~4,今天我们迎来最后一篇.前面的四篇其实都是一些基于特征工程理论的干货的分享,今天我们来点虚的,讲讲我YY的一种蒙特卡洛搜索树的半自动化的特征工程方案.其实为 ...

  7. [特征工程系列二]显性特征的基本处理方法

    今天接着前一篇文章讲,主要分享基于显性特征工程的一些最基本的处理方法.关于显性特征是什么,大家可以去看系列文章一.关于显性特征的处理方法可以做这样的类比:不知道大家平时会不会自己做菜,我个人的话基本每 ...

  8. 特征工程系列之降维:用PCA压缩数据

    引言 降维是关于摆脱"无信息的信息"的同时保留关键点.有很多方法可以定义"无信息".PCA 侧重于线性依赖的概念.我们将数据矩阵的列空间描述为所有特征向量的跨度 ...

  9. ​特征工程系列:特征预处理(上)

    特征工程系列:特征预处理(上) 关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问.动手达人,期待与大家一起交流探讨机器学习相关内容~ 0x00 前言 数据和特征决定了机器学习的上限,而模 ...

最新文章

  1. python序列数据类型_python 数据类型 序列——列表
  2. 《用户至上:用户研究方法与实践(原书第2版)》一 3.4 法律层面的考虑
  3. 管理信息系统 课程设计(2018-6-16)
  4. 华中农业大学2018考研真题之867-数据结构与算法
  5. 在mvc4里怎样引用:System.Web.Optimization和entityframework
  6. RDD之四:Value型Transformation算子
  7. 转——深度学习之BN算法(Batch Normailization)
  8. eppp如何导入php文件_PHP如何处理文件权限?(代码示例)
  9. Everest 0.6不能保存3D桌面特效的解决方案
  10. [BZOJ1999][codevs1167][Noip2007]Core树网的核
  11. 3个月攻破CCNA:12周教程资料盘点
  12. MySQL运算符介绍(萌新必备!!)
  13. 北大计算机科学系 97届,北大一专业:六代单传、一人旷课全系放假,毕业照只有一个人...
  14. 2021年危险化学品经营单位主要负责人考试报名及危险化学品经营单位主要负责人证考试
  15. C++版 PPyolo+部署记录
  16. Zero-sho原先的升级版:hourglass网络:U-Net
  17. 最新GLove词向量预训练文件国内服务器下载
  18. 【转载】PTN与IPRAN承载LTE的比较
  19. cocoscreator文字阴影
  20. 台式计算机音响外设插入,台式机提示外设没有插上

热门文章

  1. orb-slam系列 LoopClosing线程 DetectLoop(十)
  2. 2014年10月30日 1、完成AHC合并部分,调试通过代码
  3. 什么是马甲APP?怎么用马甲APP导流
  4. lua小技巧(二)——lua全局变量的检测
  5. 计算机网络-网络类别[#1]
  6. 微信小程序爱江山更爱美人忘记服务器,爱江山更爱美人微信小程序
  7. 知识管理从建立知识库做起
  8. JUC详解 | JUC Lock
  9. 单片机c语言字符串比较,代码对比
  10. 外交学院计算机考研,外交学院考研经验