特征工程 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与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...
随机推荐
- 关于select的一个死循环
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/sel ...
- C++ 新特性-右值引用
作为最重要的一项语言特性,右值引用(rvalue references)被引入到 C++0x中.我们可以通过操作符“&&”来声明一个右值引用,原先在C++中使用“&”操作符声明 ...
- vscode新版1.31.1使用代码检查工具ESlint支持VUE
1.VSCODE中安装ESlint省略 2.菜单文件->首选项->设置->扩展->ESLint 打钩:Eslint:Auto Fix On Save 点击此链接:在settin ...
- TCP 三次握手 四次握手
http://blog.chinaunix.net/uid-22312037-id-3575121.html http://www.centos.bz/2012/08/tcp-establish-cl ...
- Python web框架 Tornado(一)基础学习
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- gif屏幕录像软件
ScreenToGif:http://screentogif.codeplex.com 备份下载地址:http://flask.pub/screentogif2.zip 本站连接:http ...
- Android 4 学习(17):使用Content Resolver
Content Resolver简介 每个应用程序都有一个ContentResolver实例,通过getContentResolver()方法可以获取: ContentResolver cr = ge ...
- GPRS 通信
最近使用SIM900A GSM/GPRS模块,做一些简单物联网信息投递. 1.选取何种流量卡 一般来讲,需要带身份证去运营商办理新的电话卡.对于小流量用户,实际上就是办一个最低月租即可,因为套餐会赠送 ...
- C# Data Parse
一.DateTime 方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss 方法二:Convert.ToDateTime( ...
- fileinput模块可以循环一个或多个文本文件的内容
fileinput模块可以循环一个或多个文本文件的内容. [默认格式] fileinput.input (files=None, inplace=False, backup='', bufsize=0 ...