您好我已经创建了一种从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从数据库中检索这些数据。对此有任何帮助表示高度赞赏。
答案 0 :(得分:0)
您可以使用已经为您完成交叉折叠的MovieLens 100k数据集测试您的方法。查看grouplens.org/datasets/movielens/以获取编写和数据。你也可以下载LensKit,如果你想让一个框架为你做这个 - 那么你可以用Java编写你的推荐算法。
编辑: 根据Michael Ekstrand出色的协作过滤解释(http://md.ekstrandom.net/research/pubs/cf-survey/cf-survey.pdf),您可以使用以下方法:
由于您需要3次交叉验证,您将依次浏览每个用户并将其评级(随机或其他)分为3个部分。我们称它们为A,B和C.
现在让我们尝试解决A.所以将所有用户的B和C评级连接到训练集中。在此BC数据集上训练您的模型。
协同过滤需要一个模型(您刚刚构建),用户的评级历史以及该历史的一些隐藏部分,我们将尝试预测这些部分以衡量我们的算法有多好。因此,对于每个用户而言,您拥有模型一无所知的A部分。将该部分分为两部分:A1和A2。首先,使用A1作为已知的用户历史记录,输入您的方法。如果您尝试推荐前N个列表,请创建该列表,然后查看其中有多少N个项目实际出现在集合A2中。如果您正在尝试预测评级,请仔细检查设置A2并预测所有项目评级,然后“揭开”实际评级并衡量您的错误。
重复使用A2作为已知的用户历史记录。
重复,但接受AC和B1和B2测试的培训。然后再次重复AB训练并测试C1和C2。记住所有结果并将它们平均在一起。这是你的表现。
让我们回到第1点。我认为从数据库中为用户选择所有电影并将它们放在Java集合中可能是最简单的。然后,如果要使用随机顺序进行训练而不是基于时间的顺序,则可以使用Collections.shuffle()来置换列表。根据其大小,一次取一个列表的三分之一。
我不明白你的观点是关于电影只存在于一个群组中。用户只能对电影评分一次(或者至少,您几乎总是只关注最近的评分)。因此,对用户的评级列表进行分区将默认不包括从一个分区到另一个分区的重复项。但是当你将所有用户的Part As放在一起时,例如,当然会有很多流行电影的评级。