根据不完整数据集中的其他相关日期推断可能的日期

机器算法验证 机器学习 时间序列 生存 间隔审查 熊猫
2022-03-20 20:18:58

我正在数据科学和机器学习方面迈出第一步。我正在试验一个项目,我什至不知道我可以从什么方法开始,所以我很感激任何线索:

我有一个学生毕业的数据集(为了解释起见)。数据集是完整的,因为它包含了整个人口;所有记录都应有毕业日期。

但是,由于记录保存失败,较旧的记录缺少毕业日期。

它具有以下特点:

  • 对于自 2014 年以来的毕业典礼,我们有一个毕业日期
  • 对于 2014 年之前的毕业,缺少毕业日期
  • 对于所有学生,我们都有出生日期
  • 对于许多学生来说,毕业将与出生日期相关联。例如,他们通常可能在出生 21 年后毕业。但是,有些将是成熟的学生,以便他们可以在 21 岁后多年毕业。
  • 证书 ID 或多或少是连续的和数字的。可以假设证书 ID 彼此接近,因此代表大致同时毕业的学生
  • 这个比喻有些缺陷;假设学生可以在任何一天毕业

我的挑战是创建一种方法,可以根据出生日期推断所有学生的毕业日期。

我一直在考虑的方法是这样的:

  1. 对于两个日期都可用的所有学生,采用模式 (graduation_age)
  2. 根据顺序证书 ID 将学生分组到(比如说)1000 个容器中
  3. 找出每个垃圾箱中学生最常见的出生月份和年份
  4. 将模式 (graduation_age) 添加到特定 bin 的最常见月份/年份,并将其指定为 bin 中所有学生的毕业日期

pandas 中的示例可能如下所示:

graduations = [
       # Old data with missing graduation dates
       {'certificate_id': '090029, 'birth_date': '01/01/1983', 'graduation_date': NaT},
       {'certificate_id': '090048, 'birth_date': '04/01/1983', 'graduation_date': NaT},
       ...
       # This is 'normal' students graduating roughly 21 years after
       # their birth date
       {'certificate_id': '120015, 'birth_date': '01/01/1993', 'graduation_date': 01/03/2014},
       {'certificate_id': '120019, 'birth_date': '01/04/1993', 'graduation_date': 04/03/2014},
       # However there are many exceptions, mature students or those
       # graduating early
       {'certificate_id': '120150, 'birth_date': '01/01/1966', 'graduation_date': 05/03/2014},
       {'certificate_id': '120155, 'birth_date': '01/04/1996', 'graduation_date': 06/03/2014}, 
       ]

       df = pd.DataFrame(graduations)

任何帮助都将不胜感激,即使您能够告诉我这种问题被称为什么以便我可以进一步研究,或者让我知道这个数据集是不可能的。我目前什至不确定正确的标签是什么!

1个回答

您已经描述了一个缺失数据的问题,特别是一个审查问题。(作为一种助记装置,可以让我从类似的截断现象中直接进行审查,我喜欢考虑报告中被“审查员”涂黑的文本。你知道那里有一个单词或句子,但你只是不'不知道它说了什么;这是你自己的'毕业日期'的情况。相比之下,如果报告的最后两章被默默地省略了,那么报告已经被截断了。在这种情况下,你不仅不会知道那些章节里有什么,但你甚至不知道是否任何章节。值得注意的是,@whuber 的上述问题是关于确定数据中的这种区别。)

在这个特殊的缺失数据问题中,您有一个听起来非常简单的缺失数据机制:日期恰好是在 2014 年之前发生“毕业”时缺失的。如果您正在处理一个缺乏任何重要长期趋势的时间同质问题,那么您可以将这一事实视为优势。在这种情况下,您不会遇到由于某种原因而丢失数据的情况,这将提供有关“学生”的一些非常重要的特征的信息。

缺失数据的术语中,您尝试做的具体术语是估算缺失的日期。插补的目的当然是允许您保留缺失值的记录,以避免中世纪的所谓完整案例分析的做法,其中涉及残酷地执行数据框架其他字段中的精彩数据以进行“犯罪” ' 的“关联”与缺少的日期值。(我假设您的数据中确实有许多列,您已经从示例数据框中省略了这些列;正是这些附加列中存在有价值的信息才能证明执行此类估算的愿望是合理的。)

缺失数据的一些良好阅读而言,在我的答案中对各种斜体字词进行维基百科查找将是一个好的开始。“推理和缺失数据”的规范参考是Rubin 1976如果您具有贝叶斯倾向,那么BDA3第 8 章中的精细(尽管具有挑战性)处理可能对您有用。相反,您可能会通过探索MICE等软件来享受对插补的实用介绍(抱歉,我不知道这方面的 Pythonic 选项,但我必须假设有一些。)


为了解决@CliffAB 在下面的评论中提出的问题,将您选择的基于插补的方法与其他“更高级”的审查方法进行对比可能会有所帮助。数据分析中最常见的审查示例发生在生存(事件发生时间)模型的上下文中。(请参阅此处了解为什么会这样。)生存模型采用对生存函数的估计,无论是以参数方式还是非参数方式获得,并且这些过程模型支持推理,而无需对丢失的事件时间进行显式插补。您可能会使用这些方法很好地攻击您的数据,而不必估算单个值!

最后一点:出于某种原因,我在上面的恐吓引号中加上了“更高级”。假设您为当前的问题制作了有史以来最棒的事件发生时间模型。假设您的模型非常棒事实上,您无论如何都无法估计缺少MCMC您的 MCMC 代码将始终将丢失的时间视为潜在变量,并且确实在您的代码中会有一行您生成一个伪随机数并使用它来填充该潜在变量。因此,您会发现自己在“估算”您丢失的数据,尽管是以可以想象到的最有原则和最连贯的方式。