在将数据帧作为实体集中的实体传递并在其上使用 DFS 时,我们是否应该从 DFS 中排除目标变量?在手动尝试传统特征选择方法并使用特征工具查看它是否提高了分数后,我有一个模型的 roc_auc 分数为 0.76。所以在包含目标变量的实体集上使用了 DFS。令人惊讶的是,roc_auc 分数上升到 0.996,准确度上升到 0.9997,所以我对分数表示怀疑,因为我将目标变量也传递到深度特征合成中,并且与目标相关的信息可能已泄露到训练中?我假设正确吗?
Deep Feature Synthesis 和 Featuretools 确实允许您将目标保留在实体集中(以便使用它的历史值创建新特征),但是您需要设置“时间索引”并使用“截止时间”来做到这一点无标签泄漏。
您可以使用时间索引来指定保存每行中的数据何时已知的值的列。此列是在使用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']})
Run Code Online (Sandbox Code Playgroud)
这表示大多数列可以在时间索引中使用scheduled_time,但是变量no_show和sms_received直到辅助时间索引中的值才能使用。
然后我们scheduled_time通过将截止时间设置为
cutoff_times = es['appointments'].df[['appointment_id', 'scheduled_time', 'no_show']]
Run Code Online (Sandbox Code Playgroud)
通过将该数据帧传递到 DFS,该no_show列将原封不动地通过,但no_show仍然可以使用 的历史值来创建特征。一个例子是ages.PERCENT_TRUE(appointments.no_show)“过去没有出现过的每个年龄段的人的百分比”。
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |