复现Featuretools predict_next_purchase时遇ft.dfs递归深度超限错误
解决Featuretools ft.dfs触发的RuntimeError: maximum recursion depth exceeded问题
嘿,我碰到过好几次Featuretools里这个递归深度超出的问题,给你几个靠谱的排查和解决方向:
检查实体集是否存在循环关系引用
这是最常见的原因——如果你的实体集里定义了循环的实体关系(比如projects关联到orders,orders又关联回projects),dfs在遍历关系生成特征时会陷入无限递归。
你可以用这两个方法快速验证:# 打印所有实体关系,检查parent/child是否有闭环 print(es.relationships) # 可视化实体集(需要先安装graphviz:pip install graphviz) es.plot()如果发现循环关系,删掉其中一条不合理的关联即可。
限制特征生成的最大深度
Featuretools默认会生成所有层级的递归特征(比如多次跨实体聚合),如果你的实体关系链很长,很容易触发Python的递归限制。你可以在ft.dfs里显式设置max_depth参数来控制:feature_matrix, features = ft.dfs( target_entity='projects', cutoff_time=labels.reset_index().loc[:,['jobnumber','time']], training_window=inst_defn['training_window'], max_depth=2 # 根据你的业务场景调整,比如2或3,避免过深的递归 )临时调高Python的递归深度限制
Python默认的递归深度限制是1000,如果你的实体关系确实需要更深的递归,可以临时调高这个值,但注意不要调得过高(避免栈溢出风险):import sys # 调高到2000,根据实际情况调整 sys.setrecursionlimit(2000)👉 注意:这只是临时 workaround,优先解决循环关系或限制特征深度的问题,这才是根治的办法。
验证时间列的格式和匹配性
如果cutoff_time里的时间列和实体集中的时间列类型不匹配(比如一个是字符串,一个是datetime),或者关联逻辑有问题,也可能触发异常递归。你可以检查一下:# 检查cutoff_time的时间列类型 print(labels.reset_index()['time'].dtype) # 检查目标实体的时间列类型 print(es['projects'].df['your_time_column'].dtype) # 替换成你实体里的时间列名确保所有时间列都是
datetime64类型,没有格式错误。
内容的提问来源于stack exchange,提问作者Nick Bernini
相关产品推荐
相关产品推荐

