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

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

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


import featuretools as ft


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


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


640.png


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


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


640.png

特征构建算子在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中的数据集本身都是比较好的数据集,即默认情况下就能取得不错的效果,另外这里的测试结果也具有随机性。


640.png



目录
相关文章
|
5月前
|
JSON 数据可视化 数据挖掘
Ruby 数据处理与分析竟如此强大!不看后悔一辈子,快来开启数据探索之旅!
【8月更文挑战第31天】在数据驱动时代,高效处理与分析数据至关重要。作为灵活强大的编程语言,Ruby 提供了丰富的工具和方法,涵盖数据读取、清洗、分析及可视化等多个环节。借助 CSV 和 JSON 库,可轻松处理常见文件格式;利用正则表达式清洗数据;通过 NMatrix 和 Statsample 库完成复杂的数据分析任务;使用 Gruff 库将分析结果可视化。同时,合理优化代码性能,如采用高效的数据结构和算法,能进一步提升数据处理效率。遵循这些最佳实践,Ruby 将成为你数据处理与分析的强大助手。
80 0
|
人工智能 运维 算法
和想要通过学习 Python 转行的同学聊一聊
来编程教室的求职者大概都想知道:学Python到底适不适合转行?这个问题也不好回答,因为转行成功的案例绝对不少,但是我从没见过有哪个程序员只会一种语言。Python的优点是,它很适合入门。
|
数据采集 IDE 小程序
【我问Crossin】Python 入门之后难以提高,该如何解决?
报错 EOL 大多都是因为代码中的引号没有成对。或者其中有引号被转义,导致没起到引号的作用。
|
XML 前端开发 JavaScript
没有一个顺手的流程绘制工具?好吧,自己动手,丰衣足食
没有一个顺手的流程绘制工具?好吧,自己动手,丰衣足食
|
传感器
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
|
机器学习/深度学习 算法 数据可视化
Python 用一行代码搞事情,机器学习通吃
Python 用一行代码搞事情,机器学习通吃
Python 用一行代码搞事情,机器学习通吃
|
机器学习/深度学习 自然语言处理 数据可视化
整理了3个用于数据科学的Python库,稍微简单的讲解下
改变不了环境,但可以改变自己;你改变不了事实,但可以改变态度;你改变不了过去,但可以改变现在。
整理了3个用于数据科学的Python库,稍微简单的讲解下
|
编解码 算法 PyTorch
解决方案:炼丹师养成计划 Pytorch+DeepLearning遇见的各种报错与踩坑避坑记录(二)
解决方案:炼丹师养成计划 Pytorch+DeepLearning遇见的各种报错与踩坑避坑记录(二)
解决方案:炼丹师养成计划 Pytorch+DeepLearning遇见的各种报错与踩坑避坑记录(二)
|
存储 Python
别人都在庆祝建军节我却忘记了,为了弥补我用Python教大家打军体拳吧!
想想今天不知道该写点什么,不如我们就来做一套军体拳动画,大家觉得如何!
286 0

热门文章

最新文章