Featuretools高级教程:自定义特征原语的进阶用法

Featuretools高级教程:自定义特征原语的进阶用法

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

关键点说明:

  1. __init__方法接收参数string,用于指定要统计的字符串
  2. get_function返回一个函数,该函数执行实际的统计计算
  3. 输入类型设置为自然语言文本(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

关键点说明:

  1. number_output_features设置为2,表示输出两个特征
  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]"

关键点说明:

  1. 除了实现get_function,还需要重写generate_names方法
  2. generate_names返回一个包含自定义名称的元组

3.3 使用示例

使用该原语后,生成的特征会有明确的命名:

feature_matrix.head()[
    [
        "HOURLY_SINE_AND_COSINE(datetime)[sine]",
        "HOURLY_SINE_AND_COSINE(datetime)[cosine]",
    ]
]

四、最佳实践建议

  1. 参数验证:在__init__方法中对参数进行验证,确保参数合法
  2. 性能优化:对于文本处理等计算密集型操作,考虑使用向量化实现
  3. 文档完善:为自定义原语编写清晰的docstring,说明其功能和参数
  4. 类型标注:准确设置输入输出类型,确保与Featuretools类型系统兼容
  5. 错误处理:在计算函数中添加适当的错误处理逻辑

结语

通过掌握自定义原语的高级用法,我们可以大幅扩展Featuretools的能力边界,使其更好地适应各种复杂的业务场景。无论是带参数的原语、多输出原语,还是自定义命名的原语,都能帮助我们构建更加强大和灵活的特征工程流程。希望本文的内容能够帮助读者在实际项目中更好地利用Featuretools的强大功能。

featuretools featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓬玮剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值