在测试、学习和预测之间划分数据

数据挖掘 机器学习 预测建模 搅拌
2022-02-16 09:22:19

我在 stats.stackexchange 上发帖,但也许我应该在这里发帖。

语境。订阅业务,每月向用户收取访问服务的费用。管理层希望预测“流失”——可能取消的订阅。管理层希望创建一个电子邮件序列,以防止高风险帐户流失,可能带有某种折扣代码。所以我需要确定那些有可能离开我们的账户。

我有一个包含 50k 条记录的数据集。每个行项目都是一个帐号以及一些变量。其中一个变量是“Churned”,其值为“yes”(它们已取消)或“No”(它们处于活动状态)。

我拥有的数据集是自业务开始以来的所有数据。大约 20k 记录是活跃的付费客户,大约 30k 是那些曾经是付费客户但后来取消的记录。

我的任务是建立一个模型来预测 20k 活跃客户中当前可能流失的客户。

这是我把我的大脑打成一个结的地方。我需要在 20k 条活跃客户记录上运行模型(预测)。

如何在训练、测试和预测之间拆分数据?

预测数据是否必须排除训练和测试数据?

我可以将 50k 的整个数据集拆分为 0.8 个训练和 0.2 个测试,建立一个模型,然后对 20k 个活跃帐户进行预测吗?这意味着我正在对我也将要预测的数据进行训练和测试。似乎“错误”。是吗?

2个回答

监督学习:

您是否保存了数据的时间历史? 对于监督学习集,您需要一些流失=“否”的案例和一些流失的=“是”案例,但听起来您只有流失=“是”和未知案例,例如可能流失或不流失的当前客户。通过一些时间历史,您可以回到过去并将当前客户明确标记为 churn="No"。

然后很容易拆分数据。不,您可能不想预测您训练过的任何数据,因为只有在您已经知道解决方案的情况下才能对其进行训练,所以这将是浪费时间并抛弃您可能用来评估准确性的任何指标(精度/召回/F1)在未来。

无监督学习:

如果您没有保存数据的时间历史,那么这是一个无监督学习集,您已经对其进行了 churned="yes" 和 churned="maybe"。然后,您可以在此集合上使用异常或异常值检测。

新奇检测: 训练数据没有被异常值污染,我们有兴趣检测新观察中的异常。

异常值检测: 训练数据包含异常值,我们需要拟合训练数据的中心模式,忽略异常观察。

你可以做任何一个,但新颖性更强大。这是一种翻转,因为这里的新颖性是 Churn="No",因为您的所有数据都是已确认的 Churn="Yes" 案例。

希望这可以帮助!

scikit-learn 的文档可以帮助您提供拆分数据以进行交叉验证(培训、测试、验证)的最佳实践:http: //scikit-learn.org/stable/modules/cross_validation.html

在您的情况下,您的所有帐户都被标记为“流失”,值为“是”或“否”。如果您创建一个预测 Churned=Yes/No 的模型,那么您正在回答“给定帐户当前是否处于活动状态?”的问题,我认为这不是您想要回答的问题。

如果我理解,我想你想问一个关于 Churned=No 账户的可操作问题:

  • “在接下来的 30 天内,Churned=No 帐户变为 Churned=Yes 的概率是多少?”
    • 需要访问时间序列数据。
    • 示例方法:
      • 使用 30k Churned=Yes 帐户创建监督模型(因为您知道这些帐户何时以及如何从 Churned=No 变为 Churned=Yes)并将其应用于 20k Churned=No 帐户。
      • 预测数量是在接下来的 30 天内,Churned=No 帐户变为 Churned=Yes 帐户的概率。
  • “Churned=No 帐户与 Churned=Yes 帐户的‘接近度’有多接近?”
    • 不需要访问时间序列数据。
    • 示例方法:
      • 再次使用 30k Churned=Yes 帐户创建监督模型(可能需要多个模型用于不同的相似帐户集群)并将其应用于 20k Churned=No 帐户。
      • 预测数量是衡量在参数空间中 Churned=No 帐户与 Churned=Yes 帐户的接近度的度量(即风险评分)。