我有一个用户数据集,每个用户都有关于他的活动的每日信息(数值表示他的身体活动的一些测量值)。
此外,每天的每个用户都有一个布尔值,表示他/她是否采取了特定的行动。
数据集如下所示
+------+----------+----------+----------+-------+
|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)天中的活动值组合在一起(包括采取行动的那天)。
当我转向负面示例时,它变得不那么明显,我不确定如何选择负面示例以及如何从中提取功能。这让我真的重新质疑是否我选择正面例子并构建我的特征向量是正确的。
问题
理性问题
是否有更合适的方法(分类除外)来解决这类问题?
答案 0 :(得分:1)
你的表现很好。如果您在执行操作之前查看用户的最近X天活动,则会有M个时间序列,每个活动一个。在你的例子中M = 2,但在实践中,从我收集的内容来看,你还有更多。然后,您可以连接M时间序列以获得M * X维特征向量。
对于您的示例,如果我们采用M = 2和X = 5,对于用户1,我们将从2016-06-05开始并返回,活动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是异常检测的良好起点。我相信他们只是建立了一个多变量高斯,这绝对是可以改进的东西。你的kNN建议形式的评论也很好,虽然它的计算复杂度会更高。问题基本上是第一种形式的密度估计问题,因此该工具集的任何内容都是好的(参数方法,如高斯混合,随机场等,或非参数方法,如kNN或高斯过程等)。
对于你的问题2,不要过多担心积极和消极的问题。你正在处理不完善的信息。无论你有什么系统都会产生误报和漏报。你可以让一个用户10年没有做这个动作,但是在第3651天他们就做了。这是否意味着前10年的数据无效?不是真的 - 它们仍然是未注册的用户所做的很好的例子。你必须注意不要有太糟糕的负面设置 - 比如说,X天的一半以上都是积极的日子,但整个系列都以负数结束,但这是你可以调整的另一个元参数为了获得好成绩。
类似于问题3,X是元参数。它控制整个过程,而不仅仅是一个模型或另一个模型。选择的一种方法是通过直觉或“领域知识”。 X = 1太小,X = 365太大,但X = 14或X = 30似乎合理。如果参数及其域的数量不是很大,您甚至可以进行网格搜索 - 尝试部分的每个组合,并选择给出具有最佳结果的管道的组合。问题本身就是combinatorial optimization之一,网格搜索是解决这个问题的一个非常基本的算法,所以你基本上也可以解决这个子问题。
绝对查看上述Coursera课程中关于正确算法性能评估和偏差 - 方差权衡的章节,因为在数据有限的情况下,您可能会在专门针对培训数据的管道中支持自己,但是概括得很好。