1.featuretools通过自动化特征生成提升python特征工程效率,其核心步骤包括:构建entityset定义数据关系;使用dfs算法自动生成特征。2.示例代码展示了如何从customers和transactions表创建entityset,添加数据与时间索引,并定义客户与交易的关系。3.执行dfs时指定聚合与转换算子,生成客户特征矩阵,max_depth控制特征复杂度。4.加入products表可扩展entityset,实现跨多表自动特征提取,如客户购买产品的平均价格等。5.面对大规模数据,可通过限制max_depth、选择性使用算子、自定义primitives及设置cutoff_time优化性能。6.生成的大量特征需后续进行特征选择与后处理以提高模型效果。
在Python中进行特征工程,尤其是在处理复杂关系数据时,Featuretools是一个非常强大的工具,它通过自动化特征生成过程,极大地提升了效率和模型性能。它能将散落在不同表格中的信息,巧妙地聚合、转化,最终形成模型可以直接使用的特征矩阵,这大大减轻了数据科学家手动构建特征的负担。
使用Featuretools进行特征工程的核心步骤,首先是构建一个EntitySet来描述数据中的实体(表)及其之间的关系。接着,利用Deep Feature Synthesis (DFS)算法自动生成大量潜在特征。
假设我们有两张表:customers(客户信息)和transactions(交易记录),每个客户有多笔交易。
立即学习“Python免费学习笔记(深入)”;
import featuretools as ft import pandas as pd # 模拟数据 customers_df = pd.DataFrame({ 'customer_id': [1, 2, 3], 'age': [30, 45, 22], 'gender': ['M', 'F', 'M'] }) transactions_df = pd.DataFrame({ 'transaction_id': [101, 102, 103, 104, 105], 'customer_id': [1, 1, 2, 3, 2], 'amount': [10.5, 20.0, 5.0, 15.0, 8.0], 'transaction_time': pd.to_datetime(['2023-01-01', '2023-01-05', '2023-01-02', '2023-01-03', '2023-01-06']) }) # 1. 创建EntitySet es = ft.EntitySet(id="customer_transactions") # 2. 添加实体(表)到EntitySet # index参数指定主键 es = es.add_dataframe(dataframe_name="customers", dataframe=customers_df, index="customer_id") es = es.add_dataframe(dataframe_name="transactions", dataframe=transactions_df, index="transaction_id", time_index="transaction_time") # 针对时间序列数据,指定time_index # 3. 定义实体之间的关系 # relationship(parent_dataframe_name, parent_dataframe_index, child_dataframe_name, child_dataframe_foreign_key) # 这里表示transactions表通过customer_id与customers表关联 es = es.add_relationship(parent_dataframe_name="customers", parent_column_name="customer_id", child_dataframe_name="transactions", child_column_name="customer_id") # 4. 执行Deep Feature Synthesis (DFS) # target_dataframe_name 指定我们希望为哪个实体生成特征 # agg_primitives: 聚合特征,如SUM, MEAN, COUNT等 # trans_primitives: 转换特征,如DAY, MONTH, SINE等 features, feature_defs = ft.dfs(entityset=es, target_dataframe_name="customers", agg_primitives=["sum", "mean", "count", "max", "min"], trans_primitives=["day", "month", "weekday"], max_depth=2) # max_depth控制特征的复杂程度 print(features.head())
这段代码展示了如何从原始数据到生成特征矩阵的全过程。max_depth参数控制了特征的“深度”,比如max_depth=2意味着可以从客户的交易中聚合出特征,然后这些聚合特征还可以再进行转换。
我第一次接触Featuretools时,那种感觉就像是发现了一个宝藏。它最吸引我的地方,就是它对“数据关系”的深刻理解和自动化。传统特征工程,我们往往需要手动去思考不同表之间怎么连接、怎么聚合、怎么转换,这不仅耗时,而且非常依赖领域知识和经验。Featuretools则把这个过程抽象成一个叫做EntitySet的东西。
EntitySet就好比一个数据库的Schema,它不仅仅存储了各个数据表(在Featuretools里叫dataframe或entity),更重要的是,它明确定义了这些表之间的主外键关系。有了这些关系,Featuretools的Deep Feature Synthesis (DFS)算法就能像一个不知疲倦的侦探一样,沿着这些关系链条,自动探索并生成各种有意义的特征。它会尝试各种聚合(比如一个客户的总交易额、平均交易额),也会尝试各种转换(比如交易日期是周几、月份),甚至会将聚合后的特征再进行转换,形成更复杂的特征。这种层层递进、由浅入深的特征生成方式,正是“Deep”的含义。它模仿了人类专家在分析数据时,从基本事实出发,逐步构建复杂概念的思维过程。这玩意儿,真有点意思。
上面已经给出了一个基本的代码示例,但我想再强调一些实践中的细节。在使用Featuretools时,最容易让人一头雾水的地方,可能是如何正确地定义EntitySet以及其中的relationship。如果你有多个表,而且它们之间存在复杂的层级关系(比如客户-订单-订单详情),那么你需要确保所有的主键和外键都正确地被识别和关联。
举个例子,如果我们的transactions表还有个product_id,并且我们有个products表:
# 模拟产品数据 products_df = pd.DataFrame({ 'product_id': [1001, 1002, 1003], 'category': ['Electronics', 'Books', 'Food'], 'price_per_unit': [500, 20, 5] }) # 再次创建EntitySet,加入products表 es_complex = ft.EntitySet(id="customer_transactions_products") es_complex = es_complex.add_dataframe(dataframe_name="customers", dataframe=customers_df, index="customer_id") es_complex = es_complex.add_dataframe(dataframe_name="transactions", dataframe=transactions_df, index="transaction_id", time_index="transaction_time") es_complex = es_complex.add_dataframe(dataframe_name="products", dataframe=products_df, index="product_id") # 添加客户与交易的关系 es_complex = es_complex.add_relationship(parent_dataframe_name="customers", parent_column_name="customer_id", child_dataframe_name="transactions", child_column_name="customer_id") # 添加交易与产品的关系 es_complex = es_complex.add_relationship(parent_dataframe_name="products", parent_column_name="product_id", child_dataframe_name="transactions", child_column_name="product_id") # 假设transactions表有product_id列 # 现在可以为customers生成特征,这些特征会包含产品信息 # 比如:客户购买的平均产品价格,客户购买过的产品类别数量等 features_complex, feature_defs_complex = ft.dfs(entityset=es_complex, target_dataframe_name="customers", agg_primitives=["sum", "mean", "count"], trans_primitives=[], max_depth=3) # 深度可以更深,以探索更复杂的特征 print(features_complex.head())
通过这样的方式,Featuretools能够自动从customers -> transactions -> products的路径上,为每个客户聚合出与产品相关的特征。这在传统方法下,需要多次的merge和groupby操作,而且容易出错。
尽管Featuretools功能强大,但在处理大规模或极端复杂的数据时,它也面临一些挑战,需要我们进行优化和考量。
首先是计算性能。当你的EntitySet包含数十亿行数据,或者关系深度非常大时,dfs的计算时间可能会非常长。这时,我们可以考虑以下策略:
其次是特征爆炸与特征选择。Featuretools的“自动化”在某种程度上也意味着“无差别生成”,它可能会生成成千上万个特征,其中大部分可能是高度相关、冗余或根本无用的。这会导致模型训练时间增加、过拟合风险上升。
最后,Featuretools生成的特征虽然多,但并非所有都是“完美”的。有些特征可能需要进一步的后处理,比如缺失值填充、异常值处理、特征缩放等。Featuretools更多的是一个特征“生成器”,而不是一个“完美特征”输出器。它为你提供了一个强大的起点,但后续的数据清洗和预处理工作依然不可或缺。理解这些,能帮助你更高效、更负责任地使用Featuretools。
以上就是Python中如何进行特征工程?Featuretools的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号