Featuretools高级教程:自定义特征原语的进阶用法
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
前言
在自动化特征工程领域,Featuretools作为一款强大的工具,其核心能力之一就是通过特征原语(Primitives)来自动生成特征。虽然Featuretools内置了大量常用原语,但在实际业务场景中,我们经常需要根据特定需求创建自定义原语。本文将深入探讨Featuretools中自定义原语的高级用法,帮助读者掌握更灵活的特征工程技巧。
一、带参数的自定义原语
1.1 应用场景
在实际项目中,我们经常需要对文本数据进行特定模式的统计。例如,统计评论中出现特定关键词的次数。这种需求可以通过带参数的自定义原语来实现。
1.2 实现示例:字符串计数原语
下面我们创建一个StringCount
原语,用于统计文本中特定字符串出现的次数:
class StringCount(TransformPrimitive):
"""统计文本中特定字符串出现的次数"""
name = "string_count"
input_types = [ColumnSchema(logical_type=NaturalLanguage)]
return_type = ColumnSchema(semantic_tags={"numeric"})
def __init__(self, string=None):
self.string = string
def get_function(self):
def string_count(column):
assert self.string is not None, "需要指定要统计的字符串"
counts = [text.lower().count(self.string) for text in column]
return counts
return string_count
关键点说明:
__init__
方法接收参数string
,用于指定要统计的字符串get_function
返回一个函数,该函数执行实际的统计计算- 输入类型设置为自然语言文本(
NaturalLanguage
),输出类型标记为数值型
1.3 使用示例
创建实体集后,我们可以这样使用该原语:
feature_matrix, features = ft.dfs(
entityset=es,
target_dataframe_name="sessions",
trans_primitives=[StringCount(string="the")],
)
生成的特性名称会自动包含参数信息,如STRING_COUNT(comments, string=the)
。
二、多输出特征原语
2.1 应用场景
有时一个计算过程可以同时产生多个相关特征。例如,统计文本中大写字母和小写字母的数量。这种情况下,我们可以创建多输出的原语,一次性生成多个特征。
2.2 实现示例:大小写计数原语
class CaseCount(TransformPrimitive):
"""统计文本中大写和小写字母的数量"""
name = "case_count"
input_types = [ColumnSchema(logical_type=NaturalLanguage)]
return_type = ColumnSchema(semantic_tags={"numeric"})
number_output_features = 2 # 指定输出两个特征
def get_function(self):
def case_count(array):
upper = np.array([len(re.findall("[A-Z]", i)) for i in array])
lower = np.array([len(re.findall("[a-z]", i)) for i in array])
return upper, lower
return case_count
关键点说明:
number_output_features
设置为2,表示输出两个特征get_function
返回的函数需要返回一个元组,包含两个计算结果
2.3 使用示例
使用该原语后,生成的特征会默认以索引区分:
feature_matrix[
[
"customers.CASE_COUNT(favorite_quote)[0]", # 大写字母数
"customers.CASE_COUNT(favorite_quote)[1]", # 小写字母数
]
]
三、自定义多输出特征的命名
3.1 应用场景
当原语输出多个特征时,默认的索引命名方式不够直观。我们可以通过重写generate_names
方法来实现更友好的命名。
3.2 实现示例:小时的正弦余弦变换
class HourlySineAndCosine(TransformPrimitive):
"""计算时间字段的小时值的正弦和余弦"""
name = "hourly_sine_and_cosine"
input_types = [ColumnSchema(logical_type=Datetime, semantic_tags={"time_index"})]
return_type = ColumnSchema(semantic_tags={"numeric"})
number_output_features = 2
def get_function(self):
def hourly_sine_and_cosine(column):
sine = np.sin(column.dt.hour)
cosine = np.cos(column.dt.hour)
return sine, cosine
return hourly_sine_and_cosine
def generate_names(self, base_feature_names):
name = self.generate_name(base_feature_names)
return f"{name}[sine]", f"{name}[cosine]"
关键点说明:
- 除了实现
get_function
,还需要重写generate_names
方法 generate_names
返回一个包含自定义名称的元组
3.3 使用示例
使用该原语后,生成的特征会有明确的命名:
feature_matrix.head()[
[
"HOURLY_SINE_AND_COSINE(datetime)[sine]",
"HOURLY_SINE_AND_COSINE(datetime)[cosine]",
]
]
四、最佳实践建议
- 参数验证:在
__init__
方法中对参数进行验证,确保参数合法 - 性能优化:对于文本处理等计算密集型操作,考虑使用向量化实现
- 文档完善:为自定义原语编写清晰的docstring,说明其功能和参数
- 类型标注:准确设置输入输出类型,确保与Featuretools类型系统兼容
- 错误处理:在计算函数中添加适当的错误处理逻辑
结语
通过掌握自定义原语的高级用法,我们可以大幅扩展Featuretools的能力边界,使其更好地适应各种复杂的业务场景。无论是带参数的原语、多输出原语,还是自定义命名的原语,都能帮助我们构建更加强大和灵活的特征工程流程。希望本文的内容能够帮助读者在实际项目中更好地利用Featuretools的强大功能。
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考