特征工程 vs. 特征提取
“特征工程”这个华丽的术语,它以尽可能容易地使模型达到良好性能的方式,来确保你的预测因子被编码到模型中。例如,如果你有一个日期字段作为一个预测因子,并且它在周末与平日的响应上有着很大的不同,那么以这种方式编码日期,它更容易取得好的效果。
但是,这取决于许多方面。
首先,它是依赖模型的。例如,如果类边界是一个对角线,那么树可能会在分类数据集上遇到麻烦,因为分类边界使用的是数据的正交分解(斜树除外)。
其次,预测编码过程从问题的特定学科知识中受益最大。在我刚才列举的例子中,你需要了解数据模式,然后改善预测因子的格式。特征工程与图像处理、信息检索以及RNA表达谱等大不相同。你需要了解关于这个问题的一些信息,并且用你的特定数据集来做好特征工作。
下面是一些训练集的数据,使用两个预测因子来建立一个二分类系统模型(我会在后面揭晓数据来源):
这里还有我们将在下面使用到的相关测试集。
我们可以得到以下结论:
- 这些数据是高度相关的(相关系数=0.85)。
- 每个预测因子似乎是向右倾斜的。
- 它们似乎是多信息的,从某种意义上来说,你或许可以画出一条对角线来区分类别。
取决于我们选择使用的模型,两个预测因子的相关性可能会困扰我们。同样,我们应该检查单个预测因子是否重要。为了衡量这一点,我们将直接使用在预测数据上的ROC曲线下方的面积。
下面是每一个预测因子的单变量盒图(在对数尺度上):
这两个类之间有一些细微的差别,但是有很多重叠部分。预测模型A和B的ROC曲线面积分别是0.61和0.59。这个结果并不好。
那我们能做什么?主成分分析(PCA)是一种预处理的方法,它以创建新的综合预测因子(即主要成分或PC's)的方式旋转预测数据。它通过这样的方式分析:第一个成分占预测数据中大多数(线性)变量或信息的比重。在提取第一个成分之后,第二个成分以同样的方式来处理剩下的数据,并且依次下去。对于这些数据,有两种可能的组成部分(因为只有两个预测因子)。以这种方式使用PCA通常被称为特征提取。
我们来计算下这些成分:
> library(caret)
> head(example_train)
PredictorA PredictorB Class
2 3278.726 154.89876 One
3 1727.410 84.56460 Two
4 1194.932 101.09107 One
12 1027.222 68.71062 Two
15 1035.608 73.40559 One
16 1433.918 79.47569 One
> pca_pp <- preProcess(example_train[, 1:2],
+ method = c("center", "scale", "pca"))
+ pca_pp
Call:
preProcess.default(x = example_train[, 1:2], method = c("center",
"scale", "pca")) Created from 1009 samples and 2 variables
Pre-processing: centered, scaled, principal component signal extraction PCA needed 2 components to capture 95 percent of the variance
> train_pc <- predict(pca_pp, example_train[, 1:2])
> test_pc <- predict(pca_pp, example_test[, 1:2])
> head(test_pc, 4)
PC1 PC2
1 0.8420447 0.07284802
5 0.2189168 0.04568417
6 1.2074404 -0.21040558
7 1.1794578 -0.20980371
请注意,我们在训练集上计算了所有的必要信息,并且将这些计算应用到测试集。那么测试集是什么样的呢?
这是测试集预测因子简单的旋转。
PCA是非监督式的,这意味着当计算结束时,不需要考虑输出类。在这里,ROC曲线的下方部分,用第一个成分得到的面积是0.5,第二个成分得到的面积是0.81。这些结果与上面的点混在一起;第一个成分在类中具有随机混合的特性,而第二个成分似乎可以很好地分离类。两种成分的盒图反映了同样的情况:
在第二个成分中,两个类的分离度更高。
这很有趣。首先,尽管PCA是非监督式的,它还是成功地找到了一个新的预测因子来划分类别。其次,这些成分对于这些类别是最终要的,但对于预测器而言则没那么重要。通常PCA并不会保证任何成分会给出准确预测。但在这里,我们很幸运,它得到一个不错的预测结果。
但是,试想如果有上百个预测因子。我们可能只需要使用前X个成分来获取预测因子中绝大部分的信息,然后丢弃其他的成分。在这个例子中,第一个成分占据预测器变量的92.4%,同样的方法可能会丢弃最有效的预测因子。
特征工程的想法是怎么出现的呢?给定这两种预测因子,我们可以得到下面所示的散点图,我首先想到的事情是“有两个相关联的,正相关并且斜交的预测因子,一前一后地进行分类”。其次我想到的是“利用比例”。那么数据是什么样的呢?
ROC曲线下方的相应面积是0.8,它跟第二个成分的结果很相近。一个基于数据视觉化探索的简单转换可能会与没有偏差的经验算法效果相当。
这些数据来自于Hill等人的细胞分割实验,预测因子A是“由旋转得到的等效圆直径的球体表面”(标记为EqSphereAreaCh1),预测因子B是细胞核的周长(PerimCh1)。一个高内涵筛选的专家,可能会自然而然的采用这两种细胞特征的比率,因为它会带来科学意义上良好的效果(我并不是那个人)。在这一问题的范围内,它们的直觉应该驱动特征工程处理。
然而,在保证诸如PCA算法效能时,机器会因此受益。总的来说,这些数据中有近60个预测因子,它们的特征和EqSphereAreaCh1相近。我的个人爱好是“基于共生矩阵像素空间排列的Haralick 结构测量”。为此研究了一段时间。问题的关键是,经常有太多的特征需要设计,而且它们很可能在一开始就很不直观。
特征提取的另一方面关系到相关性。在特定数据集上的预测因子之间往往有着高度相关性,这是很好理解的。比如,有不同的方法来量化细胞的离心率(比如拉伸程度)。此外,细胞核的大小与细胞整体大小相关等等。PCA可以显著地缓解相关性的效果。手动采用多预测因子比例的做法似乎可能不太有效,而且会花费更多的时间。
去年,在我支持的一个R&D小组中,专注于偏差分析(即建立我们预先知道的模型)和专注于非偏差分析(即让机器去寻找最优模型)的科学家之间存在着争议。我的观点处于这两者之间,认为它们之间存在一些交集。一旦挖掘完毕,机器可以将新的、有趣的特征打上“已知事物”的标签,并把它们作为知识来使用。
原文链接:Feature Engineering versus Feature Extraction: Game On! (译者/刘翔宇 审校/刘帝伟、朱正贵 责编/周建丁)
特征工程 vs. 特征提取的更多相关文章
- 使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- 【转】使用sklearn做单机特征工程
这里是原文 说明:这是我用Markdown编辑的第一篇随笔 目录 1 特征工程是什么? 2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 无量纲化与正则化的区别 ...
- 转载:使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- Python机器学习笔记 使用sklearn做特征工程和数据挖掘
特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...
- AI学习---特征工程【特征抽取、特征预处理、特征降维】
学习框架 特征工程(Feature Engineering) 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 什么是特征工程: 帮助我们使得算法性能更好发挥性能而已 sklearn主 ...
- sklearn—特征工程
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Auto-ML之自动化特征工程
1. 引言 个人以为,机器学习是朝着更高的易用性.更低的技术门槛.更敏捷的开发成本的方向去发展,且Auto-ML或者Auto-DL的发展无疑是最好的证明.因此花费一些时间学习了解了Auto-ML领域的 ...
- 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26 ...
- Sklearn与特征工程
Scikit-learn与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...
随机推荐
- Sqoop修改sqoop元信息实现job的增量导入
最简单方式是按主键增量导入:http://blog.csdn.net/ggz631047367/article/details/50185319 以下方法只做存档 需求:redis缓存的数据隔段时间往 ...
- 【转】C#父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
原文地址:http://www.xuebuyuan.com/1092603.html Win7+VS2010测试的结果如下: ①子类静态成员变量②子类静态构造函数③子类实例成员变量④父类静态成员变量⑤ ...
- 第四章:重构代码[学习Android Studio汉化教程]
第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight p ...
- 解决windows上安装TortoiseSVN后不能使用命令行问题
一般我们安装TortoiseSVN的时候都是一路next安装好之后就右键开始使用.但是有时候我们需要在windows的命令窗口下执行SVN命令.这时候我们就会发现svn help之后显示没svn这个命 ...
- linux条件变量
条件变量用于线程之间的通信,和互斥锁一起使用.条件变量用于及时通知等待的线程条件的变化,使线程不至于错过变化. 考虑下面的情况,有AB两个线程对index这个全局变量进行++,一个线程C用于判断,in ...
- C# List对于自定义对象的比较判断
实际开发中,我们经常会把同类型的一系列对象封装到List集合中,当我们有需要在封装对象到List集合中时,排除重复的对象,这时直接使用: if(!List.Contains(obj)) { List. ...
- python学习——练习题(7)
""" 题目:将一个列表的数据复制到另一个列表中. """ import copy def validate(a, b): "&q ...
- 用C#操作IO端口1-用并口控制发光二极管
什么是端口? 端口包含了一系列信号线, 通过这个端口CPU可以同其他外部设备交换数据, 比如我们经常见到的Modem,打印机等. 通常情况下, 打开的信号是”1”, 关闭的信号是”0”. 并口在同一时 ...
- docker学习记录1
起因 现在自己学习微服务,服务器越来越多,虽然自己写了一些shell脚本来安装需要的软件,比如mysql,redis,jdk等等,但是还是好麻烦.希望学习docker能够快速安装部署这些东西. 记录一 ...
- 一致性哈希算法(consistent hashing)(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...