多次运行FeatureTools生成复杂特征时遇ValueError的解决方法
问题解决:FeatureTools多层级特征生成报错处理
报错原因
第一次运行ft.dfs()后返回的feature_matrix是Woodwork DataFrame(FeatureTools内置的增强型DataFrame),第二次循环中将其添加到EntitySet时,该Woodwork DataFrame未设置名称,触发ValueError: Cannot add a Woodwork DataFrame to EntitySet without a name错误。
修复方案
有两种简单的修复方式,任选其一即可:
方案1:将Woodwork DataFrame转换为普通Pandas DataFrame
每次生成特征后,把结果转回普通DataFrame,避免Woodwork的属性冲突。修改循环内的代码:
feature_matrix, feature_defs = ft.dfs(entityset = es, target_dataframe_name = dataframe_name, trans_primitives = trans_primitives) # 添加这一行,转换为普通Pandas DataFrame feature_matrix = feature_matrix.reset_index(drop=True).astype('float64')
(reset_index是为了避免索引名称重复,astype确保数据类型统一)
方案2:添加Woodwork DataFrame时指定名称
在add_dataframe时,通过woodwork参数显式设置Woodwork DataFrame的名称,匹配当前的dataframe_name:
es = es.add_dataframe( dataframe_name=dataframe_name, dataframe=feature_matrix, index="index" + str(i), # 添加这一行,指定Woodwork DataFrame的名称 woodwork={"name": dataframe_name} )
完整修复后的代码示例
以方案1为例,修改后的完整函数:
import featuretools as ft def multi_level_feature_creation(X, trans_primitives_per_level): feature_matrix = X for i, trans_primitives in enumerate(trans_primitives_per_level): print("Level: ", i) print("Columns: ", feature_matrix.columns) es = ft.EntitySet(id = 'dataset') dataframe_name = "data" + str(i) es = es.add_dataframe( dataframe_name=dataframe_name, dataframe=feature_matrix, index="index" + str(i) ) feature_matrix, feature_defs = ft.dfs( entityset=es, target_dataframe_name=dataframe_name, trans_primitives=trans_primitives ) # 转换为普通Pandas DataFrame,避免Woodwork属性冲突 feature_matrix = feature_matrix.reset_index(drop=True).astype('float64') return feature_matrix, feature_defs # 后续调用代码不变 X = df.drop(["target"], axis=1) y = df["target"] features_per_level = [ ['add_numeric', 'multiply_numeric', 'subtract_numeric', 'divide_numeric', 'multiply_numeric_scalar'], ['add_numeric', 'multiply_numeric', 'subtract_numeric', 'divide_numeric', 'multiply_numeric_scalar'] ] feature_matrix, feature_defs = multi_level_feature_creation(X, features_per_level) print(type(feature_matrix)) feature_matrix.head()
验证效果
修改后运行多层级特征生成,即可正常生成(a-b)/c、(a-b)/a这类复合运算特征,不会再触发名称相关的错误。
内容的提问来源于stack exchange,提问作者Hyphen
相关产品推荐
相关产品推荐

