预测任务持续时间

数据挖掘 回归 生存分析
2021-09-22 07:23:56

我正在尝试创建一个预测任务持续时间的回归模型。我拥有的训练数据包含大约 4 万个已完成的任务,其中包含以下变量:

  • 谁执行了任务(约 250 个不同的人)
  • 执行任务的项目的哪个部分(子项目)(约 20 个不同的部分)
  • 任务类型
  • 任务的开始日期(10 年的数据)
  • 必须完成任务的人估计需要多长时间
  • 此任务完成的实际持续时间

持续时间可以在半小时到几百小时之间变化,但严重偏斜(大多数任务在 10 小时内完成)。在对数尺度上,分布仍然略微向右倾斜。

预测不一定是完美的,但我正在努力提高人们的估计。要问的一个问题是“我们可以使用什么度量来更好地定义我认为最好的衡量标准是均方误差 (MSE),因为它对大误差的权重比小误差要差得多。

在我转向机器学习之前,我尝试了一些简单的方法,例如通过平均或中值误差调整估计值,通过按人分组的平均/中值误差进行调整,按子项目分组,但这些方法中的每一个都碰巧表现更差。

对于机器学习,我遇到的第一个问题是分类变量的数量,因为对于大多数模型来说,这些变量必须以某种方式进行编码(例如 one-hot)。无论如何,我尝试应用一些线性模型,例如使用随机梯度下降,我的方法是:

  1. One-hot 对分类特征进行编码
  2. 将日期转换为 unix 时间戳
  3. 规范化所有尚未介于 0 和 1 之间的特征
  4. 将数据拆分为 80/20 学习和测试集。
  5. 使用网格搜索交叉验证和学习集尝试找到最佳超参数并拟合模型。
  6. 用测试集预测
  7. 计算错误/分数

现在我注意到的一件事是结果变化很大:一次运行的 MSE 接近另一次运行的两倍(150 和 280)。还有一点就是大家估计的MSE在80左右,所以我的模型表现差一点。

在我努力提高性能的过程中,我偶然发现了这个问题,有人建议使用生存模型。现在我对这些模型不熟悉,但听起来很有希望,但在我最初的测试中,它对于我的目的来说太慢了(数据集太大)。

在建议使用生存模型(和维基百科页面)的同一个数据科学答案中,他们还提到了泊松回归,但我不确定如何将其应用于我的案例。

长话短说:我只有两个问题: 1. 我使用 SGD 的方法“正确”吗?你认为我可以用它改善结果吗?2. 其他模型是否更适合这种预测,如果是,你能解释一下我将如何使用它们吗?

2个回答

我认为你所做的分析是好的。

关于生存分析程序,我认为在您的场景中使用它就足够了。即使这可能需要时间,但结果是好的并且非常有见地。

由于您已对数据应用了生存分析,因此您需要确保满足以下假设:

  1. 有几种不同的方法来估计生存函数或生存曲线。有许多流行的参数方法可用于对生存数据进行建模,它们在对人口中生存时间分布所做的假设方面有所不同。一些流行的分布包括指数、Weibull、Gompertz 和对数正态分布。

  2. 也许最受欢迎的是指数分布,它假设参与者遭受感兴趣事件的可能性与该人没有事件的时间无关。其他分布对个体发生事件的概率做出不同的假设(即,它可能随时间增加、减少或变化)。有关生存分析的参数方法的更多详细信息,请参见 Hosmer 和 Lemeshow 以及 Lee 和 Wang1。

  3. 这里有两种非参数方法,它们不假设一个人发展事件的概率如何随时间变化。使用非参数方法,我们估计并绘制生存分布或生存曲线。生存曲线通常绘制为阶跃函数,如下图所示。时间显示在 X 轴上,生存率(处于危险中的人的比例)显示在 Y 轴上。请注意,幸存的参与者百分比并不总是代表活着的百分比(假设感兴趣的结果是死亡)。“存活率”也可以指没有其他结果事件的比例(例如,没有MI或心血管疾病的百分比),或者它也可以表示没有经历健康结果(例如,癌症缓解)的百分比。

您可以通过此链接更好地理解。

关于泊松分布,您是否绘制并检查数据是否遵循泊松分布,例如:

在此处输入图像描述

如果以下假设成立,则泊松分布是一个合适的模型。

  • k 是事件在某个区间内发生的次数,k 可以取值 0、1、2、……。
  • 一个事件的发生不会影响第二个事件发生的概率。也就是说,事件是独立发生的。
  • 事件发生的速率是恒定的。该比率不能在某些区间更高而在其他区间更低。
  • 两个事件不可能同时发生;相反,在每个非常小的子间隔,恰好有一个事件发生或不发生。
  • 在一个小的子区间内发生事件的概率与子区间的长度成正比。

或者

  • 实际概率分布由二项分布给出,并且试验次数远远大于人们所询问的成功次数

如果满足这些条件,那么您可以使用泊松模型,通过此链接

在RPython中实现这一点

最后,解决您的两个问题:

  1. 您的方法是正确的,使用该方法没有问题,为了改善您的结果,您需要处理特征 engg(派生新变量)。因为您将持续时间视为连续变量(您是否执行了该日志转换,哪个你在开头说过了吗?)

  2. 在您的场景中,我认为生存和泊松会给您更好的结果,如果您认为这些需要更多时间,那么请尝试获取数据样本并完成您的工作。如果您将结果视为连续变量,那么您可以使用 Random Forest,XGBoost ,所有用于预测连续变量的方法(但如果是你,我会花更多时间来拟合生存和泊松,然后转移到其他预测技术)

如果您有任何问题,请告诉我!

最有可能的是,SGD 不是您的限制因素。但是,您是否考虑过采用分类而不是回归方法?(看起来你在预测真实值而不是类)。既然您声明预测不一定是完美的,为什么不尝试将结果变量分组到箱中,然后预测箱?您将获得一个更精细的解决方案,但您可能会发现它有效。