使用Featuretools自定义RollingSum原始特征时触发ValueError报错
自定义时间维度滚动求和特征实现报错排查
报错核心触发逻辑
- 自定义
RollingSumOnDatetime类没有严格匹配Featuretools对TransformPrimitive的元数据要求,没有声明需要读取实体全量数据的权限,运行时被框架做了局部切片,滚动计算拿到的数据不全,最终返回嵌套序列 - 错把基于时间索引的滚动primitive配置到
groupby_trans_primitives参数中:分组转换primitive要求返回值严格匹配每个分组的长度,而时间滚动计算需要依赖实体全量的时序数据,两者运行机制完全冲突,直接导致数组赋值时维度不匹配 - 内部滚动计算逻辑没有提前对传入的时间列做排序、索引对齐,拼接生成的计算表索引错位,pandas滚动计算输出的结果长度和原始输入列无法对应,直接被底层的numpy数组校验逻辑拦截
- 初始化时配置的时间列参数没有和对应实体的主键索引做关联校验,函数拿到的时间序列根本未对齐实体主键
可落地的修正方案
- 重写自定义Primitive的元数据配置:
- 显式定义原始名称,配置输入类型为
[Numeric, Datetime]、输出类型为Numeric - 开启
use_full_entity = True标记,告知框架该计算需要读取对应实体的全量时序数据,不可做局部切片
- 显式定义原始名称,配置输入类型为
- 优化内部滚动求和计算逻辑:
- 将数值列、时间列拼接为计算DataFrame后,先按时间列做升序排序、重置索引,再执行对应窗口(如
5D)的滚动求和 - 计算完成后按照原始输入数据的索引顺序重排结果,确保返回的一维数组长度和输入列完全一致
- 将数值列、时间列拼接为计算DataFrame后,先按时间列做升序排序、重置索引,再执行对应窗口(如
- 调整
dfs接口的参数配置:- 将实例化好的
RollingSumOnDatetime(ws="5D", on="datetime")从groupby_trans_primitives参数移至trans_primitives列表,配合实体关系中预设的时间索引关联逻辑运行 - 保留原有运行配置:目标实体为
contracts、开启多进程、max_depth=2
- 将实例化好的
报错本质说明
该
ValueError: setting an array element with a sequence本质是numpy数组维度校验失败:框架在接收primitive计算结果时,会将返回值强制转为定长一维数组,当计算结果存在嵌套序列、长度和输入维度不匹配时,就会直接触发该报错。
内容的提问来源于stack exchange,提问作者Avinash Barnwal
相关产品推荐
相关产品推荐

