【问题标题】:Divide mysql to several set for cross validation将mysql分成几组进行交叉验证
【发布时间】:2015-07-23 18:12:45
【问题描述】:

您好,我创建了一种从 Movielens 数据集中推荐电影的方法。我的问题是如何根据用户观看的电影将数据库中的表划分为折叠以应用交叉验证。这个例子详细解释了我在寻找什么。假设有人看了 12 部电影,我将应用 3 折交叉验证,所以我需要 1 组作为测试,3 组作为训练,其中 12/3 = 4,即组数。为了评估我的推荐方法,我需要将测试集的预测与其他集一一进行比较,因此我需要检索 4 组不包含重复电影的用户电影。有谁知道如何将以下示例的数据检索到 mysql 数据库中的集合中?

ID| User_ID|    Movie_ID|   Movie_Title|    Movie_Genre|    Rating|
107747| 3|  480|    Jurassic Park|  Adventure|  4|
107748| 3|  590|    Dances with Wolves| Drama, Western| 4|
107749| 3|  648|    Mission: Impossible|    Action| 3|
107750| 3|  1198|   Raiders of the Lost Ark|    Adventure|  5|
107751| 3|  1259|   Stand by Me|    Drama|  5|
107752| 3|  1266|   Unforgiven| Western|    5|
107753| 3|  1270|   Back to the Future| Sci-Fi| 3|
107754| 3|  1291|   Indiana Jones and the Last Crusade| Action| 4|
107755| 3|  1378|   Young Guns| Western|    5|
107756| 3|  1379|   Young Guns II|  Western|    4|
107757| 3|  1394|   Raising Arizona|    Comedy| 4|
107758| 3|  1431|   Beverly Hills Ninja|    Comedy| 3|

因此,我尝试将这 12 部电影检索为 3 个组,其中每个组包含 4 部电影,这些组包含独特的电影,换句话说,电影不应存在于多个组中。我正在使用 Java 从数据库中检索这些数据。对此的任何帮助都非常感谢。

【问题讨论】:

    标签: java mysql recommendation-engine cross-validation


    【解决方案1】:

    您可以使用已为您完成交叉折叠的 MovieLens 100k 数据集来测试您的方法。查看 grouplens.org/datasets/movielens/ 的文章和数据。如果你想让一个框架为你做这件事,你也可以下载 LensKit——然后你可以用 Java 编写你的推荐算法。

    编辑: 基于 Michael Ekstrand 出色的协同过滤解释 (http://md.ekstrandom.net/research/pubs/cf-survey/cf-survey.pdf),您可以使用以下方法:

    1. 由于您需要 3 折交叉验证,因此您将依次遍历每个用户,并将她的评分(随机或其他)分成 3 个部分。我们称它们为 A、B 和 C。

    2. 现在让我们尝试求解 A。因此,将所有用户的 B 和 C 评级连接到一个训练集中。在这个 BC 数据集上训练您的模型。

    3. 协同过滤需要一个模型(您刚刚构建)、用户的评分历史以及该历史的一些隐藏部分,我们将尝试预测这些隐藏部分来衡量我们的算法有多好。因此,对于每个用户,您都拥有模型一无所知的 A 部分。将该部分分成两部分:A1 和 A2。首先,使用 A1 作为已知的用户历史,输入到您的方法。如果您尝试推荐 Top-N 列表,请制作该列表,然后查看这 N 个项目中有多少实际出现在集合 A2 中。如果您尝试预测评分,则通过集合 A2 并预测所有项目评分,然后“发现”真实评分并衡量您的错误。

    4. 重复使用 A2 作为已知用户历史记录。

    5. 重复,但在 AC 上进行培训并在 B1 和 B2 上进行测试。然后再次重复 AB 训练和 C1 和 C2 测试。记住所有结果并将它们平均在一起。这就是你的表现。

    让我们回到第 1 点。我认为从数据库中为用户选择所有电影并将它们放在 Java 集合中可能是最简单的。然后,您可以使用 Collections.shuffle() 来排列列表,如果您想使用随机顺序进行训练而不是基于时间的顺序。根据列表的大小,一次取三分之一的列表。

    我不明白你关于电影只存在于一组中的观点。一个用户对一部电影只能有一个评分(或者至少,您几乎总是只关心最近的评分)。因此,默认情况下,对用户的评级列表进行分区将不包括从一个分区到另一个分区的重复项。但是当你把所有用户的 Part As 放在一起时,例如,当然会有很多热门电影的评分。

    【讨论】:

    • 亲爱的@Runner1928 非常感谢您的回复。我知道 Movielens 100k 数据集有交叉折叠,但问题是我使用的 Movielens1m 数据集没有任何交叉折叠准备好,我必须创建自己的折叠。对于您的第二个建议,即 LensKit,我已经在 Movielens 上构建了我所有的工作和新技术,因此很难将所有东西都转移到 LensKit。那么,您知道如何根据用户观看的电影从 mysql 和拆分表中解决这个问题吗?非常感谢。
    猜你喜欢
    • 2021-08-12
    • 2019-04-20
    • 2015-01-10
    • 2018-11-23
    • 2014-10-02
    • 1970-01-01
    • 2015-06-11
    • 2020-07-13
    • 2019-09-06
    相关资源
    最近更新 更多