Gensim:Word2Vec 推荐器准确性改进
Gensim: Word2Vec Recommender accuracy Improvement
我正在尝试使用很棒的 gensim 库在 https://arxiv.org/pdf/1603.04259.pdf 中实现类似的功能,但是与协作过滤相比,我在提高结果质量方面遇到了麻烦。
我有两个模型,一个基于 Apache Spark 构建,另一个在 grouplens 2000 万评级数据集上使用 gensim Word2Vec。我的 apache spark 模型托管在 AWS http://sparkmovierecommender.us-east-1.elasticbeanstalk.com
我是本地的 运行 gensim 模型。然而,当我比较结果时,我发现 CF 模型有 10 次有 9 次获得更好的结果(如下例更类似于搜索到的电影 - 对漫威电影的亲和力)
例如:- 如果我搜索雷神电影,我会得到以下结果
Gensim
- 美国队长:复仇者联盟 (2011)
- X战警:第一 Class (2011)
- 猩球崛起 (2011)
- 钢铁侠 2 (2010)
- X战警前传:金刚狼 (2009)
- 绿灯侠 (2011)
- 速8 (2011)
- 创:遗产 (2010)
- 变形金刚:月之黑 (2011)
CF
- 美国队长:复仇者联盟
- 钢铁侠2
- 雷神:黑暗世界
- 钢铁侠
- 复仇者联盟
- X战警:第一Class
- 钢铁侠3
- 星际迷航
- 美国队长:冬日战士
以下是我的模型配置,到目前为止我已经尝试使用 window、min_count 和尺寸参数但没有太大改进。
word2vec_model = gensim.models.Word2Vec(
seed=1,
size=100,
min_count=50,
window=30)
word2vec_model.train(movie_list, total_examples=len(movie_list), epochs=10)
感谢您在这方面的任何帮助。
你没有提到你正在尝试的协同过滤算法,但也许就此而言它比 Word2Vec
更好。 (Word2Vec
表现并不糟糕;您为什么期望它会更好?)
备用元参数可能会做得更好。
例如,window
是可能相互影响的token之间的最大距离,但是在每个target-token训练中使用的有效windows是从1到[=12中随机选择的=],作为给附近的令牌更多权重的一种方式。因此,当某些训练文本比 window
大得多时(如您的示例行中所示),某些相关性将被忽略(或权重不足)。除非排序非常重要,否则巨型 window
(MAX_INT?) 可能会做得更好,甚至是排序无关紧要的相关方法(例如纯 PV-DBOW 中的 Doc2Vec
dm=0
模式,每个标记都用作文档标签)。
根据您拥有的数据量,您的 size
可能太大或太小。不同的 min_count
、negative
计数、更大的 'iter'/'epochs' 或 sample
级别可能效果更好。 (也许即使是您已经修改过的东西也只有在进行其他更改后才会有所帮助。)
我正在尝试使用很棒的 gensim 库在 https://arxiv.org/pdf/1603.04259.pdf 中实现类似的功能,但是与协作过滤相比,我在提高结果质量方面遇到了麻烦。
我有两个模型,一个基于 Apache Spark 构建,另一个在 grouplens 2000 万评级数据集上使用 gensim Word2Vec。我的 apache spark 模型托管在 AWS http://sparkmovierecommender.us-east-1.elasticbeanstalk.com 我是本地的 运行 gensim 模型。然而,当我比较结果时,我发现 CF 模型有 10 次有 9 次获得更好的结果(如下例更类似于搜索到的电影 - 对漫威电影的亲和力)
例如:- 如果我搜索雷神电影,我会得到以下结果
Gensim
- 美国队长:复仇者联盟 (2011)
- X战警:第一 Class (2011)
- 猩球崛起 (2011)
- 钢铁侠 2 (2010)
- X战警前传:金刚狼 (2009)
- 绿灯侠 (2011)
- 速8 (2011)
- 创:遗产 (2010)
- 变形金刚:月之黑 (2011)
CF
- 美国队长:复仇者联盟
- 钢铁侠2
- 雷神:黑暗世界
- 钢铁侠
- 复仇者联盟
- X战警:第一Class
- 钢铁侠3
- 星际迷航
- 美国队长:冬日战士
以下是我的模型配置,到目前为止我已经尝试使用 window、min_count 和尺寸参数但没有太大改进。
word2vec_model = gensim.models.Word2Vec(
seed=1,
size=100,
min_count=50,
window=30)
word2vec_model.train(movie_list, total_examples=len(movie_list), epochs=10)
感谢您在这方面的任何帮助。
你没有提到你正在尝试的协同过滤算法,但也许就此而言它比 Word2Vec
更好。 (Word2Vec
表现并不糟糕;您为什么期望它会更好?)
备用元参数可能会做得更好。
例如,window
是可能相互影响的token之间的最大距离,但是在每个target-token训练中使用的有效windows是从1到[=12中随机选择的=],作为给附近的令牌更多权重的一种方式。因此,当某些训练文本比 window
大得多时(如您的示例行中所示),某些相关性将被忽略(或权重不足)。除非排序非常重要,否则巨型 window
(MAX_INT?) 可能会做得更好,甚至是排序无关紧要的相关方法(例如纯 PV-DBOW 中的 Doc2Vec
dm=0
模式,每个标记都用作文档标签)。
根据您拥有的数据量,您的 size
可能太大或太小。不同的 min_count
、negative
计数、更大的 'iter'/'epochs' 或 sample
级别可能效果更好。 (也许即使是您已经修改过的东西也只有在进行其他更改后才会有所帮助。)