功能工程实用程序:为什么要基于现有功能创建新功能?


30

我经常看到人们基于机器学习问题的现有功能来创建新功能。例如,在这里:https : //triangleinequality.wordpress.com/2013/09/08/basic-feature-engineering-with-the-titanic-data/人们已经将一个人的家庭规模视为一项新功能,基于现有的功能,包括兄弟姐妹和父母的数量。

但是,这有什么意义呢?我不明白为什么创建相关的新功能很有用。独自执行此操作不是算法的工作吗?


Answers:


30

用于说明此问题的最简单示例是XOR问题(请参见下图)。想象一下,您得到的数据包含和坐标,以及要预测的二进制类。您可能希望机器学习算法本身就能找到正确的决策边界,但是如果生成了附加特征,那么问题就变得微不足道了,因为为您提供了几乎完美的分类决策准则,并且您仅使用了简单的算法!xyz=xyz>0

XOR问题

因此,尽管在很多情况下您可以期望算法找到解决方案,但是通过特征工程,您可以简化问题。简单的问题更容易解决,并且需要的算法也更少。简单的算法通常更健壮,结果通常更可解释,它们更具可伸缩性(较少的计算资源,训练时间等)且可移植。在伦敦PyData会议上Vincent D. Warmerdam精彩演讲中,您可以找到更多示例和解释。

此外,不要相信机器学习营销人员会告诉您的一切。在大多数情况下,算法不会“自己学习”。您通常只有有限的时间,资源,计算能力,并且数据通常只有有限的大小且嘈杂,这都无济于事。

更极端的是,您可以将数据作为实验结果的手写笔记的照片提供,然后将其传递给复杂的神经网络。它首先会学会识别图片上的数据,然后学会理解并做出预测。为此,您将需要一台功能强大的计算机和大量时间来训练和调整模型,并且由于使用了复杂的神经网络,因此需要大量数据。由于您不需要所有字符识别,因此以计算机可读格式(如数字表)提供数据可以极大地简化问题。您可以将特征工程视为下一步,以这种方式转换数据以创建有意义的功能,因此您自己的算法几乎不需要弄清楚。打个比方,就像您想读一本外语书籍一样,因此您需要先学习该语言,而不是阅读以您所理解的语言翻译的书。

在Titanic数据示例中,您的算法将需要弄清楚对家庭成员进行求和才有意义,以获得“家庭规模”功能(是的,我在此处进行个性化设置)。对于人类来说,这是显而易见的功能,但是如果您仅将数据视为数字的某些列,就不会很明显。如果您不知道将哪些列与其他列一起考虑时有意义,则算法可以通过尝试使用这些列的每种可能组合来找出答案。当然,我们有巧妙的方法来执行此操作,但是,如果立即将信息提供给算法,则容易得多。


谢谢,它解释得很好,也很有趣!
Matthieu Veron

我觉得您的回答很好,但我认为最好将其限定。具体来说,我认为就交互作用而言的功能工程并不能简化RF之类的算法(尽管仍然可以提供帮助),因为RF可以在一定程度上自行捕获交互作用。让我知道我是否错过了重要的事情。但是是的,总的来说,特征工程可以简化并帮助很多事情。
诗人莫迪

@PoeteMaudit确实,决策树(以及RF)为一个大型交互建模,但它是一种特定类型的交互,而不是每种可能的交互。此外,特征工程不仅涉及交互。
蒂姆

我当然同意你的观点。首先,RF对某种类型的交互进行建模(您的意思主要是x * y?)。其次,该功能工程当然不仅涉及交互。
诗人莫迪

14

好吧,如果您打算使用一个简单的线性分类器,那么生成新功能(这些功能是现有功能的非线性功能)是非常有意义的,特别是如果您的领域知识表明您所得到的功能将是有意义的和有益的。请注意,线性分类器不能考虑那些复杂的功能,除非您明确提供它们。

理想情况下,如果使用足够强大的非线性分类算法,则应该能够创建一个决策边界,该边界将考虑输入要素的任意非线性变换(如果它们有助于分类)。但是,实际上,大多数非线性分类器只是查看某种类型的转换。例如,多项式内核SVM将考虑要素之间的多项式相互作用,但是也许可以通过应用其他类型的转换来创建更多信息的要素...

简而言之,如果领域知识表明手工制作的非线性特征组合可能有用,则可以将其添加到现有特征集中。


好,我懂了 !但是,我怎么知道我创建的功能是否有意义和有用?我的意思是,问题可以有违反直觉的解释。据我了解,创建功能是一种将算法导向一个方向,节省预测时间的方法。因此,在某些方面,我们正在影响算法。如何验证我们的影响力正确?
Matthieu Veron

2
好吧,那就是领域知识的到来。例如,如果您正在设计医疗诊断系统,则可以与医生交谈,并询问他们他们使用什么信息来诊断患者。例如,如果一位医生说“如果病人发烧和头痛,那么他很可能会感冒”。该句子可能表明包括一个新的标志特征,该特征指示发烧和头痛的同时存在可能是一个好主意(特别是如果您使用线性分类器,它本身不能“看到”多项式相互作用特征)。
DanielLópez18年

1
尽管如此,这更多的是艺术而不是科学。最后,您需要通过使用无偏实验协议在测试集上测试模型来验证手工制作功能的有效性……
DanielLópez18年

3

的确,某些机器学习模型具有处理非线性和变量之间相互作用的能力,但是,根据情况,我认为这是有必要的三个原因。

  1. 某些模型(例如线性回归)不能自动处理非线性,在这种情况下,您需要创建其他功能来提供帮助。例如下面的示例:如果您具有以下数据集,则目标变量的所有都聚集在一个圆形区域的中心。Y=1

圆边界

如果仅给您两个功能,和。的简单线性模型无法找到对目标变量进行分类的任何方法。因此,相反,您需要新的四次特征来捕获非线性:。x 2 y = x 0 + c 1 x 1 + c 2 x 2 y = x 0 + c 1 x 2 1 + c 2 x 2 2x1x2y=x0+c1x1+c2x2y=x0+c1x12+c2x22

  1. 如果您事先知道某些功能(从业务知识或经验中获得),则可能有助于创建这些功能以加快模型的运行速度并使模型变得容易。例如,在您的“泰坦尼克号”数据示例中,如果您使用的是决策树分类模型。如果您知道老年女士(年龄和性别)更有可能生存,那么通过创建一个捕获信息的功能,您的树可以对新变量进行拆分,而不是对两个变量进行拆分。如果您事先知道该功能很重要,则可能会加快计算时间。

  2. 在现实世界中,您将不会像Kaggle提供的那样获得单个数据集。相反,您可以从各地获取信息。例如,如果您要预测像Amazon这样的在线零售公司的客户流失情况,则需要客户人口统计信息,购买交易信息。您需要从不同的来源生成很多功能,在这种情况下,您会发现可以从事务级别获得/汇总很多有用的功能。就像Andrew Ng所说:通常,进行特征工程的能力定义了机器学习项目的成败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.