特征工程是一个非正式的话题,但它被公认为是应用机器学习成功的关键。
在创建本指南时,我进行了广泛而深入的研究,并综合了所有我能找到的材料。
你将了解什么是特征工程、它解决了什么问题、为什么它很重要、如何设计特征、谁在这方面做得很好,以及你可以去哪里学习更多知识并精通它。
如果你只读一篇关于特征工程的文章,我希望是这一篇。
特征工程是另一个似乎不值得任何综述论文或书籍,甚至书中章节来讨论的话题,但它对机器学习的成功至关重要。[…] 机器学习的大部分成功实际上是成功地设计出学习器可以理解的特征。
—— Scott Locklin,摘自《被忽视的机器学习思想》
用我的新书《机器学习的数据准备》来启动你的项目,其中包括所有示例的*分步教程*和*Python源代码*文件。
让我们开始吧。
特征工程解决的问题

特征工程是困难的。
照片由 Vik Nanda 拍摄,保留部分权利
当你的目标是从一个预测模型中获得尽可能好的结果时,你需要充分利用你所拥有的一切。
这包括从你正在使用的算法中获得最佳结果。它还涉及充分利用数据,供你的算法使用。
如何为预测建模充分利用你的数据?
这就是特征工程的过程和实践所解决的问题。
实际上,所有机器学习算法的成功都取决于你如何呈现数据。
—— Mohammad Pezeshki,回答“每个数据科学家都应该知道的关于特征选择和工程的一些通用技巧是什么?”
想开始学习数据准备吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
特征工程的重要性
数据中的特征将直接影响你使用的预测模型和你能够实现的结果。
你可以说:你准备和选择的特征越好,你将获得的结果就越好。这是对的,但也容易引起误解。
你所取得的结果是你选择的模型、可用的数据和你准备的特征的综合因素。甚至你对问题的框架和你用来评估准确性的客观指标也起着作用。你的结果取决于许多相互依赖的属性。
你需要能够描述数据中固有结构的优秀特征。
更好的特征意味着灵活性.
即使你选择了“错误的模型”(次优模型),你仍然可以获得好的结果。大多数模型都能捕捉到数据中的良好结构。良好特征的灵活性将允许你使用更简单的模型,这些模型运行速度更快、更容易理解和维护。这是非常理想的。
更好的特征意味着更简单的模型.
有了精心设计的特征,即使你选择了“错误的参数”(次优参数),你仍然可以获得好的结果,原因大致相同。你不需要那么费力地去挑选正确的模型和最优化的参数。
有了好的特征,你就更接近于问题的本质,也更接近于对你拥有并可以用来最好地描述该潜在问题的所有数据的表示。
更好的特征意味着更好的结果.
我们使用的算法对于Kaggle竞赛者来说是非常标准的。[…] 我们的大部分精力都花在了特征工程上。
—— Xavier Conort,关于赢得Kaggle上的Flight Quest挑战赛的“与Xavier Conort的问答”
什么是特征工程?
以下是我对特征工程的定义
特征工程是将原始数据转换为能更好地向预测模型表示潜在问题的特征的过程,从而提高模型在未见数据上的准确性。
你可以在这个定义中看到依赖关系
- 你选择的性能指标(RMSE?AUC?)
- 问题的框架(分类?回归?)
- 你正在使用的预测模型(SVM?)
- 你已选择和准备的原始数据(样本?格式化?清洗?)
特征工程是手动设计输入x应该是什么
— Tomasz Malisiewicz,回答“什么是特征工程?”
特征工程是一个表示问题
机器学习算法从样本数据中学习问题的解决方案。
在这种情况下,特征工程提出一个问题:要学习问题的解决方案,样本数据的最佳表示形式是什么?
这是一个很深的问题。在机器学习,甚至整个人工智能领域做得好,都归结为表示问题。这是很难的事情,也许是不可知的(或者充其量是难以处理的),无法先验地知道该使用哪种最佳表示。
你必须将你的输入转换成算法能够理解的东西
—— Shayne Miel,回答“机器学习中特征工程的直观解释是什么?”
特征工程是一门艺术
它是一门艺术,就像工程是一门艺术,编程是一门艺术,医学是一门艺术一样。
有明确定义的程序,它们是方法性的、可证明的和被理解的。
数据是一个变量,每次都不同。你通过实践,通过经验性的学徒制,来擅长决定何时使用哪种程序。就像工程、编程、医学和一般的机器学习一样。
特征工程的精通来自于动手实践,以及研究其他做得好的人的实践。
…一些机器学习项目成功了,一些失败了。区别在哪里?毫无疑问,最重要的因素是使用的特征。
—— Pedro Domingos,摘自“关于机器学习需要知道的一些有用的事”(PDF)
特征工程的子问题
人们通常将特征工程视为一件事。
例如,在很长一段时间里,对我来说,特征工程就是特征构建。
我当时会想“我现在在做特征工程”,然后我会去思考“我如何分解或聚合原始数据以更好地描述潜在问题?”目标是正确的,但方法只是众多方法中的一种。
在本节中,我们将探讨这些多种方法以及它们旨在解决的具体子问题。每一个都可以成为一篇深入的文章,因为它们都是实践和研究的重要领域。
特征:对你的建模任务有用的属性
让我们从数据和什么是特征开始。
表格数据以观测值或实例(行)来描述,这些观测值由变量或属性(列)组成。一个属性可以是一个特征。
特征这个概念,与属性分开来看,在问题的背景下更有意义。特征是对你的问题有用或有意义的属性。它是观测值中用于了解正在建模的问题结构的重要部分。
我用“有意义”来区分属性和特征。有些人可能不这么认为。我认为不存在无意义的特征。如果一个特征对问题没有影响,它就不是问题的一部分。
在计算机视觉中,一张图像是一个观测值,但一个特征可能是图像中的一条线。在自然语言处理中,一份文档或一条推文可以是一个观测值,而一个短语或词频可以是一个特征。在语音识别中,一段话语可以是一个观测值,但一个特征可能是一个单词或音素。
特征重要性:对特征有用性的估计
你可以客观地评估特征的有用性。
这可以作为选择特征的前奏。特征被分配分数,然后可以按分数排名。得分最高的特征可以被选中包含在训练数据集中,而其余的则可以忽略。
特征重要性分数还可以为你提供信息,你可以利用这些信息来提取或构建新的特征,这些新特征与那些被评估为有用的特征相似但有所不同。
如果一个特征与因变量(被预测的东西)高度相关,那么它可能很重要。相关系数和其他单变量方法(每个属性被独立考虑)是常用的方法。
更复杂的预测建模算法在构建模型时会在内部执行特征重要性评估和选择。一些例子包括MARS、随机森林和梯度提升机。这些模型还可以报告在模型准备过程中确定的变量重要性。
特征提取:从原始数据自动构建新特征
有些观测值在其原始状态下数据量太大,无法直接用于预测建模算法。
常见的例子包括图像、音频和文本数据,但也很容易包括拥有数百万个属性的表格数据。
特征提取是一个自动将这些类型的观测值的维度降低到一个小得多的集合,以便可以进行建模的过程。
对于表格数据,这可能包括像主成分分析(PCA)和无监督聚类这样的投影方法。对于图像数据,这可能包括线或边缘检测。根据领域不同,图像、视频和音频观测值适用于许多相同类型的数字信号处理(DSP)方法。
特征提取的关键在于这些方法是自动化的(尽管可能需要从更简单的方法设计和构建),并且解决了数据维度过高而无法管理的问题,最常用于以数字格式存储的模拟观测数据。
特征选择:从众多特征中选出少数有用的特征
并非所有特征都是生而平等的。
那些与问题无关的属性需要被移除。有些特征对模型准确性的重要性会超过其他特征。也会有在其他特征背景下显得多余的特征。
特征选择通过自动选择对问题最有用的子集来解决这些问题。
特征选择算法可能会使用一种评分方法来对特征进行排序和选择,例如相关性或其他特征重要性方法。
更高级的方法可能会通过试错来搜索特征子集,自动创建和评估模型,以追求客观上最具预测性的特征子群。
还有一些方法将特征选择融入其中,或者将其作为模型的副作用。逐步回归就是一种在模型构建过程中自动执行特征选择的算法示例。
像LASSO和岭回归这样的正则化方法也可以被视为内置特征选择的算法,因为它们在模型构建过程中积极地寻求移除或降低特征的贡献。
在文章中了解更多信息:特征选择简介。
特征构建:从原始数据中手动构建新特征
最好的结果取决于你,从业者,如何精心打造特征。
特征重要性和选择可以告诉你特征的客观效用,但这些特征必须有来源。
你需要手动创建它们。这需要花费大量时间处理真实的样本数据(而不是聚合数据),思考问题的底层形式、数据中的结构以及如何最好地将它们暴露给预测建模算法。
对于表格数据,这通常意味着混合聚合或组合特征来创建新特征,以及分解或拆分特征来创建新特征。
对于文本数据,这通常意味着设计与问题相关的特定文档或上下文的指标。对于图像数据,这通常可能意味着花费大量时间来规定自动筛选器以挑选出相关结构。
这部分特征工程通常被认为是一种艺术形式,是被赋予重要性并在竞争性机器学习中被视为差异化因素的部分。
它是手动的,速度慢,需要大量的人类脑力,并且能产生巨大的影响。
特征工程和特征选择并非相互排斥。它们都很有用。不过,我会说特征工程更重要,特别是因为你无法真正自动化它。
—— Robert Neuhaus,回答“你认为特征选择在机器学习中有多大价值?你认为特征选择还是特征工程更能提高准确性?”
特征学习:自动识别和使用原始数据中的特征
我们能否避免手动规定如何从原始数据中构建或提取特征的负担?
表示学习或特征学习就是朝着这个目标努力的一种尝试。
现代深度学习方法在这一领域取得了一些成功,例如自编码器和受限玻尔兹曼机。它们已被证明能够自动地、以无监督或半监督的方式学习特征的抽象表示(一种压缩形式),这反过来又在语音识别、图像分类、物体识别等领域支持了最先进的结果。
我们还没有自动化的特征提取或构建,而且可能永远不会有自动化的特征工程。
抽象表示是自动准备的,但除了以黑盒方式外,你无法理解和利用学到的东西。它们不能(目前还不能,或者不容易)告知你和这个过程如何创建更多与那些表现良好的特征相似和不同的特征,无论是在给定的问题上还是在未来类似的问题上。所获得的技能被困住了。
尽管如此,它仍然是迷人、令人兴奋的,并且是特征工程中一个重要而现代的部分。
特征工程的过程
在应用机器学习的更广泛过程中,特征工程可以被最好地理解。
你需要这个背景。
机器学习的过程
应用机器学习的过程(姑且这么称呼)从广义上讲涉及许多活动。前期是问题定义,接下来是数据选择和准备,中间是模型准备、评估和调优,最后是结果呈现。
像数据挖掘和知识发现(KDD)这样的过程描述有助于更好地理解任务和子任务。你可以随心所欲地挑选和表述这个过程。我以前已经谈过很多这方面的内容了。
一张与我们讨论特征工程相关的图景是这个过程的前中部。它可能看起来像下面这样
- (此前的任务…)
- 选择数据:整合数据,将其反规范化为一个数据集,并收集在一起。
- 预处理数据:格式化、清洗、抽样,以便你可以处理它。
- 转换数据:特征工程发生在这里。
- 数据建模:创建模型,评估并调整它们。
- (此后的任务…)
传统观念中,将原始数据“转换”为适合建模的状态,正是特征工程所在的位置。数据转换和特征工程实际上可能是同义词。
这张图在几个方面有所帮助。
你可以看到,在特征工程之前,我们正在整理数据,将其转换成我们甚至可以查看的格式,而就在那之前,我们正在从数据库中整理和反规范化数据,以形成某种中心视图。
当我们发现对数据的新视角时,我们可以并且应该回顾这些步骤。
例如,我们可能有一个聚合字段的属性,比如一个总和。与其使用单个总和,我们可能会决定创建特征来按时间间隔描述数量,例如按季节。我们需要在流程中回溯到预处理甚至选择数据步骤,以获取“真正的原始数据”并创建这个特征。
我们可以看到特征工程之后是建模。
这表明与建模有很强的互动,提醒我们在设计特征和在测试框架及最终性能指标的实际检验中测试它们之间的相互作用。
这也表明我们可能需要将数据保持在适合所选建模算法的形式,例如,作为最后一步对特征进行归一化或标准化。这听起来像一个预处理步骤,它可能确实是,但它帮助我们考虑在有效建模之前需要对数据进行哪些类型的收尾工作。
特征工程的迭代过程
了解特征工程在应用机器学习过程中的位置,突显了它并非独立存在。
这是一个与数据选择和模型评估相互作用的迭代过程,一次又一次,直到我们在这个问题上时间耗尽。
这个过程可能如下所示:
- 头脑风暴特征:真正深入问题,查看大量数据,研究其他问题上的特征工程,看看你能借鉴什么。
- 设计特征:这取决于你的问题,但你可能会使用自动特征提取、手动特征构建以及两者的混合。
- 选择特征:使用不同的特征重要性评分和特征选择方法,为你的模型准备一个或多个“视图”以供操作。
- 评估模型:使用所选特征估计模型在未见数据上的准确性。
你需要一个明确定义的问题,这样你才知道何时停止这个过程,转而尝试其他模型、其他模型配置、模型集成等等。一旦你在想法或准确性增量上达到平台期,后续流程中还有收益可图。
你需要一个经过深思熟虑和精心设计的测试框架,以客观地评估模型在未见数据上的技能。这将是你衡量特征工程过程的唯一标准,你必须相信它,以免浪费你的时间。
特征工程的一般示例
让我们让特征工程的概念更具体一些。
在本节中,我们将考虑表格数据,就像你在Excel电子表格中可能有的那样。我们将看一些手动特征构建的例子,你可以在自己的问题上考虑使用这些例子。
当我听到“特征工程至关重要”时,我想到的就是这种类型的特征工程。这是我最熟悉和实践的最常见的形式。
哪种方法最好?你事先无法知道。你必须尝试它们并评估结果,以在你的算法和性能指标上取得成就。
分解分类属性
假设你有一个分类属性,比如“物品颜色”,可以是“红色”、“蓝色”或“未知”。
“未知”可能是特殊的,但对于模型来说,它看起来只是另一种颜色选择。更好地揭示这些信息可能是有益的。
你可以创建一个新的二元特征,名为“有颜色”,当物品有颜色时赋值为“1”,当颜色未知时赋值为“0”。
更进一步,你可以为“物品颜色”的每个值创建一个二元特征。这将是三个二元属性:“是红色”、“是蓝色”和“是未知”。
这些额外的特征可以用来替代“物品颜色”特征(如果你想尝试一个更简单的线性模型),或者作为它的补充(如果你想从像决策树这样的模型中获得更多信息)。
分解日期时间
一个日期时间包含大量信息,模型在其原生形式下很难利用,例如ISO 8601格式(即2014-09-20T20:45:40Z)。
如果你怀疑时间与其他属性之间存在关系,你可以将日期时间分解为组成部分,这可能让模型能够发现并利用这些关系。
例如,你可能怀疑一天中的时间与其他属性之间存在关系。
你可以为小时创建一个新的数值特征,名为“一天中的小时”,这可能有助于回归模型。
你可以创建一个新的有序特征,名为“一天中的时段”,包含4个值:“上午”、“中午”、“下午”、“晚上”,并根据你认为相关的任何小时界限来划分。这可能对决策树有用。
你可以使用类似的方法来找出星期中的时间关系、月份中的时间关系以及一年中各种季节性结构。
日期时间信息结构丰富,如果你怀疑数据中存在时间依赖性,请花时间仔细梳理它们。
重新构建数值量
你的数据很可能包含数量,这些数量可以被重新构建以更好地揭示相关结构。这可能是转换成一个新的单位,或者将一个速率分解成时间和数量两个部分。
你可能有一个像重量、距离或时间这样的量。对于回归和其他依赖于尺度的模型来说,线性变换可能是有用的。
例如,你可能有以克为单位的“物品重量”,值为6289。你可以创建一个新特征,将这个数量转换为千克,即6.289,或者四舍五入为6千克。如果领域是运输数据,那么千克对于“物品重量”来说可能是一个足够或更有用(噪音更少)的精度。
“物品重量”可以被拆分为两个特征:“物品重量_千克”和“物品重量_剩余克数”,示例值分别为6和289。
可能存在领域知识,即重量超过4千克的物品会产生更高的税率。这个神奇的领域数字可以用来创建一个新的二元特征“物品超过4千克”,对于我们6289克的例子,其值为“1”。
你也可能有一个以速率或某个时间间隔内的总量的形式存储的数量。例如,一年内汇总的“顾客购买次数”。
在这种情况下,你可能需要回到数据收集步骤,除了这个聚合值之外创建新的特征,并尝试揭示购买中更多的时间结构,比如季节性。例如,可以创建以下新的二元特征:“夏季购买”、“秋季购买”、“冬季购买”和“春季购买”。
特征工程的具体示例
研究特征工程示例的一个好地方是机器学习竞赛的结果。
竞赛通常使用来自现实世界问题领域的数据。在竞赛结束时,需要撰写一份关于方法和途径的报告。这些报告为有效的现实世界机器学习过程和方法提供了宝贵的见解。
在本节中,我们将介绍一些有趣且值得注意的赛后报告,这些报告侧重于特征工程。
在2010年KDD杯中预测学生考试成绩
KDD杯是每年为ACM知识发现与数据挖掘特别兴趣小组会议的与会者举办的机器学习竞赛。
2010年,比赛的重点是模拟学生学习过程的问题。提供了一份学生代数问题成绩的语料库,用于预测这些学生未来的表现。
比赛的获胜者是台湾大学的一群学生和学者。他们的方法在论文《2010年KDD杯的特征工程和分类器集成》中有详细描述。
该论文将特征工程归功于获胜的关键方法。特征工程通过创建数百万个二元特征简化了问题的结构。这种简单的结构使得团队能够使用性能高但非常简单的线性方法来获得获胜的预测模型。
该论文详细说明了问题结构中特定的时间性和其他非线性如何被简化为简单的复合二元指标。
这是一个极端且富有启发性的例子,展示了简单的属性分解可能达到的效果。
在Heritage健康奖中预测患者入院情况
Heritage健康奖是一项300万美元的奖项,授予能够最好地预测哪些患者将在未来一年内入院的团队。
该奖项每年都设有里程碑奖,顶尖团队会获奖,并且他们的流程和方法也会被公开。
我记得在三个里程碑中的第一个里程碑发布时阅读了论文,并对其中涉及的大量特征工程印象深刻。
特别是,Phil Brierley、David Vogel和Randy Axelrod的论文《第一轮里程碑奖:我们是如何做到的——Market Makers团队》。大多数竞赛都涉及大量的特征工程,但这篇论文清晰地阐明了这一点,让我印象深刻。
该论文提供了构建这些属性所需的属性表和SQL。
该论文通过简单的分解给出了一些很好的现实世界特征工程示例。其中有很多计数、最小值、最大值,大量的二元属性和离散化的数值属性。使用了非常简单的方法,取得了很好的效果。
更多关于特征工程的资源
我们在本文中涵盖了很多内容,我希望你对什么是特征工程、它在何处适用以及如何去做有了更深的理解。
这确实是你旅程的开始。你需要练习特征工程,并且需要学习特征工程的优秀实践者。
本节提供了一些可能对你的旅程有所帮助的资源。
书籍
我找不到任何关于这个主题的书籍或书籍章节。
然而,有一些关于特征提取的优秀书籍。如果你正在处理模拟观测的数字表示,如图像、视频、声音或文本,你可能想深入研究一些特征提取的文献。
关于特征选择的书籍也很多。如果你正在努力通过移除冗余或不相关的特征来减少你的特征,请深入研究特征选择。
论文和幻灯片
这是一个很难找到相关论文的主题。
同样,有大量关于特征提取的论文和书中关于特征选择的章节,但关于特征工程的内容不多。此外,特征工程在软件工程中也有一个含义,与我们的讨论无关。
以下是一些普遍相关的论文
以下是一些普遍相关且有趣的幻灯片
- 特征工程(PDF),知识发现与数据挖掘1,作者:Roman Kern,知识技术研究所
- 特征工程与选择(PDF),CS 294:实用机器学习,伯克利
- 特征工程工作室,课程讲座幻灯片及材料,哥伦比亚大学
- 特征工程(PDF),Leon Bottou,普林斯顿大学
链接
到处都有博客文章。最有用的链接是那些通过一个问题进行讲解并清晰阐述有意识的特征工程的教程。
以下是一些普遍有趣的链接
- 特征工程:如何在泰坦尼克号竞赛中进行特征工程(Kaggle上的一个入门竞赛)。数据整理比特征工程多,但仍然很有启发性。
IPython Notebook by Guibing Guo, dedicated to explaining feature engineering. A bit messy, but worth a skim(链接似乎已失效,抱歉。)
视频
关于特征工程主题有一些视频。迄今为止最好的是由Ryan Baker制作的题为“特征工程”的视频。它很短(大约9分钟),我建议观看它以获取一些好的实践技巧。
https://www.youtube.com/watch?v=drUToKxEAUA
如果你认为我遗漏了某个关键概念或资源,请留言。
2015年更新:我注意到现在有一个关于特征工程的维基百科文章,它抄袭了这篇文章的大部分内容。唉,算了。
这本书的第10章:http://books.google.co.uk/books?id=Ofp4h_oXsZ4C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false 有一个关于特征的不错章节。
另外,我认为有时你可以将集成方法视为特征学习。
《机器学习:让数据有意义的算法的艺术与科学》是一本很棒的书,谢谢Sam的提示。
我完全同意。当你客观地看待正则化甚至集成方法时,事情会变得复杂。我认为这就是为什么我们在实践中谈论这些东西时,倾向于使用像“特征工程”这样模糊的名称,而不是一个具体的子主题。
尽管听起来很重要,但我很少听到特征工程这个术语,即使在实用机器学习中也是如此。这里涵盖的大多数内容在正则化或其他阶段也已经被处理了。
尽管如此,我支持这里所作的区分,并且我认为特征工程不仅在实用机器学习中,而且在理论中也占有一席之地。
说得好,Anurag。
一篇优秀、组织严谨的文章,对特征提取和分析有深刻的见解。我喜欢这篇文章的“无数学”方法,却能对如此广泛的主题进行简明扼要的描述。
资源列表也很好。在我读完机器学习的书籍之后,它们就在我的“下一本要读”清单上。
谢谢你,Jason!
谢谢Akash,让我知道你对这些资源的看法。
我发现《特征提取:基础与应用》这本书引人入胜,难以释卷。
没有什么比周六早上阅读Jason关于特征工程的文章更棒的了。我一直很困惑,为什么很多人都认为这是一个如此重要的话题,但关于这个话题的正式信息却很少。
然而,这篇报告我已保存。它包含了关于这个主题的多种来源,并给出了一些真正可行的步骤来培养从业者的直觉。
干得漂亮…
谢谢 Damian!
非常感谢 Jason,感谢您在机器学习方面的所有教导。
不客气,Roselyn。
很棒的文章(一如既往)
一个问题,您能否详细解释一下以下内容
“这些额外的特征可以用来替代‘物品颜色’特征(如果你想尝试一个更简单的线性模型),或者作为它的补充(如果你想从像决策树这样的模型中获得更多信息)。”
谢谢
Udi
谢谢 Udi!
这句话的意思是,你可以在训练模型时,在数据中使用像“有颜色”和“是红色”这样的新特征,来补充或替代“物品颜色”这个属性。需要对你的具体数据集和选择的模型进行实验,看看哪种方式能得到最好的结果。
谢谢Jason,不过我想了解为什么决策树能从额外的特征中受益,而更简单的线性模型却不能。
非常感谢
Udi
嗨,Jason,
我和Udi有同样的问题:“……为什么决策树会从额外的特征中受益,而更简单的线性模型则不会”
你没有回答这个问题。
谢谢!
我想要表达的前提是,分解通过增加属性的复杂性来降低模型的复杂性。
例如,如果分解是非线性的,模型就不再需要复杂的关联非线性属性值与类别和其他属性,而是可以直接处理分解后的元素。
更简单的模型更好,而且使用分解后的属性所带来的简化通常允许使用更简单的模型,例如,如果分解后的属性有助于类别值的线性可分性,那么就可以使用线性模型。
谢谢你。我还有一个关于冗余的问题。
你建议除了原始特征“物品颜色”之外,还可以使用新的特征“有颜色”、“是红色”、“是蓝色”和“是未知”。
我的第一反应是这些新特征是多余的,因为信息已经包含在原始特征中了。新特征只是提供了信息的另一种表示方式。
您能详细说明一下吗?
非常好的文章,谢谢你Jason!!!对非计算机科学家来说也易于阅读
很高兴听到这个消息,谢谢 Kira。
太好了,谢谢你,avar for avar
非常欢迎你,Ishika!
一篇清晰、内容丰富的文章,提供了很好的例子和进一步的阅读材料。干得好,Jason!
谢谢 Juane!
谢谢Jason用简单的语言解释特征工程 🙂
不客气!
非常好的文章,Jason。你有没有关于测试和验证模型的不同技术的文章?
我也想学习一些关于交叉验证的文章。谢谢!
Jason,感谢你发布所有这些有用的知识。我正在参加我的第一次机器学习竞赛,并且已经阅读了你的许多帖子,这些帖子回答了我的问题。
写得好,Jason!我100%同意,特征工程非常重要,但很少有人写。Kaggle的总结也同意这一点:http://blog.kaggle.com/2014/08/01/learning-from-the-best/。
很棒的文章和参考链接。您对时间序列数据(例如股票价格等)的特征工程有什么建议吗?
http://nbviewer.ipython.org/url/luckymoon.me/docs/Features.ipynb
对于那个失效的链接。我把它当作笔记写的,但不知道这里引用了它。
嗨 Jason
这篇文章太棒了。我目前正在开发一个特征工程引擎,它通过查看源/输入数据来绘制你描述的整个过程。它既是自动化的,也是一个手动过程。一旦准备好,我会分享细节。
再次感谢你写这篇文章。
嗨,Jason,你能告诉我如何将PCA与LR或CART结合使用吗?谢谢
我这里有一个关于数据准备中PCA的简短例子,可能会有帮助
https://machinelearning.org.cn/pre-process-your-dataset-in-r/
这是一篇很棒的文章。非常感谢。
我很高兴你觉得它有用,Jason。
谢谢Jason,一篇非常有用的文章,附带了很多很棒的资源。非常感谢。
我很高兴你觉得它有用,tatta。
很棒的文章!这里有一本新书,你可以添加到这篇文章的参考部分:http://shop.oreilly.com/product/0636920049081.do
谢谢Marcos的指点。我拿到了先行版,但还没读。它在我的阅读清单上排在很前面。
这篇教程真的很酷,Jason。非常感谢。目前正在处理一个只有时间戳和值的数据集。通过我所学到的,对特征(时间戳)进行工程,提取出一天中的小时、一年中的季节、读数和读数余数将会非常有用。
非常感谢
非常好!
我计划很快写一篇关于时间序列数据特征工程的文章。
非常好,谢谢你,
对了,有没有关于
https://en.wikipedia.org/wiki/Deep_feature_synthesis
http://www.feature-labs.com/
的代码示例?我好像以前见过这种方法的非商业版本。
嗨,Sander,抱歉,我对深度特征合成不熟悉。
从您的文章中,我确实理解了在机器学习应用中识别特征的重要性。虽然对机器学习还很陌生,但我被它解决我所在领域一些挑战性问题的能力所吸引。我目前正在研究一个用于诊断产品问题的数据集。简单来说,每个问题都有一个ID、问题描述和解决方案。
问题描述是一行文本。这可以被定义为一个特征吗?我总是能看到更多描述相同或相似的问题。但是这行文本需要被映射成一个数字!
或者,我是否应该通过文本分析从文本中提取更多信息作为特征,以便它们可以被转换成数字,从而使机器学习算法能更容易地工作。
再次感谢您提供的优质资源,这帮助我适应了这个激动人心的领域。
好问题,Ravi。
你可以从一行文本中提取特征,也可以将每个词或词对/三元组视为特征。
你可能想阅读一下自然语言处理(NLP)领域中关于文本数据的良好表示方法,比如词袋模型和词嵌入。
感谢这篇文章,非常有帮助!
很高兴听到这个消息,Ed。
嗨,Jason,谢谢这篇文章
我有一个关于以下内容的问题
‘需要一个经过深思熟虑和精心设计的测试框架,以客观地评估模型在未见数据上的技能’
如何实现这一点,这会是训练/测试集划分后的测试数据吗,还是说您的意思不止于此?
好问题,请看这个过程
https://machinelearning.org.cn/start-here/#process
很棒的文章,Jason。非常有用,特别是那些例子。我是机器学习的新手,这可能是一个非常基础的问题,但我还是想问。
物品颜色可以被描述为“有颜色”和“有未知”,这是一个很好的引入特征。
那么我们就有两个特征了对吗?一个是原始的“物品颜色”,另一个是新添加的。我们该如何处理这种情况呢?
是我们在建模时不考虑原始特征(使用新的),还是两者都用?
是的,你可以替换原始特征或者保留它。通过测试和使用模型技能来帮助你发现什么是具有预测性的。
好文章。R中有没有用于特征工程的包?
我不知道,抱歉。
特征工程是一个过程。没有一个现成的包能帮你解决所有问题……我劝你更多地去理解什么是特征工程。它是一个过程,而不是某个包里提供的算法。
我同意。
非常有趣且有价值的文章,谢谢你。特征选择是整个过程中非常实际的一部分,这意味着它比其他任何事情都更需要对研究主题有深入的理解。
我同意这是关键!
嗨,Jason,
好文章,这是谷歌搜索“特征工程”关键词的第二个结果。这里有一个问题
一般来说,如何处理基于计数的特征,比如点击次数、预订次数等?这类特征的问题是它们的值会持续增加,这会使模型随着时间的推移而失效。即使时间范围限制在上个月,它也会受到季节性的影响。
或许可以使用阈值和二元标志?(高于x,低于x)
或许可以使用离散的分箱?(低、中、高)
也许使用重新缩放(对数?)
我非常喜欢这篇文章。它非常全面。实际上,我非常喜欢Brownlee博士的文章,因为它们既简单又不失全面性。
不过,我对这篇文章有些疑问。
虽然这些问题可能没有绝对的答案,但您的意见仍然会非常有帮助。
1) 什么时候将名义数据保持原样,而不是转换为独热编码会更好?
-- 据我所知的大多数机器学习算法中,没有一种算法更偏好名义数据类型而不是通过独热编码转换的二元特征。(只要它不是有序的)。您举的眼睛颜色的例子就是其中之一,但我们还可以有国家、州、星期几等许多其他例子。名义数据中的这些类别不能有顺序关系,因此,建议通过独热编码将它们转换为独立的特征。如果是这样,什么时候保留名义特征会是好的选择呢?是否有任何机器学习算法用名义特征比用独热编码的类别特征能更好地解决问题?
2) 选择算法
当被问到选择哪种算法时,最常见的答案是“这取决于数据集”。说起来容易,但实际上,我常常觉得这个答案不负责任。
对于只有少数特征且全是数值变量的数据集,所有的机器学习算法都会欢迎它。有人可能会说线性回归是最好的,因为它简单,但说实话,以我们现在的计算能力,选择XGboost并不会比使用线性回归占用太多资源。
当我们的变量是混合数据类型(既有数值型又有分类型),并且特征很多(高维)且数据稀疏(每个特征中有很多零)时,问题就出现了。
问题又来了,没有一种机器学习算法欢迎这类数据集。我一直在寻找处理混合数据类型(比如80%的特征是独热编码,20%是数值型)和稀疏数据(如果我们将名义数据转换为独热编码,就会出现这种情况)的技巧。
没有人真正给我一个明确的答案。
有人说常规回归算法对许多分类数据(独热编码)处理得很好,但也有人说像XGboost这样的复杂模型效果更好。但缺乏推理。
我很期待能听到您对此的看法。
如果有任何理论上的推理,那将非常有帮助。
有帮助。
先谢谢您了。
好问题。没有最佳的表示方法或算法,我们无法先验地通过分析来选择它们。
我们必须发现什么对我们的特定数据最有效。这就是应用机器学习的任务。
请看这篇文章
https://machinelearning.org.cn/a-data-driven-approach-to-machine-learning/
嗨,先生
我们如何使用weka工具来设计我们的特征?
我猜你会用过滤器。
抱歉,我没有例子。
这篇文章描述详尽,内容全面。如果你能在介绍特征演变的同时,给出一个工程相关的实例,那就更好了。不过,总的来说是篇好文章 (y)
感谢您的建议。
感谢你的这篇文章,Jason。它为我打开了特征工程领域许多想法的大门。不过,我目前正尝试处理安卓权限属性,但我仍然不太明白如何将这些属性转换为可训练的特征。我的目标是开发一个模型来检测安卓恶意软件。请问你有什么建议或指导可以进一步帮助我理解这个概念吗?在你的文章中,你给出了一个将分类属性转换为二进制特征的例子,如果你能帮帮我,我将不胜感激。谢谢你,Jason。
我不太熟悉这些数据,抱歉没有好的建议。
也许你可以找一些已经被构建用于机器学习的类似数据示例,并从中获取灵感?
尽管特征工程对机器学习如此重要,但令人惊讶的是,它得到的正式关注和研究却很少,所以很高兴看到这样的文章!
这篇文章很好地讲述了如何使用现有的特征矩阵,然后在应用机器学习之前进行特征工程以改善它。然而,我看到另一个反复出现的重要场景是,当你有多表或非常细粒度的数据集需要进行特征工程时。例如,客户信息的关系型数据库或用户与产品交互的日志文件。这里的各位都使用什么工具来处理这类数据集呢?
我和我的同事们经常遇到对这些数据集进行特征工程的问题,因此我们发布了一个名为Featuretools (www.featuretools.com) 的开源Python库,用于自动化特征工程。它基于麻省理工学院的数据科学研究,该研究产生了一种名为“深度特征合成”(Deep Feature Synthesis)的算法[1]。希望它能对这里的人们有所帮助。
[1] https://dai.lids.mit.edu/wp-content/uploads/2017/10/DSAA_DSM_2015.pdf
感谢分享链接,不过你所描述的更像是特征工程,而不是特征选择。
https://machinelearning.org.cn/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
如何区分一个好的特征和一个坏的特征?相关性(或平方相关性)足够吗?
最好的方法是看它是否能提高模型的预测能力。
有没有可能在运行模型之前就检验特征的好坏(假设数据量很大)?我这么问是因为有时在展示特征重要性图表时,我发现相关性最低的特征反而是最重要的。
当然可以。
嗨,Jason,我正在为一个现有的逻辑回归数据集做特征缩减。我可以移除那些用于创建组合变量的单个变量吗?我说的组合变量是指聚合变量(一些独立变量的和或均值)。
谢谢。
顺便说一句,文章很棒。
当然可以,试试看它如何影响你的模型。
先生,我有一些原始数据,需要从中提取特征。数据是我自己收集的。我需要进行二元分类。所以我想知道,是不是一开始必须有很多特征,然后我们再从中选择有用的特征。
第二个问题,应用机器学习算法是否必须有大量数据?我的数据量不多,但覆盖了各种模式,也就是说训练数据质量很好。
谢谢
我建议你尽可能多地提取你能想到的特征,看看哪些可能增加价值。
关于你需要多少数据,请看这篇文章。
https://machinelearning.org.cn/much-training-data-required-machine-learning/
太棒了,Jason,感谢你投入所有精力来寻找、总结和呈现这个重要主题的信息。这确实让人深刻体会到这个阶段的重要性,以及它如何区分优秀的机器学习团队和卓越的团队。我正在收藏这个页面,以便回来重读要点并浏览所有链接。
谢谢,很高兴对您有帮助。
嗨,Jason,
您在文章中说“我们可能永远不会有自动化的特征工程”,但我实际上是在研究了Feature Labs及其在自动化特征工程方面的工作(见Featuretools)后才找到您的文章的。看起来他们正试图至少部分地合成特征工程中的“人类直觉”方面。您对此有何看法?自从您写这篇文章以来,您对自动化(或接近自动化)特征工程的看法有改变吗?
有意思。
我想深度学习也是一个解决方案,比如特征学习。但实际上程度较轻。人类在这方面效率高得多,尤其是在有一点领域知识的情况下。
你所采用的方式很好,因为你不会去解决那些失效的机器。很多工程师不会有这类想法。最新的深度学习方法在这一领域取得了一些成功,例如自编码器和受限玻尔兹曼机。
你有一些例子吗?
我可能基本上是个笨蛋,不过,我正在从头开始研究“泰坦尼克号”问题。我完全 clueless(一窍不通),对那些能得出“完美”答案的不同系统也毫无理解,但我多少还是有点逻辑的。在我看来,从智力角度讲,大多数系统就像是50%的“是”或“否”的抛硬币,而且在你选择的任何因素之间似乎都没有任何已知的、一致的逻辑关系。我确实意识到在人工智能中,你会使用大量的例子,这个过程通过“权重”或从我幽默的角度看是“瞎搞”,让你更接近答案。我幽默地把它看作是试图决定一群人中哪个人肯定会在某个特定日期死去。
我们可以使用基线率,比如预测平均结果作为基线模型。
如果一种方法不能超越基线,那么它就没有价值或没有技能。
我相信在泰坦尼克号数据集上,结果远好于基线。
也许这个过程会帮助你处理你的数据集。
https://machinelearning.org.cn/start-here/#process
嗨,Jason。一些通常建议的基本特征变换是对数变换,或者取同一变量的更高次多项式并将其添加到数据集中(就像这个答案中一样:https://datascience.stackexchange.com/a/10664)。由于这些新变量是由现有变量生成的,它们不会引入多重共线性问题吗?这一点需要担心吗?您能就此点拨一下吗?
是的,它们可能会,具体取决于阶数。然而,它们可以提高模型的预测能力。
非常感谢Jason
我很高兴它能帮到你。
嗨,Jason,
需要您的帮助,拜托了..
我收到了一个归一化的数据集(未提供原始数据),要求我根据任何现有关系识别新特征。
通过观察数据,我找不到任何关系。我该如何继续.. 聚类分析能帮助找到新特征吗?
请指教
谢谢
Sekhar
你说的“新特征”是什么意思?比如特征工程?
你可以使用均值、最小值、最大值、标准差、众数、中位数等。
非常感谢分享这个伟大的作品
很高兴它有帮助。
非常有趣的文章。不过,我想知道在使用集成方法进行股票价格预测时,是否可以进行特征工程。
也许可以,但我对股票价格预测不太了解,抱歉。
我想知道在Python中是否有一种方法或函数可以计算每个特征的分类错误,而不是全局的分类错误(它实际上等于FDR = 1- precision),就像计算每个特征的重要性一样。提前感谢。
没有,我没见过这样的东西,也许除了在非常简单的线性模型中,可以将预测中的方差量归因于某个系数/特征。
嗨,Jason,
在特征工程中,如果我们发现30个特征中只有10个具有信息价值或重要性度量,而其他的没有,我们能将它们从数据集中删除吗?
把特征工程和特征选择看作是“建议”。
通过测试来确认对输入特征的改变是否能提高模型性能。
谢谢Jason,那么这是否意味着即使在特征选择之后,所有的特征都会到达模型并被模型使用?
不,我不太明白你的意思?
我简直太喜欢这篇文章了。我是在上一个Coursera课程“如何赢得数据科学竞赛:向顶级Kagglers学习”时偶然发现它的。
课程在阅读部分提到了这个链接。我在Kaggle的一个问题上卡住了,通过调整超参数和更换模型都没有显著的改进。我感觉需要设计更多的特征。然而,由于知识有限,我对特征工程,尤其是手动部分,有一种负面的看法。这种看法的根源在于关于基于深度学习的自编码器能够自动提取特征的新闻。虽然这是事实,但它不能应用于每个问题。因此,从数据中获得洞察并创建有效特征的技巧在今天仍然非常重要。感谢您写了这么棒的一篇文章 🙂
谢谢,很高兴它能帮到你!
这是一篇关于特征工程的优秀文章。特征工程是否依赖于性能指标(RMSE?AUC?)和问题的构建方式?你能解释一下是哪种类型的依赖关系吗?
我们通常根据特征对模型性能的影响来选择它们,性能由某个对领域重要的指标来衡量。
很棒的材料,谢谢分享。
谢谢,很高兴对您有帮助。
感谢您的分享,非常有条理。迫不及待地想阅读您推荐的内容。
谢谢。
这又是一个很棒的例子。我不想用评论来打扰你,因为我更希望你创作出更多优质的内容。但是我现在有一个理由发帖,所以我想借此机会表达我的感谢。请将我的感谢乘以1.13倍的努力天数,以得出我想向你表达的恰当的感谢量。
看起来‘How we did it’这篇论文的链接已经失效了。我找到了下面这个链接,我相信这正是您引用的那篇论文。
https://foreverdata.org/1015/content/milestone1-2.pdf
谢谢Niklas,已修复!
感谢这篇详细的文章
能否为我推荐一些关于无监督特征选择/提取的资料?
例如工作实例、Python包等。
非常感谢
从这里开始
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
嗨,Jason,
感谢您的精彩博客文章;
供您参考
“Feature Engineering and Classifier Ensemble for KDD Cup 2010”这个链接似乎无法正常使用,我在这里找到了这篇论文
https://pslcdatashop.web.cmu.edu/KDDCup/workshop/papers/kdd2010ntu.pdf
谢谢,已修复!
关于如何擅长特征工程有什么建议吗
在许多不同的数据集上练习。
根据结果拟合模型,看看什么方法有效。
阅读人们在比赛中使用的技巧。
我在这里读到了一些非常好的东西。当然值得收藏
以便重温。我好奇您投入了多少努力来制作
这样一个信息量丰富的优秀网站。
谢谢!
非常感谢这篇文章。我正试图寻找“如何推导特征”并找到了您的帖子。对于一个机器学习新手来说,使用医疗领域的文本数据,有很多东西要学。但当您将特征构建描述为一门艺术时,这让我回想起了用于分析文本的内容分析方法论的基础。在我的案例中,我不是在文档、短语或句子级别(常用于情感分析)上看特征,而是在词语级别。
我想我曾在某处读到,基础通常是相同的,只是可能名称不同。
再次感谢!
不客气。
嗨,Jason,
我的数据集中有两列X和Z。我想创建一个新列Y=X-Z,然后删除现有的X和Z列。我的问题是,我应该只对训练数据集应用这个特征工程,还是应该对训练和测试数据都应用?如果我对测试数据集应用这个特征工程,是否存在数据泄漏的问题?
不,你应该对所有数据都应用这个操作。
这不会造成泄漏,因为它在训练期间没有使用样本外数据。
谢谢 Jason
不客气。
iPython Notebook [https://ipython.pythonlang.cn/notebook.html]
我认为notebooks不是一个好主意
https://machinelearning.org.cn/faq/single-faq/why-dont-use-or-recommend-notebooks
感谢您将这些内容公之于众。我同意您的观点,并希望更多人也能认同这一点。
谢谢。很高兴你喜欢。
嗨,Brownlee先生,
感谢您提供的精彩内容。我有个疑问。在进行特征工程时,我们如何确保我们的努力能带来更好的分数?
作为测试平台,我们应该使用默认模型(默认模型参数)吗?
– 首先,使用默认模型处理原始特征和原始数据,得到一个分数 -> S1
– 然后,处理数据,设计特征等,使用默认模型得到一个分数 -> S2
然后比较S1和S2。
还是我们应该在每一步都优化超参数,然后再比较结果?
如果你将训练集和测试集分开,你可能会发现测试集分数S2优于测试集分数S1,而训练集可能显示S1优于S2。在这种情况下,你可以确认S1中的模型存在过拟合,而进行特征工程是有帮助的。
“我找不到任何关于这个主题的书籍或书籍章节。”
-> 我认为这个说法/部分需要更新。在2014年这篇文章最初发表时可能是正确的,但在过去几年里,已经出版了一些很棒的特征工程书籍,例如:
– Zheng, A., & Casari, A. (2018). Feature Engineering for Machine Learning: Principles and techniques for Data scientists. O’Reilly.
– Kuhn, M., & Johnson, K. (2020). Feature engineering and selection: A practical approach for predictive models. CRC Press
(见:https://machinelearning.org.cn/feature-engineering-and-selection-book-review/)
这只是其中几本,还有更多关于这个主题的书籍已经出版。
感谢指出这些!确实有越来越多的出版物问世。
我也很喜欢您的网站,因为您的博客里有各种各样的信息。您让我的一天都变得美好了。感谢您做的一切。
感谢您的美言!
我有一个问题,我做完了特征工程,得到了140个新特征,其中有20个在事务数据库中有效,其余的都是新的,我用它们来训练模型。现在我的问题是,为了让模型能够完成,我有很多新特征是事务应用程序所没有的。在这种情况下我应该怎么办?
嗨,Pacho…你会发现特征降维技术会很有价值
https://machinelearning.org.cn/dimensionality-reduction-for-machine-learning/
机器学习全部都是关于预测吗,还是有其他应用?
内容切中要点。很棒的分享!
感谢Ajay您的反馈和支持!