在将数据帧作为实体集中的实体传递并在其上使用 DFS 时,我们是否应该从 DFS 中排除目标变量?在传统的特征选择方法手动尝试并使用特征工具查看它是否提高了分数后,我有一个 roc_auc 分数为 0.76 的模型。所以在包含目标变量的实体集上使用了 DFS。令人惊讶的是,roc_auc 分数上升到 0.996,准确度上升到 0.9997,所以我对分数表示怀疑,因为我将目标变量以及深度特征合成传递给了与目标相关的信息可能已泄露到训练中?我假设正确吗?
2 回答
深度特征合成和特征工具确实允许您将目标保留在实体集中(以便使用它的历史值创建新特征),但是您需要设置“时间索引”并使用“截止时间”来执行此操作无标签泄漏。
您使用时间索引来指定保存每行中的数据何时已知的值的列。此列是在使用time_index
创建实体时使用关键字参数指定的entity_from_dataframe
。
然后,您在运行时使用截止时间,ft.dfs()
或者ft.calculate_feature_matrix()
指定在计算特征矩阵的每一行时应该使用数据的最后一个时间点。特征计算将仅使用截止时间(包括截止时间)的数据。因此,如果此截止时间早于目标的时间索引值,则不会出现标签泄漏。
您可以在有关处理时间的文档中详细了解这些概念。
如果您根本不想处理目标,则可以
您可以使用 pandas 将其完全从数据框中删除,然后再使其成为实体。如果它不在实体集中,则不能用于创建特征。
您可以将
drop_contains
关键字参数设置ft.dfs
为['target']
。这会阻止创建包含字符串的任何功能'target'
。
无论您执行上述哪个选项,仍然可以直接通过 DFS 传递目标列。如果您将目标添加到您的截止时间数据帧,它将被传递到生成的特征矩阵。这很有用,因为它可以确保目标列与其他特征保持一致。 您可以在文档中通过此处传递标签的示例。
使用二级时间索引的高级解决方案
有时,单个时间索引不足以表示连续信息在两个不同时间已知的数据集。这通常发生在目标是列时。为了处理这种情况,我们需要使用“次要时间索引”。
这是一个来自 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
和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)
“过去没有出现过的每个年龄段的人的百分比”。
如果您在 DFS 中使用目标变量,那么您将在训练数据中泄露有关它的信息。因此,在进行各种特征工程(手动或通过 DFS)时,您必须删除目标变量。