很多人都读过《龙纹身的女孩》和续集。 它是国际畅销书,已催生了美国和瑞典的电影专营权,以及更多由大卫·拉格朗茨(David Lagercrantz)撰写的书籍。
现在谁在读另一部北欧黑小说?


出版只是幂律现象主导的众多领域之一。 几本书取得了巨大的成功。 定期获利的作家的中端人数不断减少,而晦涩难懂的书籍则排长队。 我无法预测或制造惊人的影片(我是数据科学家,而不是甲骨文公司),但是如果我们能找到人们真正喜欢的书籍,该怎么办? 这些书将是营销活动尝试将其推向更高的合理目标。
此问题属于集体过滤和推荐系统的一般类别。 用简单的英语来说,如果我们知道人口中的不同成员如何喜欢不同的书,我们可以说诸如“喜欢Neuromancer , Snow Crash和Altered Carbon的人也喜欢Walter Jon Williams的Hardwired之类的话”。 同样,我们可以说,喜欢先前书籍的人群可能与喜欢“ 傲慢与偏见”的人群几乎没有重叠。
在数学上,您可以将其表示为用户 x个 项目的矩阵,其值就是用户j对项目i的评级。 该矩阵既大又稀疏。 任务是用预测等级填充所有空白区域。


这是奇异值分解(降维的常用工具)的特殊应用。 任何大矩阵ixu都可以写为两个较小矩阵ixf和fxu加上误差项的乘积。 F 是描述因素数量的超参数,这些因素被解释为对项目和用户都适用的某种质量。 雪崩是赛博朋克 , 讽刺 , 动作 , 题外话 ,几乎没有浪漫 。 迈克尔喜欢朋克 , 讽刺 , 题外话 ,对浪漫的需求并不多。 很好的搭配。
具体来说,上述大矩阵中的每个值都可以描述为整个矩阵中的平均值之和,再加上用户和商品的偏差项(通常是多大的正数)以及因子向量中点向量的点积ixf和fxu的相应行和列。
并且,如果我们将预测评级与实际评级比较,则可以定义一个损失函数,然后可以使用因子向量的梯度下降和带有正则化参数lambda的偏差项对损失函数进行优化。
我使用一小排在AWS上运行的刮板收集了120万个数据点,对4000名用户进行了评级,收集了超过370,000本书。 这个数据点大约是我最后一个分析流行书评内容的项目的15倍。 我的抓取工具运行得不够快,无法满足项目的最后期限,但是花了12美元,我就可以建立六个EC2实例并完成一个需要一周花几个月的抓取工具。 就个人而言,当有人喜欢暴力破解时,我喜欢在工具箱中放一把锤子!


Python的Surprise软件包提供了与sklearn兼容的API,可以非常优雅地处理推荐系统。 只需向它提供一个数据帧,其中每一行都是(用户,项目,等级),只需几行代码就足以创建一个推荐系统。
algo3 = SVD(lr_all = 0.005,reg_all = 0.01,n_factors = 40)
kf = KFold(n_splits = 3)用于训练集,kf.split(data)中的测试集:
t0 = time.time()
algo3.fit(训练集)
预测= algo3.test(testset)accuracy.rmse(预测,verbose = True)
t1 = time.time()
打印(t1-t0)
实际上,惊喜使事情变得如此简单,以至于我决定仅仅建立一个推荐系统并不足以吸引一个项目。 此外,改进推荐系统也很困难:十年前,Netflix提出100万美元的奖金,用于将均方根误差提高10%。 Goodreads已经拥有一个非常好的推荐系统,并且由于它们拥有所有数据,因此我无法针对任何特定用户改进他们的推荐。
每本书的预测收视率分布是正态分布(我检查过,实际上是正态分布),由均值和标准差指定。 该代码的第一个版本运行了几个小时,但我对其进行了重新设计以使计算矢量化,而不是使用嵌套的for循环,并且将其加速了一分钟。
对于df_items.itertuples()中的书:
bi =书[2]
齐=书[3:]
评分= []
因数= qi @ pu.T
评分= bi + bu + factors
means.append(np.mean(factors))
stdevs.append(np.std(factors))
normals.append(scipy.stats.normaltest(factors))
如果您选择书籍质量的阈值,则该阈值上方的区域表示喜欢书籍的人口比例。
我已经在上面完成了所有工作,并创建了一个Bokeh仪表板(加载时可能要花一些时间,请保持警惕。如果出现故障,请给我发送电子邮件。)。 您可以调整幻灯片以设置书籍在Goodreads上的评分时间范围,书籍应吸引的读者比例以及质量百分比。 颜色表示分布的平均值。 将鼠标悬停在一个点上将显示书的标题和其他一些信息。


在后台,Bokeh仪表板仅显示5000点的样本,以便合理地运行。 SVD模型仅产生约30,000本书的结果,该书已被五个或更多用户评分,这是对噪声点的修剪,使我的RMSE减少了一半。 由于ISBN比该项目实际需要的粒度要细,因此图书通过author + title的MD5哈希来标识。 我已经将前五个因素作为仪表板中的选项包括在内,但是还无法确定它们是否对应于人类宇宙中有意义的任何事物,例如类型。 最后,我要感谢William Koehrsen,他关于互动散景的系列非常宝贵。
该项目的代码可以在git的goodreads_rec_engine上找到。