深度特征综合和特征工具确实允许您将目标保留在实体集中(以便使用其历史值创建新特征),但您需要设置“时间索引”并使用“截止时间”来执行此操作无标签泄漏。
您可以使用时间索引来指定保存每行中的数据已知时间的值的列。该列使用指定time_index
使用创建实体时的关键字参数entity_from_dataframe
.
然后,您在跑步时使用截止时间ft.dfs()
or ft.calculate_feature_matrix()
要指定最后一个时间点,您应该在计算特征矩阵的每一行时使用数据。特征计算将仅使用截止时间(包括截止时间)之前的数据。因此,如果这个截止时间早于目标的时间索引值,则不会出现标签泄漏。
您可以在以下文档中详细了解这些概念处理时间 https://featuretools.alteryx.com/en/stable/getting_started/handling_time.html.
如果你根本不想与目标打交道,你可以
-
您可以使用 pandas 将其完全从数据框中删除,然后再将其设为实体。如果它不在实体集中,则不能用于创建特征。
-
您可以设置drop_contains
中的关键字参数ft.dfs
to ['target']
。这会阻止创建任何包含字符串的功能'target'
.
无论您选择上述哪个选项,仍然可以直接通过 DFS 传递目标列。如果将目标添加到截止时间数据帧,它将传递到生成的特征矩阵。这可能很有用,因为它可以确保目标列与其他功能保持对齐。您可以通过传递标签的示例here https://docs.featuretools.com/automated_feature_engineering/handling_time.html?highlight=label#running-dfs-with-cutoff-times在文档中。
使用辅助时间索引的高级解决方案
有时,单个时间索引不足以表示连续信息在两个不同时间已知的数据集。当目标是列时,通常会发生这种情况。为了处理这种情况,我们需要使用“辅助时间索引”。
Here https://www.kaggle.com/sjrothsc/using-featuretools-for-missed-appointments是来自 Kaggle 内核的一个示例,用于预测患者何时会错过与医生的预约,其中使用了辅助时间索引。数据集有一个scheduled_time
,当预约被安排时,并且appointment_day
,这是约会实际发生的时间。我们想告诉Featuretools,在安排预约时,一些信息(例如患者的年龄)是已知的,但其他信息(例如患者是否实际出现)直到预约当天才知道。
为此,我们创建一个appointments
具有辅助时间索引的实体如下:
es = ft.EntitySet('Appointments')
es = es.entity_from_dataframe(entity_id="appointments",
dataframe=data,
index='appointment_id',
time_index='scheduled_time',
secondary_time_index={'appointment_day': ['no_show', 'sms_received']})
这表示大多数列都可以在时间上使用索引scheduled_time
,但变量no_show
and sms_received
直到辅助时间索引中的值才能使用。
然后我们做出预测scheduled_time
将我们的截止时间设置为
cutoff_times = es['appointments'].df[['appointment_id', 'scheduled_time', 'no_show']]
通过将该数据帧传递到 DFS,no_show
列将不受影响地通过,但是虽然历史值no_show
仍然可以用来创建特征。一个例子是这样的ages.PERCENT_TRUE(appointments.no_show)
或“过去没有出现过的每个年龄段的人的百分比”。