ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

recommenders 推荐系统评估模块完全指南:Python 与 PySpark 双引擎的指标体系与实战用法

recommenders 推荐系统评估模块完全指南:Python 与 PySpark 双引擎的指标体系与实战用法 人工智能机器学习深度学习【免费下载链接】recommendersBest Practices on Recommendation Systems项目地址https://gitcode.com/gh_mirrors/re/recommenders点击查看免费下载本指南以推荐系统评估模块为核心系统讲解 recommenders 项目GitHub 加速计划 / re / recommendersBest Practices on Recommendation Systems中 docs/evaluation.rst 所定义的评估体系基于 pandas 的 Python 评估接口recommenders.evaluation.python_evaluation与基于 PySpark 的recommenders.evaluation.spark_evaluation。读完本文你将掌握 RMSE/MAE 等评分误差指标、Precisionk/Recallk/NDCGk/MAP 等排序指标、以及 Diversity/Novelty/Serendipity/Coverage 等多样性指标的公式语义、参数约定、底层实现与可运行的调用示例并理解两套实现pandas 单机版与 Spark 分布式版在 API 形态和底层原理上的差异。评估模块定位与整体结构在 recommenders 项目中评估模块与数据集模块docs/datasets.rst、模型模块docs/models.rst、调参模块docs/tuning.rst并列负责回答模型推荐得准不准、推荐得多样不多样。文档docs/evaluation.rst将评估能力划分为两大入口Python evaluation对应源码 recommenders/evaluation/python_evaluation.py输入输出均为 pandas.DataFrame面向单机、Notebook 快速验证与中小规模数据PySpark evaluation对应源码 recommenders/evaluation/spark_evaluation.py输入输出均为 pyspark.sql.DataFrame面向分布式大规模数据如生产环境的海量行为日志。两套模块都覆盖三类指标族评分rating指标针对显式反馈的数值型预测误差如 RMSE、MAE、R²、解释方差排序ranking指标针对 Top-k 推荐列表的质量如 Precisionk、Recallk、NDCGk、MAP/MAPkPython 侧另有 R-PrecisionkAUC 与 LogLoss 用于隐式反馈二分类场景多样性diversity指标衡量推荐列表在覆盖率、新颖性、多样性、惊喜度方面的表现如 Catalog Coverage、Distributional Coverage、Novelty、Diversity、Serendipity。统一的列名约定与输入规范所有评估接口都遵循一致的列名约定默认值定义在 recommenders/utils/constants.pyDEFAULT_USER_COL userID DEFAULT_ITEM_COL itemID DEFAULT_RATING_COL rating DEFAULT_PREDICTION_COL prediction DEFAULT_RELEVANCE_COL relevance DEFAULT_TIMESTAMP_COL timestamp DEFAULT_K 10 # 排序指标默认取 Top-10 DEFAULT_THRESHOLD 10 # by_threshold 模式下的默认阈值这意味着如果你不显式传参评估函数默认要求真实评分表包含userID、itemID评分指标还需rating三列预测表包含userID、itemID、prediction三列。所有接口都可通过col_user、col_item、col_rating、col_prediction等参数覆盖这些默认列名。Python 侧通过装饰器_check_column_dtypespython_evaluation.py#L61-L123在调用前自动完成三类校验不满足时抛异常真实表必须包含col_user、col_item以及评分指标要求的col_rating否则抛出ColumnMismatchError预测表必须包含col_user、col_item、col_prediction否则抛出ColumnMismatchError两张表的col_user、col_item底层数据类型必须一致否则抛出ColumnTypeMismatchError例如一边是 int 一边是 str 会直接报错这是最常见的坑。两类异常类同样定义在 python_evaluation.py#L35-L58。此外核心的merge_rating_true_pred/merge_ranking_true_pred还使用了lru_cache_df定义于 recommenders/datasets/pandas_df_utils.py做基于 DataFrame 内容的缓存多次计算不同指标时能复用合并结果避免重复 join。Python 评估评分指标详解评分指标适用于预测的是分值而非排序的场景如评分预测、CTR 预估中的连续输出。它们都依赖内部函数merge_rating_true_predpython_evaluation.py#L126-L162——按col_user与col_item做内连接inner join返回对齐后的真实评分数组与预测数组若两表列名冲突自动加_true/_pred后缀区分。函数公式/底层实现取值范围适用场景rmse均方根误差np.sqrt(mean_squared_error(y_true, y_pred))sklearn 实现[0, ∞)评分预测误差惩罚大偏差mae平均绝对误差sklearnmean_absolute_error[0, ∞)评分预测误差对离群点更稳健rsquared决定系数 R²sklearnr2_score(-∞, 1]预测解释力1 为完美拟合exp_var解释方差sklearnexplained_variance_score[0, 1]预测方差解释程度aucROC 曲线下面积sklearnroc_auc_score[0, 1]隐式反馈rating 为 0/1prediction 为 0~1 概率logloss对数损失/交叉熵sklearnlog_loss[0, ∞)隐式反馈分类概率质量关于auc有两个关键说明源码 docstring 明确它不做用户分组平均不是 group-based AUC也不限制 k而是在全部预测结果上整体计算 ROC-AUC。调用时真实表的rating列应为 0/1 二值。示例import pandas as pd from recommenders.evaluation.python_evaluation import rmse, mae, rsquared, exp_var, auc, logloss rating_true pd.DataFrame({ userID: [1, 1, 2, 2], itemID: [11, 12, 21, 22], rating: [5, 3, 4, 2], }) rating_pred pd.DataFrame({ userID: [1, 1, 2, 2], itemID: [11, 12, 21, 22], prediction: [4.5, 2.8, 4.1, 2.4], }) print(rmse(rating_true, rating_pred)) # 0.387... print(mae(rating_true, rating_pred)) # 0.3 print(rsquared(rating_true, rating_pred)) print(exp_var(rating_true, rating_pred))注意源码 docstring 明确要求两张表中不能存在重复的 (userID, itemID) 对否则内连接后对齐会失真。Python 评估排序指标详解排序指标面向给每个用户返回 Top-k 推荐列表的评估。它们统一依赖merge_ranking_true_predpython_evaluation.py#L377-L454该函数会先取真实表与预测表用户的交集只在两边都出现的用户上评估再按relevancy_method确定相关项的定义最后通过get_top_k_items取每个用户得分最高的 k 个物品并标注rank从 1 开始。relevancy_method 三种模式relevancy_method是排序指标共有的核心参数决定如何判定哪些预测物品算命中top_k默认直接取每个用户预测得分最高的 k 个物品作为推荐列表与真实表交集即为命中by_threshold先按threshold过滤掉col_prediction threshold的预测再在剩余预测上取 top-k。源码注释特别强调最终每个用户的推荐列表仍然最多 k 项从而保证 precisionk 这类指标定义良好、上限为 1None认为输入已经是排好序且截断好的 top-k 列表跳过相关项计算直接做交集get_top_k_items的kNone分支。各指标语义函数定义说明precision_at_k每个用户命中数 / k 的平均与 Spark 公式一致见下文若某用户预测项不足 k最大可达精度可能 1recall_at_k每个用户命中数 / 真实相关项数的平均即使真实相关项不足 k最大值为 1r_precision_at_k每个用户 precisionR 的平均R 为该用户真实相关项数等价于第 R 位处的召回k 表示 R 的上限当所有用户真实项都多于 k 时等于 precisionkndcg_at_k归一化折损累计增益支持score_typebinary/raw/exp与discfun_typeloge/log2两个扩展参数map平均精度均值按真实相关项数归一化来自 Spark MLlib 的 MAP 定义归一化分母是相关项数而非 kmap_at_kMAPk归一化分母为min(k, n_relevant)与 Precisionk/Recallk/NDCGk 天然配套同一输入下map_at_k mapndcg_at_k的实现细节python_evaluation.py#L616-L713值得关注score_typebinary时命中即 rel1raw直接用真实评分作为 relexp使用2^rating - 1。折扣函数默认loge自然对数也可选log2。DCG 为rel / log(1 rank)的求和IDCG 则是按真实评分降序排列的理想增益二者相除再对用户取平均即得 NDCGk。map/map_at_k都通过缓存函数_get_reciprocal_rank计算每个用户的倒排排名和rr 排名计数 / rank再分别除以actual真实相关项数或min(actual, k)后对用户取平均。调用示例from recommenders.evaluation.python_evaluation import ( precision_at_k, recall_at_k, ndcg_at_k, map, map_at_k, r_precision_at_k ) # rating_true / rating_pred 同上这里给每个用户多条预测做排序 rating_pred pd.DataFrame({ userID: [1, 1, 1, 2, 2, 2], itemID: [12, 11, 13, 21, 22, 23], prediction: [5.0, 4.8, 4.5, 4.2, 3.9, 3.5], }) for metric in (precision_at_k, recall_at_k, r_precision_at_k, ndcg_at_k, map, map_at_k): print(metric.__name__, metric(rating_true, rating_pred, k10))Python 评估多样性指标详解除准确率外模块还提供推荐列表是否多样、新颖、惊喜、覆盖充分的指标用于离线评估推荐系统的非精度维度。这些指标的共同约定是train_df历史交互数据至少含col_user、col_item假定无重复行交互遵循 Castells 等人的item choice modelreco_df推荐结果含col_user、col_item可选col_relevance假定无重复 user-item 对reco_df中不能出现已在train_df中存在的 user-item 对否则装饰器_check_column_dtypes_diversity_serendipity/_check_column_dtypes_novelty_coverage会抛出异常这是刻意设计避免推荐了用户已经看过的东西进入多样性评估。函数语义底层实现要点historical_item_novelty每个物品的新颖度-log2(物品交互数 / 总交互数)交互越少的物品新颖度越高长尾novelty推荐列表的平均新颖度按推荐列表中各物品被推荐频次加权平均物品新颖度user_diversity每个用户推荐列表的多样性1 - avg_il_sim其中avg_il_sim为列表内两两物品相似度的均值Intra-list Similarity源自 Ziegler 2005diversity全体用户的平均多样性对user_diversity取均值user_item_serendipity每个 (用户, 推荐物品) 的惊喜度(1 - 物品与用户历史交互物品的平均相似度) * relevancerelevance 默认全为 1serendipity全体用户的平均惊喜度对用户级惊喜度取均值物品相似度有两种度量由item_sim_measure控制默认item_cooccurrence_count定义于 constants.pyitem_cooccurrence_count基于共现次数的余弦相似度源自 Auralist / WSDM 2012计算共现次数 / (i1出现次数^0.5 * i2出现次数^0.5)见_get_cooccurrence_similarityitem_feature_vector基于物品特征向量的余弦相似度此时必须额外传入item_feature_df包含col_item与features两列features 为向量见_get_item_feature_similarity。多样性指标的理论依据在源码 docstring 中均有引用Shani GunawardanaRecommender Systems Handbook、Zhang 等Auralist, WSDM 2012、Castells 等ECIR 2011、Ziegler 等2005。PySpark 评估三个评估器类Spark 版本以面向对象的评估器类呈现recommenders/evaluation/spark_evaluation.py构造时即完成输入校验与预计算之后每次调用指标方法都是 O(1) 读取。PySpark 相关 import 放在 try/except 中纯 Python 环境下不会导入失败。SparkRatingEvaluation评分指标构造参数与 Python 侧一致rating_true、rating_pred、col_user、col_item、col_rating、col_prediction。构造时校验两个输入必须是 Spark DataFrame否则抛TypeError空 DataFrame 抛ValueError缺少必需列抛ValueError如 Schema of rating_true not valid. Missing User Col。随后将col_rating、col_prediction强制 cast 为 double 并别名label/prediction按 (user, item) 内连接得到y_pred_true交给 Spark MLlib 的RegressionMetrics预计算。方法包括rmse()→metrics.rootMeanSquaredErrormae()→metrics.meanAbsoluteErrorrsquared()→metrics.r2exp_var()→ 解释方差。注意源码注释特别提醒Spark MLlib 的实现存在 bug可能算出大于 1 的值因此本类改用variance(label - prediction)与variance(label)手工计算1 - var1/var2当方差为 None 时返回-np.inf。SparkRankingEvaluation排序指标构造参数在评分版基础上增加kDEFAULT_K、relevancy_method、threshold。与 Python 版不同Spark 版支持三种relevancy 方法通过内部函数表分发spark_evaluation.py#L255-L259top_k→_get_top_k_itemsWindow.partitionBy(col_user).orderBy(col_rating.desc())取每用户得分最高的 k 个物品collect_list聚合成推荐列表by_time_stamp→_get_relevant_items_by_timestamp取每用户时间戳最近的 k 个物品作为相关项此时输入表需含时间戳列默认列名timestamp可用col_timestamp调整——这是 Spark 版独有的能力适合把最近交互当作真实相关项by_threshold→_get_relevant_items_by_threshold保留col_rating threshold的物品作为相关项。构造后按用户聚合真实交互项collect_list(col_item) as ground_truth与预测列表 join 成(预测列表, 真实列表)的 RDD交给 MLlibRankingMetrics。提供的方法方法底层说明precision_at_k()RankingMetrics.precisionAt(k)与 Python 版公式对齐recall_at_k()RankingMetrics.recallAt(k)ndcg_at_k()RankingMetrics.ndcgAt(k)map()RankingMetrics.meanAveragePrecision按真实相关项数归一化map_at_k()RankingMetrics.meanAveragePrecisionAt(k)按min(k, n_relevant)归一化与 Python 版map_at_k语义一致SparkDiversityEvaluation多样性指标构造参数train_df、reco_df、可选的item_feature_df、item_sim_measure默认item_cooccurrence_count、col_relevance。特点col_relevance缺省时自动补一列常量 1.0全部视为相关提供时强制 cast 为 DoubleType用于计算令人愉悦的惊喜若item_sim_measureitem_feature_vector必须提供item_feature_df且 schema 必须精确为(itemID: int, features: vector)否则抛异常构造时校验reco_df与train_df无交集 user-item 对intersect().count() ! 0即抛异常。提供的方法分四组覆盖度catalog_coverage()推荐覆盖物品数 / 训练目录物品数、distributional_coverage()推荐分布的熵基于 Shani Gunawardana 公式 21新颖度historical_item_novelty()每物品-log2(交互占比)、novelty()全体平均新颖度多样性user_diversity()每用户1 - avg_il_sim、diversity()全体均值惊喜度user_item_serendipity()每 user-item 的(1 - 与历史交互平均相似度) * relevance、user_serendipity()、serendipity()。相似度计算同样有item_cooccurrence_count与item_feature_vector两条路径且 Spark 版通过.repartition(n_partitions, i1, i2)对相似度表做分区控制以适配分布式执行特征向量余弦相似度通过udf的sim_cos实现。实测与验证测试用例与示例单元测试tests/unit/recommenders/evaluation/test_python_evaluation.py 与 tests/unit/recommenders/evaluation/test_spark_evaluation.py 覆盖了各指标的数值正确性、relevancy_method各分支、列缺失/类型不匹配等异常路径是理解每个指标到底怎么算的最佳参考性能测试tests/performance/recommenders/evaluation/test_python_evaluation_time_performance.py 关注大规模数据下评估的耗时表现端到端示例examples/03_evaluate/evaluation.ipynb 演示了从模型输出到全套指标计算的完整流程examples/03_evaluate/als_movielens_diversity_metrics.ipynb 则专门演示 ALS 模型 多样性指标的评估快速上手示例见 examples/00_quick_start/sar_movielens.ipynb 等 Notebook 中的评估环节。在 Notebook 场景下merge_rating_true_pred与merge_ranking_true_pred的lru_cache_df缓存意味着只要输入不变多个指标共享同一次连接计算结果评估一整组指标的开销远低于各指标独立 join。指标选择与使用建议评分预测场景显式反馈如 1-5 星报告rmse与mae想评估解释力度可加rsquared/exp_varTop-k 推荐场景固定 k如 10报告precision_at_k、recall_at_k、ndcg_at_k并用map_at_k而非map与前三者保持归一化口径一致k 值可通过 recommenders/tuning/parameter_sweep.py 提供的调参框架一并搜索隐式反馈二分类用auc与logloss此时真实 rating 应为 0/1业务侧质量补充diversity/novelty/serendipity/catalog_coverage注意评估前务必确认reco_df与train_df无交集数据规模单机 pandas 无法容纳时切换到 Spark 评估器类Spark 版还额外支持by_time_stamp相关项定义与基于熵的distributional_coverage常见报错排查ColumnMismatchError/ColumnTypeMismatchError多由列名不一致或 user/item 列 dtype 不一致引起reco_df should not contain any user_item pairs that are already shown in train_df 则提示推荐结果混入了训练集中已有的交互对。两套评估模块在设计上保持指标语义对齐precisionk、recallk、NDCGk、MAP 均参照 Spark MLlib RankingMetrics 定义因此在单机调参验证与分布式生产评估之间切换时指标口径可以保持一致这也是 recommenders 评估模块的核心设计目标之一。赞分享人工智能机器学习深度学习【免费下载链接】recommendersBest Practices on Recommendation Systems项目地址https://gitcode.com/gh_mirrors/re/recommenders点击查看免费下载相关推荐recommenders 推荐系统评估指南从评分精度到多样性指标的完整度量体系recommenders 推荐系统评估指南从评分精度到多样性指标的完整度量体系 导读 评估是推荐系统落地闭环中不可或缺的一环模型训练完成后必须用统一、可复人工智能机器学习深度学习游戏行业推荐系统实战指南基于 Recommenders 的四大典型场景与评估体系游戏行业推荐系统实战指南基于 Recommenders 的四大典型场景与评估体系 本指南以开源项目 Recommenders 的 游戏场景文档 https:/人工智能机器学习深度学习推荐系统评估方法详解基于recommenders项目的实践指南推荐系统评估方法详解基于recommenders项目的实践指南 引言 在推荐系统开发过程中评估环节至关重要。本文将基于recommenders项目中的评估模人工智能机器学习深度学习上一篇如何借助GPLv3开源协议打造跨平台游戏模拟器生态RetroArch完全指南下一篇Optimism项目中OPCM.addGameType对Alphabet和Fast游戏的支持创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表