微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以仅针对测试数据计算特征矩阵?

如何解决是否可以仅针对测试数据计算特征矩阵?

我有超过 100,000 行带有时间戳的训练数据,我想为新的测试数据计算一个特征矩阵,其中只有 10 行。测试数据中的一些特征最终会聚合一些训练数据。我需要快速实现,因为这是实时推理管道中的一个步骤。

我可以想到两种实现方式:

  1. 连接训练和测试实体集并运行 DFS,然后仅使用最后 10 行并丢弃其余行。这是非常耗时的。有没有办法在使用整个实体集的数据的同时计算实体集的子集?

  2. 使用 Featuretools 部署页面Calculating Feature Matrix for New Data 部分中概述的步骤。但是,如下所示,这似乎不起作用。

创建所有/训练/测试实体集:

import featuretools as ft

data = ft.demo.load_mock_customer(n_customers=3,n_sessions=15)
    
df_sessions = data['sessions']
    
# Create all/train/test entity sets.
all_es = ft.EntitySet(id='sessions')
train_es = ft.EntitySet(id='sessions')
test_es = ft.EntitySet(id='sessions')
    
all_es = all_es.entity_from_dataframe(
    entity_id='sessions',dataframe=df_sessions,# all sessions
    index='session_id',time_index='session_start',)
    
train_es = train_es.entity_from_dataframe(
    entity_id='sessions',dataframe=df_sessions.iloc[:10],# first 10 sessions
    index='session_id',)
    
test_es = test_es.entity_from_dataframe(
    entity_id='sessions',dataframe=df_sessions.iloc[10:],# last 5 sessions
    index='session_id',)
    
# normalise customer entities so we can group by customers.
all_es = all_es.normalize_entity(base_entity_id='sessions',new_entity_id='customers',index='customer_id')

train_es = train_es.normalize_entity(base_entity_id='sessions',index='customer_id')

test_es = test_es.normalize_entity(base_entity_id='sessions',index='customer_id')

设置 cutoff_time,因为我们正在处理带有时间戳的数据:

cutoff_time = (df_sessions
               .filter(['session_id','session_start'])
               .rename(columns={'session_id': 'instance_id','session_start': 'time'}))

计算所有数据的特征矩阵:

feature_matrix,features_defs = ft.dfs(entityset=all_es,cutoff_time=cutoff_time,target_entity='sessions')
    
display(feature_matrix.filter(['customer_id','customers.COUNT(sessions)']))
session_id customer_id customers.COUNT(sessions)
1 3 1
2 3 2
3 1 1
4 2 1
5 2 2
6 2 3
7 2 4
8 1 2
9 2 5
10 1 3
11 1 4
12 2 6
13 3 3
14 1 5
15 3 4

计算训练数据的特征矩阵:

feature_matrix,features_defs = ft.dfs(entityset=train_es,cutoff_time=cutoff_time.iloc[:10],target_entity='sessions')
display(feature_matrix.filter(['customer_id','customers.COUNT(sessions)']))
session_id customer_id customers.COUNT(sessions)
1 3 1
2 3 2
3 1 1
4 2 1
5 2 2
6 2 3
7 2 4
8 1 2
9 2 5
10 1 3

计算测试数据的特征矩阵(使用 Featuretools 部署页面上“新数据的特征矩阵”中所示的方法):

feature_matrix = ft.calculate_feature_matrix(features=features_defs,entityset=test_es,cutoff_time=cutoff_time.iloc[10:])
display(feature_matrix.filter(['customer_id','customers.COUNT(sessions)']))
session_id customer_id customers.COUNT(sessions)
11 1 1
12 2 1
13 3 1
14 1 2
15 3 2

如您所见,从 train_es 生成的特征矩阵与从 all_es 生成的特征矩阵的前 10 行相匹配。但是,从 test_es 生成的特征矩阵与从 all_es 生成的特征矩阵中的相应行不匹配。

解决方法

您可以使用 cutoff_time 数据帧(或 DFS 中的 instance_ids 参数,如果截止时间是单个日期时间)控制要为其生成特征的实例。 Featuretools 只会为其 ID 在截止时间数据帧中的实例生成特征,而将忽略所有其他实例:

feature_matrix,features_defs = ft.dfs(entityset=all_es,cutoff_time=cutoff_time[10:],target_entity='sessions')
    
display(feature_matrix.filter(['customer_id','customers.COUNT(sessions)']))
customer_id customers.COUNT(sessions) session_id
1 4
2 6
3 3
1 5
3 4

“新数据的特征矩阵”中的方法在您想要计算相同特征但基于全新数据时非常有用。将创建所有相同的功能,但不会在实体集之间共享数据。这在这种情况下不起作用,因为目标是使用所有数据但只为某些实例生成特征。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?