我们应该在featuretools中从DFS中排除目标变量吗?

时间:2018-06-01 08:58:44

标签: featuretools

在将数据帧作为实体集中的实体传递并使用DFS时,我们是否应该从DFS中排除目标变量?我有一个模型,在传统的特征选择方法手动尝试并使用特征工具来查看它是否能提高分数后,得分为0.76 roc_auc。因此,在包含目标变量的实体集上使用了DFS。令人惊讶的是,roc_auc得分上升到0.996并且准确度达到0.9997因此我怀疑分数,因为我将目标变量传递到深度特征综合中,并且与目标相关的信息可能已经泄露给训练?我假设是正确的吗?

2 个答案:

答案 0 :(得分:4)

Deep Feature Synthesis和Featuretools允许您将目标保留在实体集中(为了使用它的历史值创建新功能),但您需要设置“时间索引”并使用“截止时间”这样做没有标签泄漏。

使用时间索引指定保存每行中数据的值的列。使用time_index创建实体时,使用entity_from_dataframe关键字参数指定此列。

然后,在运行ft.dfs()ft.calculate_feature_matrix()时使用截止时间来指定在计算要素矩阵的每一行时应使用数据的最后时间点。特征计算仅使用截止时间(包括截止时间)的数据。因此,如果此截止时间早于目标的时间索引值,则不会出现标签泄漏。

您可以在Handling Time的文档中详细了解这些概念。

如果你根本不想处理目标,你可以

  1. 您可以使用pandas将其完全从数据框中删除,然后再将其作为实体。如果它不在实体集中,则不能用于创建功能。

  2. 您可以将drop_contains中的ft.dfs关键字参数设置为['target']。这将停止创建包含字符串'target'的任何功能。

  3. 无论您执行上述哪个选项,仍然可以直接通过DFS传递目标列。如果将目标添加到截止时间数据帧,则会将其传递到生成的特征矩阵。这可能很有用,因为它可确保目标列保持与其他功能对齐。您可以通过文档中的here传递标签。

    使用辅助时间索引的高级解决方案

    有时,单个时间索引不足以表示在两个不同时间知道连续信息的数据集。当目标是列时,通常会发生这种情况。要处理这种情况,我们需要使用“辅助时间索引”。

    Here是来自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_showsms_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)或“过去没有出现的每个年龄段的人口百分比”。

答案 1 :(得分:-2)

如果您在DFS中使用目标变量,则在训练数据中泄漏有关它的信息。因此,在进行各种特征工程(手动或通过DFS)时,必须删除目标变量。