特征工程意味着从现有数据中构建附加特征,这些数据通常分布在多个相关表中。特征工程需要从数据中提取相关信息并将其放入单个表中,然后可用于训练机器学习模型。构建特征的过程非常耗时,因为每个新特征通常需要几个步骤来构建,尤其是在使用来自多个表的信息时。我们可以将特征创建的操作分为两类:转换和聚合。让我们看几个例子,看看这些概念的实际应用。一个转化作用于单个表(思维在Python而言,表只是一个熊猫DataFrame通过创建新的功能出来的一个或多个现有列)。例如,如果我们有下面的客户表
我们可以通过查找joined列的月份或取列的自然对数来创建特征income。这些都是转换,因为它们只使用一张表中的信息。
另一方面,聚合是跨表执行的,并使用一对多关系对观察进行分组,然后计算统计量。例如,如果我们有另一个客户贷款信息的表,其中每个客户可能有多笔贷款,我们可以计算每个客户贷款的平均值、最大值和最小值等统计数据。此过程包括按客户对贷款表进行分组,计算聚合,然后将结果数据合并到客户数据中。下面是我们如何使用Pandas 语言在 Python 中做到这一点。
这些操作本身并不难,但是如果我们有数百个变量分布在几十个表中,这个过程手工完成是不可行的。理想情况下,我们需要一个可以跨多个表自动执行转换和聚合并将结果数据合并到单个表中的解决方案。虽然 Pandas 是一个很好的资源,但我们想要手动完成的数据操作只有这么多!(有关手动特征工程的更多信息,请查看优秀的Python 数据科学手册)。clients:信用合作社客户的基本信息。每个客户端在此数据框中只有一行
loans: 贷款给客户。每笔贷款在此数据框中只有自己的行,但客户可能有多笔贷款。client_id和loan_id变量),我们可以使用一系列转换和聚合来手动完成这个过程。但是,我们很快就会看到我们可以使用功能工具来自动化该过程。DataFrame如果您认为 Pandas是一张表)。一个EntitySet的是表的集合,它们之间的关系。将实体集视为另一种 Python 数据结构,具有自己的方法和属性。我们可以使用以下命令在 featuretools 中创建一个空实体集:将特征工具导入为 ft# 创建新的实体集es = ft.EntitySet(id = 'clients')clients数据帧中的索引是client_id因为每个客户端在该数据帧中只有一行。我们使用以下语法将具有现有索引的实体添加到实体集:该loans数据帧还具有独特的指数,loan_id 而且语法将它添加到EntitySet的是一样的clients。但是,对于payments数据帧,没有唯一索引。当我们将这个实体添加到实体集中时,我们需要传入参数make_index = True并指定索引的名称。此外,虽然 featuretools 会自动推断实体中每一列的数据类型,但我们可以通过将列类型字典传递给参数来覆盖它variable_types。对于这个数据帧,即使missed是一个整数,它也不是一个数字变量,因为它只能取 2 个离散值,所以我们告诉 featuretools 将 is 视为分类变量。将数据帧添加到实体集后,我们检查其中的任何一个:
列类型已通过我们指定的修改正确推断。接下来,我们需要指定实体集中的表是如何关联的。clients数据框是数据框的父级loans。每个客户端只有一行 in ,clients但可能有多行 in loans。同样,loans是 的父级,payments因为每笔贷款都会有多次付款。父母通过共享变量链接到他们的孩子。当我们执行聚合时,我们按父变量对子表进行分组,并计算每个父项的子项的统计数据。要在 featuretools 中形式化关系,我们只需要指定将两个表链接在一起的变量。所述clients和loans表经由链接client_id变量和loans与payments与被链接loan_id。创建关系并将其添加到实体集的语法如下所示:
实体集现在包含三个实体(表)以及将这些实体链接在一起的关系。添加实体和形式化关系后,我们的实体集就完成了,我们准备制作特征。loan表进行分组client_id并找到每个客户的最大贷款金额。
ft.dfs函数(代表深度特征合成)。我们传入entityset, the target_entity, 这是我们要添加特征的表,选定的trans_primitives(转换)和agg_primitives(聚合):结果是每个客户端的新功能数据框(因为我们让客户端成为target_entity)。例如,我们有每个客户加入的月份,这是一个转换特征原语:
我们还有许多聚合原语,例如每个客户的平均支付金额:
尽管我们只指定了几个特征基元,特征工具通过组合和堆叠这些基元创建了许多新特征。
完整的数据框有 793 列新功能!MEAN(payments.payment_amount) 列是深度为 1 的深度特征,因为它是使用单个聚合创建的。深度为 2 的特征是LAST(loans(MEAN(payments.payment_amount)) 通过堆叠两个聚合来实现的:LAST(最近的)在 MEAN 之上。这代表了每个客户最近一次贷款的平均支付金额。
我们可以将特征堆叠到我们想要的任何深度,但在实践中,我从未超过 2 的深度。在此之后,特征很难解释,但我鼓励任何有兴趣的人尝试“更深入”。我们不必手动指定特征基元,而是可以让特征工具自动为我们选择特征。为此,我们使用相同的ft.dfs函数调用,但不传入任何功能原语:Featuretools 已经构建了许多新功能供我们使用。虽然这个过程会自动创建新功能,但它不会取代数据科学家,因为我们仍然需要弄清楚如何处理所有这些功能。例如,如果我们的目标是预测客户是否会偿还贷款,我们可以寻找与指定结果最相关的特征。此外,如果我们有领域知识,我们可以使用它来选择特定的特征基元或用候选特征进行深度特征合成。 下一步 自动化特征工程解决了一个问题,但带来了另一个问题:特征太多。尽管在拟合模型之前很难说这些特征中的哪些是重要的,但可能并非所有特征都与我们想要训练模型的任务相关。此外,拥有太多特征会导致模型性能不佳,因为不太有用的特征会淹没那些更重要的特征。 特征过多的问题被称为维度灾难。随着特征数量的增加(数据维度的增长),模型学习特征和目标之间的映射变得越来越困难。事实上,模型运行良好所需的数据量与特征数量呈指数关系。 维数灾难与特征减少(也称为特征选择):去除不相关特征的过程相抗衡。这可以采用多种形式:主成分分析 (PCA)、SelectKBest、使用模型中的特征重要性或使用深度神经网络进行自动编码。然而,特征减少是另一篇文章的不同主题。现在,我们知道我们可以使用 featuretools 以最少的努力从许多表中创建许多特征! 结论 与机器学习中的许多主题一样,使用 featuretools 进行自动化特征工程是一个基于简单想法的复杂概念。使用实体集、实体和关系的概念,特征工具可以执行深度特征合成以创建新特征。深度特征合成依次堆叠特征原语——聚合,它们在表之间的一对多关系中起作用,转换、应用于单个表中的一个或多个列的函数——以从多个表构建新特征。 在以后的文章中,我将展示如何在现实世界中使用这种技术,即目前在 Kaggle 上举办的Home Credit Default Risk 竞赛。请继续关注该帖子,同时,阅读此介绍以开始比赛!我希望您现在可以使用自动化特征工程作为数据科学管道的辅助工具。我们的模型与我们提供的数据一样好,自动化特征工程有助于使特征创建过程更加高效。 有关 featuretools 的更多信息,包括高级用法,请查看在线文档。要了解如何在实践中使用 featuretools,请阅读开源库背后的公司Feature Labs的工作。欢迎关注作者主页,学习更多相关内容
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的