我对完整数据集进行特征工程,这是错的吗?

数据挖掘 回归 特征工程
2022-02-19 14:02:28

我的目标是预测出售给定财产所需的天数,让我们将此变量称为“DaysForSale” - 简而言之 DfS

使用 DfS,我创建了一个名为“median_dfs_grouped_street_name”的变量,它返回为数据集中可用的不同街道出售房产所需的中位数天数。(街道名称都是分类的)。

在此之后,我进行训练/测试拆分并运行我的随机森林方法。

使用 feature_importances 函数,我看到新功能是第二重要的,这让我想知道这是否是正确的方法?

我有两个问题:

  1. 使用目标变量开发功能是错误的吗?
  2. 对完整数据集进行特征工程有错吗?
2个回答

使用目标变量开发功能是错误的吗?

不一定它被称为“目标编码”或“平均编码”,非常有用。例如,在您的情况下,您可以使用DfS您的火车数据来计算每条街道的中值。但是您需要仔细设计目标编码以避免过度拟合(有不同的策略可以做到这一点 - 请参见下面的链接)。对于测试数据,您只能使用基于您的训练数据的目标编码。

Coursera 课程“如何赢得数据科学竞赛:向顶级 Kagglers 学习”包含有关目标/均值编码的大量内容,可在此处找到。

对完整数据集进行特征工程有错吗?

不必要。正如Nicolas 的回答中指出的那样,您需要小心不要泄露数据。

这是一个可以的示例:假设您的功能之一是date of enlisting该物业发布出售的日期。例如,您可以向整个数据集添加一个名为的特征,该特征days since enlisting仅计算从现在到房产发布出售之间的天数。但是,您的中位数是一个导致数据泄漏的示例,因为它不是“每行”数据工程,而是“跨行”数据工程应用于训练和测试数据。

这就是为什么更安全的方法是首先拆分数据,从 val/test 数据中删除目标变量,然后进行特征工程。因此,您可以避免任何意外的数据泄漏。

您是对的:您应该避免将有关整个数据集(包括测试数据)的信息带入训练数据集中的特征工程。

通过让您的测试数据参与计算训练数据中可用的中位数,您正在将测试数据集中的信息泄漏到训练数据集中。

本文是对数据泄漏以及如何避免它的非常有用的概述