构建和评估推荐系统

在当今竞争激烈的市场中,企业需要通过理解客户的选择并推荐他们可能喜欢的商品来吸引新客户并保留现有客户。一个优秀的推荐系统可以极大地提升用户体验,从而帮助业务增长。许多大型企业如Netflix、Spotify和Google都在不断地构建和完善推荐系统。本文将探讨LensKit如何帮助构建推荐系统,并通过nDCG指标评估不同的推荐算法,以找到最佳方案。

LensKit简介

LensKit是一个Python库,提供多种工具用于创建和测试推荐系统。它基于Java版本的LensKit,并被移植到Python语言。利用这个库,可以执行、训练和评估各种推荐算法。LensKit内置了评分机制,可以为每个推荐分配分数,以评估它们的准确性,甚至找出前5个最佳推荐。此外,LensKit还拥有大量工具,可用于实现和设计新的推荐算法。下面的图表解释了模型的工作流程和工具包的不同部分。使用工具的Item Recommender系统后,可以提供最佳推荐。可以选择自己的评分标准,并相应地对所有数据集进行评分。这个评分将在数据集分割为测试和训练后进行比较,并相应地为算法分配分数。

可以使用pip安装库,并使用以下代码行:

!pip install LensKit !pip install surprise

注意:将使用surprise库来加载数据集。

构建推荐系统

将使用LensKit工具包进行nDCG评分。nDCG的全称是“归一化折扣累积增益”,这是一种衡量排名质量的方法。这个指标是为了评估推荐系统而开发的,并且与Python DataFrame兼容。将使用以下三个列:

  • Item
  • User
  • Rating

将从scikit-surprise库加载数据集,然后继续数据探索。

import surprise import pandas as pd data = surprise.Dataset.load_builtin('ml-100k') ddir = surprise.get_dataset_dir() r_cols = ['user', 'item', 'rating', 'timestamp'] ratings = pd.read_csv(f'{ddir}/ml-100k/ml-100k/u.data', sep='t', names=r_cols, encoding='latin-1') ratings.head()

可以看到有用户、商品、评分和时间戳的列。

from lenskit.datasets import ML100K from lenskit import batch, topn, util, topn from lenskit import crossfold as xf from lenskit.algorithms import Recommender, als, item_knn as knn import pandas as pd %matplotlib inline algo_ii = knn.ItemItem(20) algo_als = als.BiasedMF(50)

导入必要的方法并初始化两个算法:

  • KNN
  • Biased Matrix Factorization

现在将创建一个推荐函数,并使用LensKit工具在创建时评估,以节省一些内存空间。为了获得准确的估计,首先生成推荐,然后最终评估它,并与其他算法进行比较。

def eval(aname, algo, train, test): fittable = util.clone(algo) fittable = Recommender.adapt(fittable) fittable.fit(train) users = test.user.unique() recs = batch.recommend(fittable, users, 100) recs['Algorithm'] = aname return recs

可以使用函数通过一个简单的for循环生成推荐,该循环遍历算法,使用相同的数据集进行一致的评分机制。

all_recs = [] test_data = [] for train, test in xf.partition_users(ratings[['user', 'item', 'rating']], 5, xf.SampleFrac(0.2)): test_data.append(test) all_recs.append(eval('ItemItem', algo_ii, train, test)) all_recs.append(eval('ALS', algo_als, train, test))

注意:可以忽略警告,因为它们是关于运行时问题的,这些问题是由于代码运行时数据集较大而引起的。

all_recs = pd.concat(all_recs, ignore_index=True) all_recs.head()

可以看到它们的输出可以添加到数据集中,并且有一个特定的分数与每个项目和用于推荐这些值的算法。为了获得更好的结果,可以将所有测试数据合并到一个单一的数据框架中。

test_data = pd.concat(test_data, ignore_index=True) test_data.head()

现在将使用一个名为RecListAnalysis的工具来分析推荐,这将帮助列出所有的推荐和测试。将使用这个来评估nDCG值。

rla = topn.RecListAnalysis() rla.add_metric(topn.ndcg) results = rla.compute(all_recs, test_data) results.head()

已经得到了nDCG值,并以适当的DataFrame格式进行了评估,这些值已经由两个算法评估,将评估哪个算法给出了最佳的总体nDCG值。

results.groupby('Algorithm').ndcg.mean()

现在将可视化输出并找到结果。

results.groupby('Algorithm').ndcg.mean().plot.bar()

在分析了两种算法之后,可以发现ALS或替代最小二乘算法具有更大的nDCG值。

在本文中,讨论了两种算法,并找到了更好的推荐算法,但这可以扩展到多个算法和多个数据集,以找到最佳的整体算法或至少一个可以超越其他算法的算法。请随时进行更多的研究,并在未来的文章/代码中标记,将非常乐意继续这项工作。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485