评估模块#

Python 评估#

exception recommenders.evaluation.python_evaluation.ColumnMismatchError[source]#

当列不匹配时引发的异常。

当涉及列的操作遇到不匹配或不一致时,会引发此异常。

message#

错误说明。

类型:

str

exception recommenders.evaluation.python_evaluation.ColumnTypeMismatchError[source]#

当列类型不匹配时引发的异常。

当涉及列类型的操作遇到不匹配或不一致时,会引发此异常。

message#

错误说明。

类型:

str

recommenders.evaluation.python_evaluation.auc(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算隐式反馈推荐系统的曲线下面积 (Area-Under-Curve) 指标,其中评分是二元的,预测是介于 0 到 1 之间的浮点数。

https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve

注意

该评估不需要留一法场景。此指标不计算考虑用户平均 AUC 分数的基于组的 AUC。它也不限于 k。相反,它计算整个预测结果的分数,无论用户如何。

参数:
  • rating_true (pandas.DataFrame) – 真实数据

  • rating_pred (pandas.DataFrame) – 预测数据

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

auc_score(最小=0,最大=1)

返回类型:

float

recommenders.evaluation.python_evaluation.catalog_coverage(train_df, reco_df, col_user='userID', col_item='itemID')[source]#

计算所有用户推荐的目录覆盖率。该指标定义基于以下参考文献中的“目录覆盖率”定义

引用:

G. Shani and A. Gunawardana, Evaluating Recommendation Systems, Recommender Systems Handbook pp. 257-297, 2010.

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。这里的交互遵循 Castells 等人的项目选择模型

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

返回:

目录覆盖率

返回类型:

float

recommenders.evaluation.python_evaluation.distributional_coverage(train_df, reco_df, col_user='userID', col_item='itemID')[source]#

计算所有用户推荐的分发覆盖率。该指标定义基于以下参考文献中的公式 (21)

引用:

G. Shani and A. Gunawardana, Evaluating Recommendation Systems, Recommender Systems Handbook pp. 257-297, 2010.

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。这里的交互遵循 Castells 等人的项目选择模型

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

返回:

分发覆盖率

返回类型:

float

recommenders.evaluation.python_evaluation.diversity(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_item_features='features', col_user='userID', col_item='itemID', col_sim='sim', col_relevance=None)[source]#

计算所有用户推荐的平均多样性。

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pandas.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_item_features (str) – 项目特征列名。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_sim (str) – 此列指示项目相似度的列名。

  • col_relevance (str) – 此列指示推荐的项目是否实际与用户相关。

返回:

多样性。

返回类型:

float

recommenders.evaluation.python_evaluation.exp_var(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算解释方差。

参数:
  • rating_true (pandas.DataFrame) – 真实数据。不应存在重复的 (userID, itemID) 对

  • rating_pred (pandas.DataFrame) – 预测数据。不应存在重复的 (userID, itemID) 对

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

解释方差(最小=0,最大=1)。

返回类型:

float

recommenders.evaluation.python_evaluation.get_top_k_items(dataframe, col_user='userID', col_rating='rating', k=10)[source]#

获取以 Pandas DataFrame 格式输入的客户-项目-评分元组,输出每个用户的 top k 项目的密集格式 Pandas DataFrame。

注意

如果是隐式评分,只需附加一个常数列作为评分。

参数:
  • dataframe (pandas.DataFrame) – 评分数据的 DataFrame(格式为

  • customerID-itemID-rating)

  • col_user (str) – 用户列名

  • col_rating (str) – 评分列名

  • k (intNone) – 每个项目的数量;None 表示输入已经

  • again. (筛选出 top k 项目并按评分排序,无需再次执行)

返回:

每个用户的 top k 项目的 DataFrame,按 col_userrank 排序

返回类型:

pandas.DataFrame

recommenders.evaluation.python_evaluation.historical_item_novelty(train_df, reco_df, col_user='userID', col_item='itemID')[source]#

计算每个项目的新颖性。新颖性计算为(与项目交互次数/总交互次数)的负对数。该指标的定义基于以下参考文献使用选择模型(等式 1 和 6)

引用:

P. Castells, S. Vargas, and J. Wang, Novelty and diversity metrics for recommender systems: choice, discovery and relevance, ECIR 2011

项目的新颖性可以相对于所有项目集合上的一组观测事件来定义。这些事件可以是用户选择(项目被随机用户“选中”)或用户发现(项目被随机用户“知道”)。上述新颖性定义反映了项目流行度的因素。高新颖性值对应于密度函数中的长尾项目,这些项目与少数用户交互过;低新颖性值对应于热门头部品项目。

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。这里的交互遵循 Castells 等人的项目选择模型

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

返回:

一个包含以下列的 dataframe:col_item, item_novelty。

返回类型:

pandas.DataFrame

recommenders.evaluation.python_evaluation.logloss(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算隐式反馈推荐系统的对数损失 (logloss) 指标,其中评分是二元的,预测是介于 0 到 1 之间的浮点数。

https://en.wikipedia.org/wiki/Loss_functions_for_classification#Cross_entropy_loss_(Log_Loss)

参数:
  • rating_true (pandas.DataFrame) – 真实数据

  • rating_pred (pandas.DataFrame) – 预测数据

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

log_loss_score(最小=-inf,最大=inf)

返回类型:

float

recommenders.evaluation.python_evaluation.mae(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算平均绝对误差 (Mean Absolute Error)。

参数:
  • rating_true (pandas.DataFrame) – 真实数据。不应存在重复的 (userID, itemID) 对

  • rating_pred (pandas.DataFrame) – 预测数据。不应存在重复的 (userID, itemID) 对

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

平均绝对误差。

返回类型:

float

recommenders.evaluation.python_evaluation.map(rating_true, rating_pred, col_user='userID', col_item='itemID', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, **_)[source]#

Top k 预测项目的平均精度 (Mean Average Precision)

MAP 的实现参考了 Spark MLlib 的评估指标。https://spark.apache.ac.cn/docs/2.3.0/mllib-evaluation-metrics.html#ranking-systems

可以在以下链接找到很好的参考资料:http://web.stanford.edu/class/cs276/handouts/EvaluationNew-handout-6-per.pdf

注意

MAP 用于计算相关项目的平均精度,因此它通过真实数据中相关项目的数量进行归一化,而不是通过 k 进行归一化。

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

MAP(最小=0,最大=1)

返回类型:

float

recommenders.evaluation.python_evaluation.map_at_k(rating_true, rating_pred, col_user='userID', col_item='itemID', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, **_)[source]#

Top k 平均精度 (Mean Average Precision at k)

MAP@k 的实现参考了 Spark MLlib 的评估指标。apache/spark

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

MAP@k(最小=0,最大=1)

返回类型:

float

recommenders.evaluation.python_evaluation.merge_ranking_true_pred(rating_true, rating_pred, col_user, col_item, col_prediction, relevancy_method, k=10, threshold=10, **_)[source]#

基于共同用户过滤真实数据框和预测数据框

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量(可选)

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

推荐命中 DataFrame,按 col_userrank 排序 每个用户命中次数与实际相关项目的 DataFrame 唯一用户 ID 数量

返回类型:

pandas.DataFrame, pandas.DataFrame, int

recommenders.evaluation.python_evaluation.merge_rating_true_pred(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

在 userID 和 itemID 上连接真实数据框和预测数据框,并返回具有正确索引的真实和预测评分。

参数:
  • rating_true (pandas.DataFrame) – 真实数据

  • rating_pred (pandas.DataFrame) – 预测数据

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

包含真实评分的数组 numpy.ndarray: 包含预测评分的数组

返回类型:

numpy.ndarray

recommenders.evaluation.python_evaluation.ndcg_at_k(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, score_type='binary', discfun_type='loge', **_)[source]#

归一化折损累积增益 (Normalized Discounted Cumulative Gain, nDCG)。

信息: https://en.wikipedia.org/wiki/Discounted_cumulative_gain

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

  • score_type (str) – 相关性评分类型 [‘binary’, ‘raw’, ‘exp’]。默认选项 ‘binary’ 将相关性评分简化为 1(命中)或 0(未命中)。选项 ‘raw’ 使用原始相关性评分。选项 ‘exp’ 使用 (2 ** RAW_RELEVANCE - 1) 作为相关性评分

  • discfun_type (str) – 用于计算 DCG 的折扣函数类型 [‘loge’, ‘log2’]。

返回:

k 处的 nDCG(最小=0,最大=1)。

返回类型:

float

recommenders.evaluation.python_evaluation.novelty(train_df, reco_df, col_user='userID', col_item='itemID')[source]#

计算推荐项目列表中的平均新颖性(这假设推荐列表已经计算完成)。遵循以下参考文献第 5 节的内容

引用:

P. Castells, S. Vargas, and J. Wang, Novelty and diversity metrics for recommender systems: choice, discovery and relevance, ECIR 2011

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。这里的交互遵循 Castells 等人的项目选择模型

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

返回:

新颖性。

返回类型:

float

recommenders.evaluation.python_evaluation.precision_at_k(rating_true, rating_pred, col_user='userID', col_item='itemID', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, **_)[source]#

K 处的精度 (Precision at K)。

注意

我们使用与 Spark 中相同的公式计算 precision@k。更多详情请参见 https://spark.apache.ac.cn/docs/2.1.1/api/python/pyspark.mllib.html#pyspark.mllib.evaluation.RankingMetrics.precisionAt 特别是,如果用户在 rating_pred 中的项目数量小于 k,则可达到的最大精度可能 < 1。

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

k 处的精度(最小=0,最大=1)

返回类型:

float

recommenders.evaluation.python_evaluation.r_precision_at_k(rating_true, rating_pred, col_user='userID', col_item='itemID', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, **_)[source]#

K 处的 R-precision。

R-precision 可以定义为每个用户的 precision@R,其中 R 是查询的相关项目数量。它也等同于第 R 个位置的召回率。

注意

由于 R 可能很高,在这种情况下,k 表示可能的最大 R。如果每个用户都有多于 k 个的真实项目,那么 r-precision@k 等于 precision@k。您可能需要提高 k 值才能获得有意义的结果。

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

k 处的召回率(最小=0,最大=1)。即使 rating_true 中用户的项目少于 k 个,最大值也是 1。

返回类型:

float

recommenders.evaluation.python_evaluation.recall_at_k(rating_true, rating_pred, col_user='userID', col_item='itemID', col_prediction='prediction', relevancy_method='top_k', k=10, threshold=10, **_)[source]#

K 处的召回率 (Recall at K)。

参数:
  • rating_true (pandas.DataFrame) – 真实 DataFrame

  • rating_pred (pandas.DataFrame) – 预测 DataFrame

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_prediction (str) – 预测列名

  • relevancy_method (str) – 确定相关性的方法 [‘top_k’, ‘by_threshold’, None]。None 表示直接提供 top k 项目,无需计算相关性操作。

  • k (int) – 每个用户的 top k 项目数量

  • threshold (float) – 每个用户的 top 项目阈值(可选)

返回:

k 处的召回率(最小=0,最大=1)。即使 rating_true 中用户的项目少于 k 个,最大值也是 1。

返回类型:

float

recommenders.evaluation.python_evaluation.rmse(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算均方根误差 (Root Mean Squared Error)

参数:
  • rating_true (pandas.DataFrame) – 真实数据。不应存在重复的 (userID, itemID) 对

  • rating_pred (pandas.DataFrame) – 预测数据。不应存在重复的 (userID, itemID) 对

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

均方根误差

返回类型:

float

recommenders.evaluation.python_evaluation.rsquared(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

计算 R 平方

参数:
  • rating_true (pandas.DataFrame) – 真实数据。不应存在重复的 (userID, itemID) 对

  • rating_pred (pandas.DataFrame) – 预测数据。不应存在重复的 (userID, itemID) 对

  • col_user (str) – 用户列名

  • col_item (str) – 项目列名

  • col_rating (str) – 评分列名

  • col_prediction (str) – 预测列名

返回:

R 平方(最小=0,最大=1)。

返回类型:

float

recommenders.evaluation.python_evaluation.serendipity(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_item_features='features', col_user='userID', col_item='itemID', col_sim='sim', col_relevance=None)[source]#

计算所有用户推荐的平均意外性 (serendipity)。

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pandas.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_item_features (str) – 项目特征列名。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_sim (str) – 此列指示项目相似度的列名。

  • col_relevance (str) – 此列指示推荐的项目是否实际与用户相关。

返回:

意外性。

返回类型:

float

recommenders.evaluation.python_evaluation.user_diversity(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_item_features='features', col_user='userID', col_item='itemID', col_sim='sim', col_relevance=None)[source]#

计算每个用户推荐的平均多样性。该指标定义基于以下参考文献中的公式 (3)

引用:

Y.C. Zhang, D.Ó. Séaghdha, D. Quercia and T. Jambor, Auralist: introducing serendipity into music recommendation, WSDM 2012

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pandas.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_item_features (str) – 项目特征列名。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_sim (str) – 此列指示项目相似度的列名。

  • col_relevance (str) – 此列指示推荐的项目是否实际与用户相关。

返回:

一个包含以下列的 dataframe:col_user, user_diversity。

返回类型:

pandas.DataFrame

recommenders.evaluation.python_evaluation.user_item_serendipity(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_item_features='features', col_user='userID', col_item='itemID', col_sim='sim', col_relevance=None)[source]#

计算每个用户推荐中每个项目的意外性。该指标定义基于以下参考文献

引用:

Y.C. Zhang, D.Ó. Séaghdha, D. Quercia and T. Jambor, Auralist: introducing serendipity into music recommendation, WSDM 2012

Eugene Yan, Serendipity: Accuracy’s unpopular best friend in Recommender Systems, eugeneyan.com, April 2020

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pandas.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_item_features (str) – 项目特征列名。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_sim (str) – 此列指示项目相似度的列名。

  • col_relevance (str) – 此列指示推荐的项目是否实际与用户相关。

返回:

一个包含以下列的 dataframe:col_user, col_item, user_item_serendipity。

返回类型:

pandas.DataFrame

recommenders.evaluation.python_evaluation.user_serendipity(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_item_features='features', col_user='userID', col_item='itemID', col_sim='sim', col_relevance=None)[source]#

计算每个用户推荐的平均意外性。

参数:
  • train_df (pandas.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。

  • reco_df (pandas.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pandas.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_item_features (str) – 项目特征列名。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_sim (str) – 此列指示项目相似度的列名。

  • col_relevance (str) – 此列指示推荐的项目是否实际与用户相关。

返回:

一个包含以下列的 dataframe:col_user, user_serendipity。

返回类型:

pandas.DataFrame

PySpark 评估#

class recommenders.evaluation.spark_evaluation.SparkDiversityEvaluation(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_user='userID', col_item='itemID', col_relevance=None)[source]#

Spark 多样性、覆盖率、新颖性、意外性评估器

__init__(train_df, reco_df, item_feature_df=None, item_sim_measure='item_cooccurrence_count', col_user='userID', col_item='itemID', col_relevance=None)[source]#

初始化方法。

这是 Spark 版本的多样性指标评估器。此类的方法计算以下多样性指标

  • 覆盖率 - 包括两个指标
    1. catalog_coverage,它衡量从项目目录中获得推荐的项目比例;

    2. distributional_coverage,它衡量向所有用户推荐不同项目的分布不均程度。

  • 新颖性 - 更具新颖性的项目表示它不太受欢迎,即它被推荐的频率较低。

  • 多样性 - 被推荐项目之间的不同程度。

  • 意外性 - 推荐给用户的“不寻常”或“惊喜”。当使用 'col_relevance' 时,

    它表示推荐给用户的“愉快的惊喜”程度。

该指标的定义/公式基于以下参考文献,并经过修改

引用:

G. Shani and A. Gunawardana, Evaluating Recommendation Systems, Recommender Systems Handbook pp. 257-297, 2010.

Y.C. Zhang, D.Ó. Séaghdha, D. Quercia and T. Jambor, Auralist: introducing serendipity into music recommendation, WSDM 2012

P. Castells, S. Vargas, and J. Wang, Novelty and diversity metrics for recommender systems: choice, discovery and relevance, ECIR 2011

Eugene Yan, Serendipity: Accuracy’s unpopular best friend in Recommender Systems, eugeneyan.com, April 2020

参数:
  • train_df (pyspark.sql.DataFrame) – 包含用户及其交互项目的历史数据集;包含 col_user, col_item。假定不包含任何重复行。这里的交互遵循 Castells 等人的项目选择模型

  • reco_df (pyspark.sql.DataFrame) – 推荐系统的预测输出,包含 col_user, col_item, col_relevance(可选)。假定不包含任何重复的用户-项目对。

  • item_feature_df (pyspark.sql.DataFrame) –(可选)仅当 item_sim_measure=’item_feature_vector’ 时需要。它包含两列:col_item 和 features(一个特征向量)。

  • item_sim_measure (str) –(可选)此列指示使用哪种项目相似度度量。可用度量包括 item_cooccurrence_count(默认选择)和 item_feature_vector。

  • col_user (str) – 用户 ID 列名。

  • col_item (str) – 项目 ID 列名。

  • col_relevance (str) – 可选。此列指示推荐的项目是否实际与用户相关。

catalog_coverage()[source]#

计算所有用户推荐的目录覆盖率。该指标定义基于以下参考文献中的“目录覆盖率”定义

引用:

G. Shani and A. Gunawardana, Evaluating Recommendation Systems, Recommender Systems Handbook pp. 257-297, 2010.

返回:

目录覆盖率

返回类型:

float

distributional_coverage()[source]#

计算所有用户推荐的分发覆盖率。该指标定义基于以下参考文献中的公式 (21)

引用:

G. Shani and A. Gunawardana, Evaluating Recommendation Systems, Recommender Systems Handbook pp. 257-297, 2010.

返回:

分发覆盖率

返回类型:

float

diversity()[source]#

计算所有用户推荐的平均多样性。

返回:

多样性。

返回类型:

float

historical_item_novelty()[source]#

计算每个项目的新颖性。新颖性计算为(与项目交互次数/总交互次数)的负对数。该指标的定义基于以下参考文献使用选择模型(等式 1 和 6)

引用:

P. Castells, S. Vargas, and J. Wang, Novelty and diversity metrics for recommender systems: choice, discovery and relevance, ECIR 2011

项目的新颖性可以相对于所有项目集合上的一组观测事件来定义。这些事件可以是用户选择(项目被随机用户“选中”)或用户发现(项目被随机用户“知道”)。上述新颖性定义反映了项目流行度的因素。高新颖性值对应于密度函数中的长尾项目,这些项目与少数用户交互过;低新颖性值对应于热门头部品项目。

返回:

一个包含以下列的 dataframe:col_item, item_novelty。

返回类型:

pyspark.sql.dataframe.DataFrame

novelty()[source]#

计算推荐项目列表中的平均新颖性(这假设推荐列表已经计算完成)。遵循以下参考文献第 5 节的内容

引用:

P. Castells, S. Vargas, and J. Wang, Novelty and diversity metrics for recommender systems: choice, discovery and relevance, ECIR 2011

返回:

一个包含以下列的 dataframe:novelty。

返回类型:

pyspark.sql.dataframe.DataFrame

serendipity()[source]#

计算所有用户推荐的平均意外性 (serendipity)。

返回:

意外性。

返回类型:

float

user_diversity()[source]#

计算每个用户推荐的平均多样性。该指标定义基于以下参考文献中的公式 (3)

引用:

Y.C. Zhang, D.Ó. Séaghdha, D. Quercia and T. Jambor, Auralist: introducing serendipity into music recommendation, WSDM 2012

返回:

一个包含以下列的 dataframe:col_user, user_diversity。

返回类型:

pyspark.sql.dataframe.DataFrame

user_item_serendipity()[source]#

计算每个用户推荐中每个项目的意外性。该指标定义基于以下参考文献

引用:

Y.C. Zhang, D.Ó. Séaghdha, D. Quercia and T. Jambor, Auralist: introducing serendipity into music recommendation, WSDM 2012

Eugene Yan, Serendipity: Accuracy’s unpopular best friend in Recommender Systems, eugeneyan.com, April 2020

返回:

一个包含以下列的 dataframe:col_user, col_item, user_item_serendipity。

返回类型:

pyspark.sql.dataframe.DataFrame

user_serendipity()[source]#

计算每个用户推荐的平均意外性。

返回:

一个包含以下列的 dataframe:col_user, user_serendipity。

返回类型:

pyspark.sql.dataframe.DataFrame

class recommenders.evaluation.spark_evaluation.SparkRankingEvaluation(rating_true, rating_pred, k=10, relevancy_method='top_k', col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction', threshold=10)[source]#

Spark 排序评估器

__init__(rating_true, rating_pred, k=10, relevancy_method='top_k', col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction', threshold=10)[source]#

初始化。这是 Spark 版本的排序指标评估器。此类的方法计算排序指标,例如 precision@k、recall@k、ndcg@k 和平均精度。

precision@k、ndcg@k 和平均精度的实现参考了 Spark MLlib,可在此链接找到。

参数:
  • rating_true (pyspark.sql.DataFrame) – 真实评分数据的 DataFrame(格式为 customerID-itemID-rating 元组)。

  • rating_pred (pyspark.sql.DataFrame) – 预测评分数据的 DataFrame(格式为 customerID-itemID-rating 元组)。

  • col_user (str) – 用户列名。

  • col_item (str) – 项目列名。

  • col_rating (str) – 评分列名。

  • col_prediction (str) – 预测列名。

  • k (int) – 推荐给每个用户的项目数量。

  • relevancy_method (str) – 确定相关项目的方法。可能的值有 “top_k”、“by_time_stamp” 和 “by_threshold”。

  • threshold (float) – 确定相关推荐项目的阈值。这适用于预测评分遵循已知分布的情况。注意:此选项仅在将 relevancy_method 设置为 “by_threshold” 时激活。

map()[source]#

获取平均精度 (mean average precision)。

返回:

MAP(最小=0,最大=1)。

返回类型:

float

map_at_k()[source]#

获取 k 处的平均精度 (mean average precision at k)。

注意

更多详情请参阅 meanAveragePrecision PySpark 文档

返回:

k 处的 MAP(最小=0,最大=1)。

返回类型:

float

ndcg_at_k()[source]#

获取归一化折损累积增益 (Normalized Discounted Cumulative Gain, NDCG)

注意

更多详情请参阅 ndcgAt PySpark 文档

返回:

k 处的 nDCG(最小=0,最大=1)。

返回类型:

float

precision_at_k()[source]#

获取 precision@k。

注意

更多详情请参阅 precisionAt PySpark 文档

返回:

k 处的精度(最小=0,最大=1)

返回类型:

float

recall_at_k()[source]#

获取 recall@K。

注意

更多详情请参阅 recallAt PySpark 文档

返回:

k 处的召回率(最小=0,最大=1)。

返回类型:

float

class recommenders.evaluation.spark_evaluation.SparkRatingEvaluation(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

Spark 评分评估器

__init__(rating_true, rating_pred, col_user='userID', col_item='itemID', col_rating='rating', col_prediction='prediction')[source]#

初始化方法。

这是评分指标评估器的 Spark 版本。此类的方法计算评分指标,例如均方根误差、平均绝对误差、R 方和解释方差。

参数:
  • rating_true (pyspark.sql.DataFrame) – 真实标签。

  • rating_pred (pyspark.sql.DataFrame) – 预测标签。

  • col_user (str) – 用户列名。

  • col_item (str) – 项目列名。

  • col_rating (str) – 评分列名。

  • col_prediction (str) – 预测列名。

exp_var()[source]#

计算解释方差。

注意

Spark MLLib 的实现存在错误(可能导致值 > 1),因此我们使用 var()。

返回:

解释方差(最小=0,最大=1)。

返回类型:

float

mae()[source]#

计算平均绝对误差 (Mean Absolute Error)。

返回:

平均绝对误差。

返回类型:

float

rmse()[source]#

计算均方根误差。

返回:

均方根误差。

返回类型:

float

rsquared()[source]#

计算 R 方。

返回:

R 方。

返回类型:

float