Ground-truth 和预测建模的特征提取

Ground-truth and feature extraction for predictive modelling

我有一个用户数据集,每个用户都有关于他的活动的每日信息(数值代表他身体活动的一些测量值)。

此外,每天每个用户都有一个布尔值,表示 he/she 是否采取了特定操作。

数据集如下所示

+------+----------+----------+----------+-------+
|userID|      date| activity1| activity2| action|
+------+----------+----------+----------+-------+
| user1|2016-06-05|       5.3|         6|  false|
| user1|2016-06-04|       3.1|         8|   true|
| user1|2016-06-03|       2.0|        13|  false|
| user1|2016-06-02|       4.7|         1|  false|
| user1|2016-06-01|       1.3|         9|  false|
| user1|   ...ect.|       ...|       ...|    ...|
| user2|2016-06-05|       0.6|         5|   true|
| user2|2016-06-04|       3.0|         5|  false|
| user2|2016-06-03|       0.0|         0|  false|
| user2|2016-06-02|       2.1|         3|  false|
| user2|2016-06-01|       6.3|         9|  false|
| user2|   ...ect.|       ...|       ...|    ...|
| user3|2016-06-05|       5.3|         0|  false|
| user3|2016-06-04|       5.3|        11|  false|
| user3|2016-06-03|       6.8|         5|  false|
| user3|2016-06-02|       4.9|         2|  false|
| user3|   ...ect.|       ...|       ...|    ...|
+------+----------+----------+----------+-------+

注意数据集不固定,因此每个新的一天都会为每个用户添加一个新行。但是列数是固定的。

目标

建立一个模型来预测哪个用户可能会在不久的将来(例如,在接下来的 7 天内的任何一天)采取行动。

接近

我的方法是构建代表一段时间内每个用户的 activity 值的特征向量,并将操作列用作 ground-truth 的来源。然后我将 ground-truth 和特征向量提供给二元分类训练算法(例如 SVM 或随机森林),以生成能够预测用户是否可能采取行动的模型。

问题

我从积极的例子开始,即采取行动的用户。为了提取正例的特征向量,我结合了行动前 X(30 或 7 或 1)天(包括采取行动的那一天)的 activity 值。

当我转向反例时,它变得不那么明显了,我不确定如何select反例以及如何从中提取特征。如果 我 select 使用正面示例和构建我的特征向量的方式是正确的 ,这实际上让我 re-question 了。

问题

  1. 如何构建 ground-truth 正面(已采取行动的用户)和负面(未采取行动的用户)示例?
  2. 这个案例中的反面例子是什么?是固定时间内没有采取行动的用户吗?如果他在这个固定时间段内没有采取行动,而是在之后才采取行动呢?
  3. select从日期范围中提取特征向量的可能方法是什么。

理性问题

是否有更合适的方法(除了分类)来解决这类问题?

您的表现有了一个良好的开端。如果您在用户采取行动之前查看 activity 的最后 X 天,则您有 M 个时间序列,每个 activity 一个。在您的示例中,M=2,但实际上,根据我收集的信息,您会有更多。然后可以将M个时间序列串联起来得到一个M*X维的特征向量。

对于您的示例,如果我们取 M=2 和 X=5,对于用户 1,我们将有一个从 2016 年 6 月 5 日开始并往回走的 activity 1 的时间序列[1.3 4.7 2.0 3.1 5.3] 和 activity 2 [9 1 13 8 6] 的一个时间序列,然后您可以将其连接以获得特征向量 [1.3 4.7 2.0 3.1 5.3 9 1 13 8 6 action=false].

构建这些负载并将它们提供给二进制 classifier,你就已经有了一些整洁的基础。

事情有点取决于动作是什么,以及它发生的频率: - 如果动作是大的、不可逆的和罕见的,例如 "has signed up for our premium product" 或 "has a heart attack",那么您可以安全地按照上述规定查看数据。 - 如果动作发生得更频繁,并且可能对一个用户发生多次,比如 "has shared his running status on Facebook from our app today",那么你需要更积极地过滤否定,也许只看较小的 window,或者只看从不执行操作等的用户

一般来说,我会尝试一个简单的事情,看看我在独立测试集上获得的性能。如果它很好,也许就不需要进一步的工程设计了。如果它不好,您就开始调整 ML 管道中的东西,从特征提取开始,然后深入到模型或训练算法的参数。

作为另一种建模选择,如果每个 activity 在那些 X 天内产生一个相对连续的信号,而不是尖锐的信号,其中许多天在 activity 之后是 activity,我会选择使用神经网络或至少具有信号感知内核的 SVM,尤其是当您拥有更强大的特征提取设置时。在这种情况下,随机森林对于信号来说不会那么好。

您也可以将问题作为异常检测之一提出,特别是如果很难构建一个 class(负面或正面),但不是另一个。在此设置中,您基本上对一个 class 的分布建模,然后将在该分布下具有低概率的任何事物视为异常或异常值。 Coursera ML Course 是异常检测的良好起点。我相信他们只是建立了一个多元高斯,这绝对是可以改进的。您从评论中提出的 kNN 建议也很好,尽管它在计算上会更加复杂。问题基本上是第一种形式的密度估计,所以该工具集中的任何东西都很好(参数方法,如混合高斯、随机场等或非参数方法,如 kNN 或高斯过程等)。

对于你的问题 2,不要太担心什么是积极的,什么是消极的。您正在处理不完善的信息。无论您拥有什么系统,都会有误报和漏报。您可能有一个用户 10 年没有执行该操作,但在第 3651 天他们执行了该操作。这是否意味着前 10 年的数据无效?不完全是——它们仍然是未注册用户的行为的好例子。你必须注意不要有太糟糕的负面设置 - 比如说,超过一半的 X 天是正面的日子,但整个系列以负面结束,但这是你可以调整的另一个元参数才能取得好成绩。

与问题3类似,X是一个元参数。它控制整个过程,而不仅仅是一个模型或另一个模型。一种选择方法是凭直觉或 "domain knowledge"。 X=1 太小,X=365 太大,但 X=14 或 X=30 似乎合理。如果参数的数量及其域不是那么多,您甚至可以进行网格搜索 - 部分尝试每个组合,然后选择能够提供最佳结果的管道。问题本身是 combinatorial optimization 之一,网格搜索是解决此问题的一种非常基本的算法,因此您基本上也可以对这个子问题发狂。

一定要查看上述 Coursera 课程中有关正确算法性能评估和偏差方差权衡的章节,因为在数据有限的情况下,您可能会在一个过于专业化的管道中支持训练数据,但是泛化不好。