专栏首页小数志还在苦恼特征工程?不妨试试这个库

还在苦恼特征工程?不妨试试这个库

导读

从事机器学习相关岗位的同学都知道这样一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。在数据确定的情况下,那么特征工程就成了唯一可供发挥的关键步骤。广义来讲,特征工程包括特征提取、特征衍生以及特征选择等等,今天本文就来分享Python中的一个特征工程相关的库——featuretools,可自动化快速实现特征提取和特征衍生的工作,对加速机器学习建模和保证特征工程效果都非常有帮助。

featuretools是一个python的开源库(https://www.featuretools.com/),从其名字就可看出,这是一个用于特征相关的工具,是由featurelab团队最早提出设计(featurelab是美国的一家初创公司,目前已被Alteryx收购),发表于论文《Deep Feature Synthesis: Towards Automating Data Science Endeavors》中,想要详细了解其设计思想和算法原理的可参考这篇文章。今天,本文主要是介绍下它的应用和测试效果。

  • featuretools的安装和基本使用

featuretools的安装过程非常简单,和其他python库可直接使用pip工具完成安装一样,featuretools也可以这样安装。

pip install featuretools

安装完成后,调包的过程一般只需要如下一句,这就像import numpy as np一样,而后续的所有操作都是基于ft这个主入口的:

import featuretools as ft

当然,在具体使用之前,这里还是要先简单介绍下featuretools的基本设计和原理。简单来说,featuretools是用于从若干原始数据表中自动化提取特征的一个工具,以论文中的电商订单的例子为例:需要统计对各客户构建特征,所使用的数据表有两张,一个是客户基本信息表,例如年龄、性别、工资收入等;另一个是订单信息表,其中包含了每笔订单的金额、产生订单的客户等。显然,这里客户信息表和订单信息表之间的关联关系是客户ID,且一个客户ID可对应多笔订单。

以这两张表为基础,如果是手工构建特征,那么基本流程大概就是对订单表进行聚合统计,例如每个客户的总消费金额、订单笔数等统计信息,而后将该聚合统计表与客户基本信息表进行横向join,得到特征宽表。当然,在此基础上,还可以进一步地对客户基本信息和订单统计信息进行交叉衍生,例如订单消费总金额/年龄,这里先姑且不讨论特征衍生的合理性与否以及量纲的问题。下图是论文中的一幅示意图,可供端倪一二:

同样的特征构建思想,featuretools罗列了这期间的所有可能需要的特征构建算子,并设置了迭代构建的深度:max_depth。

这里首先介绍特征构建算子。在featuretools中,特征构建算子分为两大类:transform和aggregation,字面意思也可理解:tansform用于特征的衍生,例如从特征A和B衍生特A+B;aggregation用于聚合统计特征,例如在上述的订单表中对同一客户的所有订单进行count、对订单金额进行sum,这些都是aggregation操作。完整的特征构建算子可用如下方法调用显示:

特征构建算子在featuretools中称作primitive——基于

其次介绍特征构建深度的问题:max_depth。例如对于客户基本信息表中有A、B、C、D四个特征,那么A+B和C-D都是depth=1的衍生特征,而(A+B)*(C-D)则是depth=2的衍生特征,以此类推。正因如此,featuretools中的特征构建算法叫做Deep Feature Synthesis,即深度特征合成。

如上就是一些关于featuretools的基本设计的简要介绍,更为详尽的理论和使用还需查阅论文或其他资料。下面给出一个简单的demo,同时测试其效果情况,这里以sklearn中的breast_cancer数据集为例:

1.导入数据,构建DataFrame格式的数据集

dataset = load_breast_cancer()
X = dataset.data
y = dataset.target
feature_names = dataset.feature_names

df = pd.DataFrame(X, columns=feature_names)

2.调用featuretools,构建数据集实体,并设置特征构建基元,调用dfs方法(深度特征合成):

es = ft.EntitySet(id='breast_cancer')  # 用id标识实体集
# 增加一个数据框,命名为iris
es.entity_from_dataframe(entity_id='breast_cancer',         
             dataframe=df,
             index='idx',
             make_index=True)

trans_primitives=['add_numeric', 'multiply_numeric']  # 取任意两列组合的相加和相乘,衍生新的特征
XNew, new_names = ft.dfs(entityset=es, 
     target_entity='breast_cancer', 
     max_depth=1,    # max_depth=1,只在原特征上进行运算产生新特征
     verbose=1,
     trans_primitives=trans_primitives
)

3.通过train_test_split方式切分训练集和验证集,调用sklearn中的决策树算法,分别测试特征构建前后的分类效果(这里选取10次默认参数的平均值)

X_train, X_test, XNew_train, XNew_test, y_train, y_test = train_test_split(X, XNew, y)

np.mean([DecisionTreeClassifier().fit(X_train, y_train).score(X_test, y_test) for _ in range(10)])
#  0.9342657342657343
np.mean([DecisionTreeClassifier().fit(XNew_train, y_train).score(XNew_test, y_test) for _ in range(10)])
#  0.9468531468531468

可以看到,经过特征合成后的数据集,分类效果相较于之前有了大约1%的提升。当然,sklearn中的数据集本身都是比较好的数据集,即默认情况下就能取得不错的效果,另外这里的测试结果也具有随机性。

本文分享自微信公众号 - 小数志(Datazhi),作者:luanhz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【非技术面试】程序员如何快速适应新工作

    程序员如何快速适应新工作 一、要谦虚爱学习 对自己不熟悉的工具和方法要抱有谦虚的态度。新的工作就意味着学习新的东西。“知之为知之,不知为不知”,对自己不知道的...

    Java帮帮
  • 程序员如何快速适应新工作

    一、要谦虚爱学习 对自己不熟悉的工具和方法要抱有谦虚的态度。新的工作就意味着学习新的东西。“知之为知之,不知为不知”,对自己不知道的东西要谦虚和诚实。并且要记住...

    Java帮帮
  • 我是如何走上JVM这条贼船的?

    寒泉子:阿里jvm专家,主要围绕jvm发表系列文章,现有个人微信公众号:“你假笨”(ID:lovestblog)

    养码场
  • 小尝试:基于指标体系的数据仓库搭建和数据可视化

    关于作者:小姬,某知名互联网公司产品专家,对数据采集、生产、加工有所了解,期望多和大家交流数据知识,以数据作为提出好问题的基础,发觉商业价值。

    木东居士
  • 新一批优秀小程序出炉!它们真的超好玩 | 晓榜 #25

    想要省钱省流量?不妨用这个小程序申请一张腾讯王卡,享受「腾讯系 app」免流量的特权。

    知晓君
  • python共享文件,

    大佬们,你们还在为传输文件时利用U盘插拔而苦恼吗,还在为设置文件共享而苦恼吗?别苦恼了,教你反手就能实现文件的共享。

    py3study
  • 同样是玩Python,他们却能玩出花儿来~

    大家有没有在某一个月黑风高的夜晚,为以下问题苦恼过,辗转反侧过…… ? 丨饱受好评的电影《流浪星球》的评分真的有我们想象中那么高吗? 丨在北上广深哪里租房价...

    腾讯NEXT学位
  • scikit-learn 线性回归算法库小结

        scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的...

    刘建平Pinard
  • 【算法】线性回归算法库总结

    小编邀请您,先思考: 1 回归算法的道和术分别是什么? 2 如何应用回归算法? scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性...

    陆勤_数据人网
  • IntelliJ IDEA 插件,用了上头的那种

    你在写项目的时候会不会因为每修改一行代码就要重新启动项目而觉得烦恼,我在没有遇到JRebel的时候就很烦恼,重启项目如果电脑配置还可以的话就不怎么耗时,反之,心...

    框架师
  • 年底工作压力大?快让这 3 款小程序来帮你降降压

    离年底只有一个月了,无论身在职场什么岗,都会感受到不同层面的压力。毕竟,年终奖的关键时刻,谁也不想错过。

    知晓君
  • 约饭组局也要高效!这个小程序,帮你完美解决「哪天约」的问题

    有了微信,人与人的连接更加紧密了。想见面,不用书信,不用电话,一条微信就可以搭上话。然而,也正因为如此容易,约定见面时间不再像以往那样稳妥,经常变化。

    知晓君
  • 一枚程序员眼中的单元测试

    如今程序员群体赶上了中国最庞大的农民群体,大街上随便抓一把,十有八九是程序员,还一个刚从某国企离职报名参加软件培训班。我想码农的称号或许就是这么来的吧。

    袁慎建@ThoughtWorks
  • Android程序员年后跳槽,你准备好了嘛?

    春节刚结束,估计大多数人又开始蠢蠢欲动了,没办法每一年的三四月份都是互联网人换工作的高峰期,这个时间段也被称为招聘领域的黄金岁月、招聘旺季,素来是金三银四,大部...

    Android技术干货分享
  • 程序员遇到 Bug 时的 30 个反应,你是哪一种?

    来源:techug.com http://www.techug.com/post/programmer-reaction-with-30-bugs.html 开...

    程序员宝库
  • 如何快速成长为一名技术专家?

    当你正困惑于技能方向的选择时,他已经掌握了高效的进阶方法;当你还在苦恼于 Bug 的调试与修复时,他已经在独当一面,处理更为复杂的项目了;当你还在思考自己的技术...

    用户1269200
  • 图解全宇宙最神秘团体——“程序员”的日常,是辛苦还是闷骚?

    大家都知道,IT行业嘛,整天整天就是泡在电脑前,尤其是程序员们——“不是在写代码,就是在去写代码的路上”。很多程序员都以写代码为乐,当爱好和工作结合在一起的时候...

    企鹅号小编
  • 企业为什么需要雇佣一名老程序员

    本文从经验、判断力、知识面的广度和深度等几个方面阐述了为什么需要雇佣一名老程序员的原因。 ? 经验 老程序员可能无法像25岁时那样,在脑子里保存那么多的代码,但...

    码神联盟
  • 程序员遇到Bug时的30个反应

    开发应用程序是一个非常有压力的工作。没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象。面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会...

    哲洛不闹

扫码关注云+社区

领取腾讯云代金券