Featuretools 原语 (Primitives) 详解
原语(Primitives)是Featuretools中用于特征工程的基本操作单元,分为聚合原语(Aggregation Primitives)和转换原语(Transformation Primitives)两大类。
1. 聚合原语 (Aggregation Primitives)
聚合原语用于对相关实体的数据进行聚合操作,通常用于一对多关系中"多"的一方聚合到"一"的一方。
常见聚合原语及示例:
count
- 作用:计算记录数量
- 示例:计算每个客户有多少笔交易
- 结果:客户A有5笔交易,客户B有3笔交易
sum
- 作用:计算数值列的总和
- 示例:计算每个客户的交易总金额
- 结果:客户A总交易额1000元,客户B总交易额650元
mean
- 作用:计算数值列的平均值
- 示例:计算每个客户的平均交易金额
- 结果:客户A平均交易额200元,客户B平均交易额216.67元
std
- 作用:计算数值列的标准差
- 示例:计算每个客户交易金额的标准差
- 结果:衡量客户交易金额的波动性
min / max
- 作用:计算数值列的最小值/最大值
- 示例:每个客户的单笔最高/最低交易金额
median
- 作用:计算数值列的中位数
- 示例:每个客户交易金额的中位数
mode
- 作用:计算出现频率最高的值
- 示例:客户最常购买的商品类别
trend
- 作用:计算数值随时间的趋势
- 示例:客户交易金额随时间的增长趋势
skew
- 作用:计算分布的偏度
- 示例:客户交易金额分布的偏斜程度
2. 转换原语 (Transformation Primitives)
转换原语用于对单个实体中的数据进行转换操作,生成新的特征列。
常见转换原语及示例:
month / year / week / weekday
- 作用:从日期中提取时间组件
-
示例:
# 原始数据: join_date = "2022-01-15" # month(join_date) = 1 # year(join_date) = 2022 # weekday(join_date) = 5 (周六)
hour / minute / second
- 作用:从时间戳中提取时分秒
- 示例:分析用户在一天中的活跃时段
time_since_previous
- 作用:计算与前一条记录的时间间隔
- 示例:客户两次交易之间的时间间隔
cum_sum / cum_mean / cum_max
- 作用:计算累积统计值
-
示例:
# 交易金额: [100, 50, 200, 75] # cum_sum(amount) = [100, 150, 350, 425]
diff
- 作用:计算与前一条记录的差值
- 示例:客户每次交易金额的变化
divide_by / multiply / add / subtract
- 作用:数值运算
- 示例:计算两个特征的比例关系
equal / greater_than / less_than
- 作用:逻辑比较
- 示例:判断交易金额是否超过阈值
is_null / not_null
- 作用:空值判断
- 示例:标识缺失数据
num_characters / num_words
- 作用:文本统计
- 示例:计算客户评论的字符数或单词数
latitude / longitude
- 作用:地理位置解析
- 示例:从地址中提取经纬度信息
3. 实际应用示例
结合您的代码示例,我们来看具体的原语应用:
# 聚合原语
agg_primitives=["sum", "mean", "count", "std"]
# 转换原语
trans_primitives=["month", "weekday"]
具体生成的特征:
-
聚合特征:
-
SUM(transactions.amount): 每个客户的交易总额 -
MEAN(transactions.amount): 每个客户的平均交易金额 -
COUNT(transactions.amount): 每个客户的交易次数 -
STD(transactions.amount): 每个客户交易金额的标准差
-
-
转换特征:
-
MONTH(join_date): 客户加入的月份 -
WEEKDAY(join_date): 客户加入的是星期几
-
4. 自定义原语
Featuretools还支持创建自定义原语来满足特定需求:
from featuretools.primitives import AggregationPrimitive
from featuretools.variable_types import Numeric
class NUnique(AggregationPrimitive):
name = "n_unique"
input_types = [Numeric]
return_type = Numeric
stack_on_self = False
default_value = 0
def get_function(self):
return 'nunique'
5. 原语的选择策略
选择合适的原语需要考虑:
- 业务需求:根据业务场景选择相关原语
- 数据类型:数值型、分类型、时间型数据适用不同原语
- 计算复杂度:复杂原语可能影响性能
- 特征有效性:某些原语可能生成无意义的特征
通过合理选择和组合这些原语,Featuretools能够自动生成大量有意义的特征,为机器学习模型提供更丰富的信息。