基于输出的手动特征工程

数据挖掘 机器学习 特征选择 特征工程 相关性 数据泄露
2021-10-08 00:47:35

因此,我正在研究一个 ML 模型,该模型将具有潜在的预测变量:年龄他所在城市的代码他的社会地位(已婚/单身等)他的孩子数量和二进制输出签名(0或 1)。这就是我拥有的初始数据集。

我的预测将基于这些特征来预测该人的签名值。

我已经对看不见的数据进行了预测。在用预测结果与真实数据验证结果后,我有25%的准确率。虽然交叉验证给了我65%的准确率。所以我想:过度拟合

这是我的问题,我回到了整个过程的早期阶段,并开始创建新功能。示例:我没有将城市的代码作为 ML 模型的输入毫无意义,而是根据已签名的百分比创建了类,城市,“已签名”(输出)的百分比较高,得到分配给更高的 class_city 值,这在我的相关矩阵中大大改善了有符号类城市的关系,这是有道理的。我在做什么正确吗?还是我不应该根据输出创建特征? 这是我的 CM:

仅使用 3 个特征(部门类别年龄情况)重新建模后,我在由 148 行与训练文件中的 60k 行组成的看不见的数据上测试了我的模型。

具有旧特征的第一个模型(部门的 ID)给出了25%的准确率,而具有新特征 class_department 的第二个模型给出了71%的准确率(再次在未见过的数据上)

注意:第一个具有 25% 的模型具有一些其他特征作为 ID(它们可能导致模型对 deparment_ID 的准确度如此低)

2个回答

您可以根据输出值创建特征,但在执行此操作时应小心。

当您对给定数据点使用 class_city 的值(基于该城市的已签名百分比)时,请注意此计算不能包括当前数据点,因为在预测期间您将没有“已签名”的值。

处理此问题的一种方法是将您拥有的总数据分成三部分 - 估计、训练、测试。估计集仅用于估计每个城市的 class_city 值。然后可以在训练和测试数据中使用这些值。这样,您就可以在没有模型做任何“不公平”的情况下获得标签值。对于测试,您实际上可以使用来自估计+训练集的数据来估计用于测试集中的 class_city 值。对于任何看不见的数据也是如此。您可以使用从所有先前数据点估计的 class_city 值。

例如,在时间序列数据的上下文中,任何数据点的 class_city 值都可能使用来自所有先前数据点的信息,并且不应使用来自未来数据点的任何信息!

不,您不应该这样做,这会导致数据泄漏。当您用于训练机器学习算法的数据恰好具有您试图预测的信息时,就会发生数据泄漏。

它将在训练期间为您的模型提供有关您的测试数据的信息。它会导致你的测试分数过于乐观,并且会使模型在泛化到完全看不见的数据时变得更糟。

数据泄露的好资源