为什么我的模型产生的输出太好而不是真实的输出?

数据挖掘 机器学习 深度学习 分类 数据挖掘 过拟合
2021-09-19 08:24:52

我正在尝试对患有糖尿病和非糖尿病的人进行二元分类问题。

为了标记我的数据集,我遵循了一个简单的规则。如果一个人T2DM的医疗记录中有,我们将他标记为阳性病例 ( diabetes),如果他没有 T2DM,我们将他标记为Non-T2DM

由于每个受试者都有很多数据点,这意味着他有很多实验室测量结果、服用了很多药物、记录了很多诊断等,我最终为每个患者得到了 1370 个特征。

在我的训练中,我有 2475 名患者,在我的测试中,我有 2475 名患者。(我已经尝试了 70:30。现在尝试 50:50 仍然是相同的结果(如 70:30))

我的结果好得令人难以置信,如下所示

在此处输入图像描述

在此处输入图像描述

我应该减少功能的数量吗?是否过拟合?我应该只保留前 20 个功能、前 10 个功能等顶级功能吗?可以帮助我理解为什么会这样吗?

详细更新

我们通过一组诊断代码(如 T2DM 及其并发症的 icd9、10 代码等)检查是否存在 T2DM。例如:假设一个患者的诊断记录中的 icd9 代码为 250,我们知道他被诊断出患有 2 型糖尿病。在这一点上,我们不必担心这种标记方法的准确性。同样,我们将所有其他患者标记为T2DMNon-T2DM

但是当我们提取特征时,他的所有病历都被视为特征。药物/状况/实验室测试的频率将用作特征值。所以,基本上,相同的诊断代码(250) 也将是一个输入特征。这是否意味着我应该删除用于标记数据集的诊断代码,以免用作特征?但这些确实是非常好的功能,可以帮助我确定患者是否被诊断为 T2DM(当我将我的模型应用于完全不同的数据集时)。我的目标不是找出患者将来是否会患糖尿病,而我的目标只是找出患者是否患有糖尿病(从他的记录中)。因此,我如上所述用不完美的启发式方法标记我的数据集并构建模型。一旦我建立了这个模型,我想在另一个站点验证这个模型,并找出使用这种不完善的启发式方法构建的模型在识别患者是否患有糖尿病方面的效果如何。希望这可以帮助

4个回答

假设这些结果是在没有数据泄漏的有效测试集上获得的,这些结果不会显示过度拟合,因为过度拟合会在训练集上导致出色的性能,但在测试集上会显着降低性能。

确保训练集和测试集之间的实例真正不同:可能存在一些数据泄漏,例如同一患者的重复记录。

另一个潜在缺陷是黄金标准标签:如果患者的病历中有这种 T2DM,这意味着他们已经被诊断出来了,对吗?而且由于这些特征也基于病历,因此该病历很可能包含有关此诊断的直接指示(例如在给患者开的药物中)。对此有两种解释:

  • 要么任务是由这个 T2DM 标签有目的地定义的,在这种情况下,您可以享受出色的性能,但从技术上讲,它与一般检测糖尿病无关。
  • 或者目标是检测糖尿病患者,包括尚未诊断的糖尿病患者,但您的黄金标准很可能不适合这项任务。

[编辑以下更新的问题]

您的更新阐明了您要针对的确切任务,它与我上面的第一个解释完全一致:假设您的目标是预测哪些实例满足此 T2DM 标准并且功能包含有关它的直接指示:

  • 我认为保留这些功能是正确的,如果有非常有用的信息可用,那么不利用它是荒谬的(当然,假设它在您计划使用的任何未来数据集中也以相同的形式提供)
  • 您获得的非常高的性能非常适合这项任务,这不是错误。只是碰巧任务很简单,因此系统能够很好地预测标签。

然而,这也意味着您可以在没有任何 ML 的情况下做得更好:目前 ML 方法为您提供大约 99% 的 F 分数,因为它不能完美地代表用于黄金的标准。但由于黄金标准标签完全基于特征,“预测”标签的最直接方法是应用标准。使用复杂的 ML 方法来预测可以通过确定性方法更准确地从相同数据中获得的信息是没有意义的。

可能是数据泄漏的情况。
对于 1370 个特征,对于如此极端的结果,2475 是一个非常小的数据集。

请尝试-
检查错误分类的记录。
尝试删除 T2DM 功能并注意下降
对所有功能重复最后一步。您必须观察到其他特征的倾角可以忽略不计,而导致泄漏的任何特征的倾角都非常大。

它几乎看起来像过拟合。知道您使用了哪种算法也会很有趣。有些对少量实例/大量功能非常敏感,并且您几乎拥有与实例一样多的功能。

在再次拟合模型之前,尝试首先检查特征之间的相关性并使用 PCA 或其他方法减少特征数量。

听起来系统可以学习你的标签算法。如果这是有意的,那么您可以使用它并丢弃所有 ML。如果你想预测,比如诊断 icd9=250,那么当然没有必要将 icd9 包含为特征。或者,如果有病史,您可以使用糖尿病诊断前的记录作为训练示例。您说您不想预测患者将来是否会患糖尿病。但是你确实想预测某人现在是否患有糖尿病,即使没有被诊断出来,对吧?