【问题标题】:Ground-truth and feature extraction for predictive modelling用于预测建模的地面实况和特征提取
【发布时间】:2016-10-09 20:39:48
【问题描述】:

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

此外,每天的每个用户都有一个布尔值,表示他/她是否采取了特定行动。

数据集如下所示

+------+----------+----------+----------+-------+
|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 天内)采取行动。

接近

我的方法是构建代表每个用户在一段时间内的活动值的特征向量,并使用操作列作为基本事实的来源。然后,我将地面实况和特征向量输入到二元分类训练算法(例如 SVM 或随机森林),以生成能够预测用户是否可能采取行动的模型。

问题

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

当我转向负例时,它变得不那么明显了,我不确定如何选择负例以及如何从中提取特征。这实际上让我重新质疑我选择正例和构建特征向量的方式是否正确

问题

  1. 如何构建正面(确实采取行动的用户)和负面(未采取行动的用户)示例的基本事实?
  2. 在这种情况下,什么是反面例子?是用户在固定时间内没有采取行动吗?如果他在这个固定期限内没有采取行动,而是在之后立即采取行动怎么办?
  3. 有哪些可能的方法可以选择日期范围以从中提取特征向量。

理性问题

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

【问题讨论】:

  • 一个简短的说明:每个用户每天是否有一组恒定且有限的活动?还是每天都不一样?
  • @HoriaComan 我已更新帖子以回答您的问题。数据集中的列数是固定的。

标签: machine-learning classification feature-extraction predict feature-selection


【解决方案1】:

您拥有的代表权有了一个良好的开端。如果您在用户采取行动之前查看他们最近 X 天的活动,那么您有 M 个时间序列,每个活动一个。在您的示例中 M = 2,但实际上,根据我的收集,您会拥有更多。然后,您可以连接 M 个时间序列以获得 M*X 维特征向量。

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

构建这些负载并将它们提供给二进制分类器,您就拥有了一些简洁的基础。

事情在一定程度上取决于动作是什么,以及它发生的频率: - 如果动作是大的、不可逆的和罕见的,例如“已注册我们的优质产品”或“心脏病发作”,那么您可以安全地查看上述数据。 - 如果该操作发生得更频繁,并且可能对用户发生多次,例如“今天从我们的应用程序中分享了他在 Facebook 上的跑步状态”,那么您需要更积极地过滤负面信息,并且可能只查看较小的窗口,或仅针对从不执行该操作的用户等。

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

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

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

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

与问题 3 类似,X 是一个元参数。它控制整个过程,而不仅仅是一个模型或另一个模型。一种选择方法是根据直觉或“领域知识”进行选择。 X=1 太小,X=365 太大,但 X=14 或 X=30 似乎合理。如果参数及其域的数量不是很大,您甚至可以进行网格搜索 - 部分尝试每种组合,然后选择能够提供最佳结果的管道的组合。问题本身就是combinatorial optimization之一,而网格搜索是解决这个问题的一个非常基本的算法,所以你基本上也可以疯狂地处理这个子问题。

请务必查看上述 Coursera 课程中有关正确算法性能评估和偏差-方差权衡的章节,因为在数据有限的情况下,您可能会支持自己使用过于专业的训练数据流水线,但这并没有概括得很好。

【讨论】:

  • 非常感谢@HoriaComan,我的操作很少见,但这取决于用户。但我可以说,平均需要大约 30 天才能发生。许多用户根本不采取行动。我想听听你对问题2和3的看法,主要是:“什么是反面例子?”我喜欢你关于异常检测的想法,你指的是一些 KNN 或 K-menas 之类的方法吗?我的最后一个问题是:您能否详细说明“您有 M 个时间序列,每个动作一个”?我不太明白这一点,M 代表什么?
  • 添加了一些额外的点点滴滴,并尝试解决您的 cmets。希望这会有所帮助。
  • 很好的答案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2016-05-30
  • 2020-09-04
  • 1970-01-01
  • 2018-12-27
  • 2020-10-08
相关资源
最近更新 更多