ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Featuretools 运行边界与应对方案:内存内计算约束与自带标签(Cutoff Time)机制

Featuretools 运行边界与应对方案:内存内计算约束与自带标签(Cutoff Time)机制 特征工程机器学习数据科学【免费下载链接】featuretoolsAn open source python library for automated feature engineering项目地址https://gitcode.com/gh_mirrors/fe/featuretools点击查看免费下载导读本文基于官方使用技巧文档 docs/source/resources/usage_tips/limitations.rst系统梳理 Featuretools 的两个核心设计边界——面向单机内存的数据集与标签Labels和切割时间Cutoff Time必须由用户自行提供。读完本文你将理解这两个边界背后的实现原理掌握chunk_size、n_jobs、dask_kwargs、approximate、include_cutoff_time等参数的正确用法并能在数据超出内存或需要监督学习时参照 性能优化指南 与 时间处理指南 设计出可落地的工程方案。一、两个边界是什么官方文档的原始表述在开始使用 Featuretools 之前官方文档明确列出了两条使用边界它们决定了该库适用的数据规模与任务形态In-memory内存内运行Featuretools 面向能够在单台机器内存中装下的数据集而设计。若数据集超出内存容量官方给出的指引是参考 Improving Computational Performance 指南 来改进计算性能。Bring your own labels自带标签如果做的是监督学习你必须自行提供标签labels和切割时间cutoff times。官方建议借助 Compose——一个用于自动生成带切割时间的标签的开源项目——来规范化这一过程。这两条边界不是缺陷而是 Featuretools 的架构定位它只负责自动化特征工程这一环标签工程与超大数据规模的分布式处理需要用户结合自身场景补齐。下面分别展开这两条边界的技术细节与应对手段。二、边界一In-memory——单机内存上的自动化特征工程2.1 为什么是内存内运行Featuretools 的特征计算建立在 pandas DataFrame 与 Woodwork 类型系统之上整个EntitySet实体集在计算开始前会被整体加载到内存中所有聚合、转换原语primitives都基于内存中的列式数据执行。从 dfs.py 的入口实现 可以看到当未传入已初始化的EntitySet时dfs会直接用传入的dataframes构造EntitySet(dfs, dataframes, relationships)随后所有特征计算都围绕这一内存对象展开。因此数据能装进内存是该库的前置假设。在决定使用 Featuretools 之前应先评估数据表总数与单表行数每列的 dtype 与内存占用并行计算时额外的内存放大效应见 2.3 节。2.2 减少唯一切割时间的数量第一优先级优化性能优化指南 首先强调特征矩阵中的每一行都是在某个特定切割时间cutoff time上计算的它代表该行特征计算所能使用的、来自 EntitySet 任意数据表的最后时间点。因此每出现一个不同的时间值计算引擎都要付出查找该时间点允许的数据子集的开销——唯一切割时间越多时间过滤的开销越大。两条应对路径人工裁剪分析预测任务判断哪些唯一时间点是真正必需的手动减少。自动近似使用approximate参数将切割时间舍入到更早的时间点。更早的切割时间对预测建模永远是合法的只是少用了部分数据以极小的信息损失换取明显的计算加速。示例见 时间处理指南中的 Approximating Features by Rounding Cutoff Times 一节import featuretools as ft # 以 1 天为桶大小对可近似的特征按天聚合计算 feature_matrix, features ft.dfs( entitysetes, target_dataframe_nametransactions, cutoff_timect_transactions, approximate1 day, )在该计算中可近似的特征按 1 天间隔计算而不可近似的特征如这笔交易发生在哪里仍会在精确的切割时间上计算。从 dfs.py 的参数定义 可以看到approximate接受Timedelta类型用于为高成本计算的特征按桶分组实例例如桶大小为 24 小时时同日切割时间的实例共享同一次计算。2.3 并行计算性能与内存的权衡Featuretools 通过 Dask 的分布式调度器实现多进程并行。最简单的控制方式是n_jobs参数import featuretools as ft fm ft.calculate_feature_matrix( featuresfeatures, entitysetentityset, cutoff_timecutoff_time, n_jobs2, verboseTrue, )上述命令会启动 2 个进程并行计算特征矩阵的分块。每个进程都会获得一份独立的 EntitySet 副本因此内存占用与并行进程数近似成正比——这正是内存内运行边界在并行场景下的关键放大因素。同时将 EntitySet 复制到每个进程存在固定开销多次调用calculate_feature_matrix时应尽量复用集群见 2.4 节。2.3.1 调整 chunk_size 控制内存峰值默认情况下Featuretools 会把切割时间相同的行放在一起同时计算。chunk_size参数限制每次分组合并计算的最大行数并行计算时默认chunk_size为1 / n_jobs以保证计算能分摊到各 worker若唯一切割时间很少默认行为可能导致更高的峰值内存大量中间结果驻留内存或并行度受限分块数少于n_jobs。在ft.dfs或ft.calculate_feature_matrix中显式设置chunk_size既可以是具体行数也可以是总行数的百分比# 每个 chunk 最多 100 行 feature_matrix, features_list ft.dfs( entitysetes, target_dataframe_namecustomers, chunk_size100, ) # 每个 chunk 最多占总行数的 5% feature_matrix, features_list ft.dfs( entitysetes, target_dataframe_namecustomers, chunk_size0.05, )从 calculate_feature_matrix.py 的实现 可以看到chunk_size会先经_handle_chunk_size归一化处理再参与后续的分组与分块调度dfs.py 的参数说明 还指出chunk_size支持传入整数大于 0 的行数、0 到 1 之间的浮点数占总实例数的百分比或字符串cutoff time按切割时间拆分行。2.4 持久化集群避免反复传输 EntitySet仅指定n_jobs时Featuretools 会为这一次特征矩阵计算临时创建一个集群计算结束后销毁。每次新计算都必须把 EntitySet 重新传给 worker。要复用同一集群需先自行创建集群并用dask_kwargs告知 Featuretoolsimport featuretools as ft from dask.distributed import LocalCluster cluster LocalCluster() fm_1 ft.calculate_feature_matrix( featuresfeatures_1, entitysetentityset, cutoff_timecutoff_time, dask_kwargs{cluster: cluster}, verboseTrue, )dask_kwargs中的cluster值既可以是集群对象本身也可以是调度器的地址字符串第二次计算可直接复用已缓存在集群上的 EntitySet 数据fm_2 ft.calculate_feature_matrix( featuresfeatures_2, entitysetentityset, cutoff_timecutoff_time, dask_kwargs{cluster: cluster.scheduler.address}, verboseTrue, )一个需要警惕的坑官方文档明确提示使用持久化集群时Featuretools 会在第一次计算时把 EntitySet 发布到集群后续会依据 EntitySet 的元数据判断是否复用。这意味着如果两个 EntitySet 元数据相同但行数据不同例如新增了数据Featuretools 不会重新复制第二个 EntitySet。最简单的规避方式是为每个 EntitySet 使用唯一的 id。此外Dask 的诊断面板可用于分析 worker 状态、任务耗时与内存使用。使用n_jobs创建的集群默认不开启 Web 界面需要在dask_kwargs中显式指定端口fm ft.calculate_feature_matrix( featuresfeatures, entitysetentityset, cutoff_timecutoff_time, n_jobs2, dask_kwargs{diagnostics_port: 8787}, verboseTrue, )从 dfs.py 的 dask_kwargs 说明 可以看到dask_kwargs接受cluster集群对象或调度器地址与diagnostics_portWeb 诊断面板端口等参数同时LocalCluster的合法关键字参数也一并接受并且即使不设置n_jobs只要传入了dask_kwargs也会启用多进程。注意诊断面板需要额外安装 bokeh 包才能工作。2.5 数据分区并行超出单机内存时的替代方案当 pandasEntitySet过大、而当前并行实现会把整个 EntitySet 发送给每个 worker 导致 worker 内存耗尽时可以换一种思路先分区数据再用 Dask 或 Apache SparkPySpark在多个核心或多台机器上并行计算。关键前提是计算某一批实例的特征时不需要用到全部数据。例如为顾客计算同邮编其他顾客数量或同邮编其他顾客平均年龄这类特征时可以按邮编加载数据分区只要计算时该邮编的数据完整就能对一部分顾客完成全部特征计算。使用 Dask 可将分区计算从单机多核扩展到集群多机使用 Spark PySpark 可在 EC2 之类的集群实例上完成分布式特征工程。该方案在 性能优化指南的 Parallel Computation by Partitioning Data 一节 中有详细示例说明适合作为大 pandasEntitySet的兜底路径。三、边界二Bring Your Own Labels——标签与切割时间由用户提供3.1 为什么 Featuretools 不生成标签自动化特征工程解决的是从原始数据自动构造特征的问题并不包含自动标注。监督学习的目标变量标签依赖业务语义与历史结果只有使用者自己知道什么算正例、什么算负例、预测点在哪一刻。因此官方文档明确标签与切割时间必须由用户提供。为规范化这一过程官方生态中的 Compose 项目专门用于自动生成带切割时间的标签与 Featuretools 配合形成标签 → 特征 → 模型的流水线。3.2 切割时间cutoff_time的提供方式切割时间指某一行数据可以被用于特征计算的最后时间点任何晚于该时间点的数据都会在计算前被过滤掉。它的提供方式有两种方式一单个时间值——对所有实例统一使用同一个切割时间import pandas as pd import featuretools as ft feature_matrix, features ft.dfs( entitysetes, target_dataframe_namecustomers, cutoff_timepd.Timestamp(2014-1-1 04:00), cutoff_time_in_indexTrue, )方式二DataFrame——为特征矩阵的每一行指定各自的切割时间不同实例可以有不同的预测时点同一实例也可以重复出现于不同时点cutoff_times pd.DataFrame() cutoff_times[customer_id] [1, 2, 3, 1] cutoff_times[time] pd.to_datetime( [2014-1-1 04:00, 2014-1-2 05:00, 2014-1-2 06:00, 2014-1-2 08:00] ) cutoff_times[label] [True, True, False, True] # 额外列会透传到特征矩阵从 dfs.py 的参数定义 可以看到cutoff_time的完整约定实例 id 列必须命名为instance_id或与目标数据表的 index 列同名切割时间列必须命名为time或与目标数据表的 time_index 列同名列名必须无歧义同时存在instance_id列和与目标 index 同名的列会报错同理time列与目标 time_index 同名列并存也会报错除实例 id 与切割时间外DataFrame 中任何额外列都会被追加到结果特征矩阵——这正是把机器学习标签与特征矩阵保持对齐的官方推荐做法如上面的label列。3.3 围绕切割时间的三个关键控制参数结合 dfs.py 的源码切割时间的语义还受以下参数影响training_window训练窗口默认None时使用切割时间之前的全部数据传入Timedelta或字符串后只使用切割时间往前推窗口长度内的数据。注意pandas Timedelta 的月、年单位不是相对的相对单位应传 Featuretools Timedelta 或字符串。include_cutoff_time默认True表示计算时包含切割时间点上的数据设为False则排除切割时间点的数据。它同样影响训练窗口边界的取舍——设为True时窗口最老端点被排除、切割时间点被包含设为False时反之详见 时间处理指南 中的 Excluding data at cutoff times 一节ft.dfs( entitysetes, target_dataframe_namecustomers, cutoff_timecutoff_times, cutoff_time_in_indexTrue, include_cutoff_timeFalse, )cutoff_time_in_index为True时返回的特征矩阵以 (实例 id, 切割时间) 构成 MultiIndex并按 (时间, 实例 id) 排序。另外时间处理指南 还提供了ft.make_temporal_cutoffs工具函数从给定的切割时间集合与实例 id 生成一系列等间隔的切割时间适合需要按固定频率滚动构造预测样本如时序预测的场景。3.4 时间索引time index的正确设置是前提切割时间过滤依赖数据表上正确标注的time index——它被定义为某一行中的任何信息第一次可被使用的时刻。只有为 DataFrame 设置了正确的 time index 列Featuretools 才能在计算特征前自动忽略 time index 晚于切割时间的行。需要注意并非所有日期列都适合作为 time index例如顾客表中的join_date成为已知数据的时刻适合而birthday虽然可作为特征却不应作为 time index。这是自带切割时间机制能正确工作的前置条件详见 时间处理指南。四、把边界转化为最佳实践综合两条边界可以得出 Featuretools 的典型适用画像与落地建议规模评估先行数据量以单机内存可承载为基准若超出先尝试减少唯一切割时间approximate、调整chunk_size控制峰值内存再考虑n_jobs并行与持久化集群最后才是 Dask/Spark 数据分区方案。监督学习自备标签提前规划好标签表与切割时间表的结构列命名遵循instance_id/time约定并利用额外列透传机制让标签与特征矩阵天然对齐标签生成流程可交给 Compose 类工具规范化。时间语义是核心确保每张表正确设置 time index并理解training_window、include_cutoff_time对数据边界的影响避免未来数据泄漏。官方将这两条边界收敛在 limitations.rst 这一页并分别在 性能优化指南 与 时间处理指南 中给出完整解法本文已将这些解法与 dfs.py 和 calculate_feature_matrix.py 的源码实现对应起来供你在实际项目中按图索骥。赞分享特征工程机器学习数据科学【免费下载链接】featuretoolsAn open source python library for automated feature engineering项目地址https://gitcode.com/gh_mirrors/fe/featuretools点击查看免费下载相关推荐SwiftMessages动态高度计算内容自适应与约束配置SwiftMessages动态高度计算内容自适应与约束配置 在iOS应用开发中消息提示组件Message/Toast/Snackbar的动态高度计算一直移动开发Recast Navigation FAQ 深度解读C98 设计约束、坐标约定、内存分配与日志机制Recast Navigation FAQ 深度解读C98 设计约束、坐标约定、内存分配与日志机制 Recast Navigation 是游戏行业广泛使用游戏开发x64dbg 命令详解inc — 对变量、寄存器与内存目标执行自增运算x64dbg 命令详解inc — 对变量、寄存器与内存目标执行自增运算 inc 是 x64dbg 调试器命令行中的一条通用计算命令用于对指定目标的值执行 自逆向工程调试器开发工具应用安全上一篇Yii2 RESTful API 路由详解使用 yii\rest\UrlRule 构建 HTTP 动词路由下一篇终极指南如何快速安装和使用Arc主题美化你的Linux桌面创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表