java - 将mysql分成几组进行交叉验证

标签 java mysql recommendation-engine cross-validation

您好,我创建了一种从 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 从数据库中检索这些数据。非常感谢任何对此的帮助。

最佳答案

您可以使用 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 作为已知的用户历史记录,即方法的输入。如果您尝试推荐前 N 个列表,请制作该列表,然后查看这 N 个项目中有多少实际出现在集合 A2 中。如果您尝试预测评分,请检查 A2 组并预测所有项目评分,然后“发现”真实评分并测量您的误差。

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

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

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

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

关于java - 将mysql分成几组进行交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595079/

相关文章:

java - 是否可以在Java8中执行SIMD比较指令?

php - MySQL 事务不会因错误而停止

mysql - 在 MySQL 中索引只有一列的表的性能

architecture - 如何将我的推荐系统集成到我的网站中?

java - 获取 GridBagLayout 单元格的像素尺寸

java - 如何更改 JPanel 中 JButton 的大小,整个 JFrame 的大小为 "spread"

mysql - SQL查询获取最小、最大行数

python - 如何使用 scikit 的 Surprise 进行预测?

api - 微软Azure认知服务: Recommendation outputs capitalized item id

java - onClick 按钮导致崩溃