一、背景
在电商推荐场景中,商品的排序得分(rankscore)通常是由多个目标分(例如点击率CTR、转换率CVR、多样性得分、利润、GMV等)综合而成。为了定量分析每个目标对最终商品排序的影响,可以采用以下几种方法:
二、方法
1. 重要性分析(Feature Importance Analysis)
使用机器学习模型对rankscore进行预测,然后分析每个目标分在模型中的重要性。具体步骤如下:
- 数据准备:收集包含各个目标分及最终排序分的训练数据。
- 模型训练:使用梯度提升决策树(GBDT)、随机森林等模型对rankscore进行预测。
- 重要性提取:通过模型的特征重要性分析(如XGBoost或LightGBM中的feature importance),提取每个目标分在模型中的重要性。
2. 敏感性分析(Sensitivity Analysis)
通过对每个目标分进行微调,观察其对最终商品排序的影响。具体步骤如下:
- 初始排序:根据现有的rankscore对商品进行排序。
- 目标分调整:分别对每个目标分进行微调(如增加或减少一定比例)。
- 排序变化观察:重新计算rankscore并排序,观察商品排序变化情况。
- 定量分析:统计每个目标分调整后,商品在排序中的变化情况,定量分析其影响。
3. 偏微分分析(Partial Derivative Analysis)
对rankscore关于每个目标分进行偏微分,求得每个目标分对最终排序的边际变化率。具体步骤如下:
- 公式推导:对rankscore公式进行偏微分。
\frac{\partial \text{rankscore}}{\partial \text{CTR}}, \frac{\partial \text{rankscore}}{\partial \text{CVR}}, \frac{\partial \text{rankscore}}{\partial \text{多样性得分}}, \frac{\partial \text{rankscore}}{\partial \text{利润}}, \frac{\partial \text{rankscore}}{\partial \text{GMV}}∂CTR∂rankscore,∂CVR∂rankscore,∂多样性得分∂rankscore,∂利润∂rankscore,∂GMV∂rankscore - 数值计算:利用数值方法计算各偏导数,分析每个目标分对rankscore的影响。
4. Shapley值分析(Shapley Value Analysis)
使用Shapley值从博弈论角度分析每个目标分对rankscore的贡献。具体步骤如下:
- 模型训练:训练一个解释性较好的模型(如树模型)。
- Shapley值计算:利用SHAP库计算每个目标分的Shapley值,衡量其对rankscore的边际贡献。
- 贡献分析:根据Shapley值,分析每个目标分对rankscore的平均贡献。
5. A/B测试(A/B Testing)
通过在线实验验证不同目标分对实际商品排序的影响。具体步骤如下:
- 策略制定:设计不同的排序策略,调整各目标分的权重。
- 用户分组:将用户随机分配到不同策略组。
- 数据收集:收集各策略组的用户行为数据(如点击率、转换率等)。
- 结果分析:比较各策略组的表现,分析不同目标分对排序效果的影响。
6. 排序一致性分析(Ranking Consistency Analysis)
通过分析rankscore的排序一致性,定量评估每个目标分的影响。具体步骤如下:
- 原始排序:根据现有rankscore对商品进行排序。
- 目标分调整:分别对某一个或几个目标分进行调整。
- 新排序生成:重新计算rankscore并排序。
- 一致性指标计算:计算原始排序与新排序的一致性指标(如Kendall's Tau、Spearman's Rank Correlation)。
- 影响分析:根据一致性指标变化,定量分析每个目标分对排序的一致性影响。
通过上述方法,可以定量分析每个目标对最终商品排序的影响,从而更好地优化电商推荐系统的排序策略。
三、实现
在Python中,可以使用scipy
库来计算排序一致性指标,比如Kendall's Tau和Spearman's Rank Correlation。下面是如何实现这些一致性指标计算的示例代码。
1. 使用Kendall's Tau计算排序一致性
Kendall's Tau是一种衡量两组排名之间一致性的统计方法。具体实现如下:
from scipy.stats import kendalltau
# 假设有两个排名列表
rank1 = [1, 2, 3, 4, 5] # 原始排名
rank2 = [2, 1, 4, 3, 5] # 调整后的排名
# 计算Kendall's Tau
tau, p_value = kendalltau(rank1, rank2)
print(f"Kendall's Tau: {tau}, p-value: {p_value}")
2. 使用Spearman's Rank Correlation计算排序一致性
Spearman's Rank Correlation也是一种衡量两组排名之间一致性的统计方法。具体实现如下:
from scipy.stats import spearmanr
# 假设有两个排名列表
rank1 = [1, 2, 3, 4, 5] # 原始排名
rank2 = [2, 1, 4, 3, 5] # 调整后的排名
# 计算Spearman's Rank Correlation
rho, p_value = spearmanr(rank1, rank2)
print(f"Spearman's Rank Correlation: {rho}, p-value: {p_value}")
示例解释
rank1
和rank2
是两个排名列表,表示在不同条件下的商品排序。kendalltau
和spearmanr
函数分别计算Kendall's Tau和Spearman's Rank Correlation,一致性指标的值范围在[-1, 1]之间,值越接近1,一致性越高,值越接近-1,一致性越低。p_value
是对应的显著性水平,如果p值很小,表示排名之间的一致性显著。
区别和使用场景:
- 计算复杂度:Kendall's Tau通常计算更复杂,尤其是数据集较大时,因为需要比较所有样本对。Spearman's Rank Correlation的计算相对简单。
- 敏感性:Kendall's Tau对数据集中细微的秩序变化更敏感,而Spearman's Rank Correlation更适合于捕捉整体的单调关系。
- 数据要求:两者都不要求数据服从特定的分布,适用于非参数数据分析。
为什么Spearman's ρ能捕捉整体单调关系?
- 秩次序敏感性:Spearman's ρ通过秩次序来评估相关性,因此它对数据的单调变化非常敏感。无论数据之间是否有线性关系,只要它们的相对排名保持一致或者有规律的变化,Spearman's ρ都能捕捉到这种单调关系。
- 不受具体数值影响:Spearman's ρ不依赖于原始数据的具体数值大小,只考虑数据的排名。因此,即使数据之间的关系是非线性的,只要这种关系是单调的,Spearman's ρ都会反映出较高的相关性系数。
- 鲁棒性:由于Spearman's ρ基于秩,因此它对异常值(outliers)的敏感度较低。异常值通常不会显著改变数据的排名次序,从而不会显著影响Spearman's ρ的值。
示例理解
假设我们有两个变量X和Y:
-
单调递增关系:
- X: [1, 2, 3, 4, 5]
- Y: [2, 3, 4, 5, 6]
- 虽然两个变量不是线性相关(即Y = X + 1),但它们的排名完全一致,因此Spearman's ρ会非常高,接近1。
-
非线性但单调递增关系:
- X: [1, 2, 3, 4, 5]
- Y: [2, 4, 8, 16, 32]
- 这里Y和X之间明显不是线性关系,但Y随着X的增加而增加,保持单调递增。Spearman's ρ仍然会很高,接近1,因为排名次序一致。
-
非单调关系:
- X: [1, 2, 3, 4, 5]
- Y: [5, 3, 4, 1, 2]
- 这里X和Y之间既不单调递增也不单调递减,排名次序变化无规律,Spearman's ρ会接近0,表示无相关性。
总结来说,Spearman's Rank Correlation通过评估数据的排名次序来捕捉变量之间的单调关系,而不依赖于线性关系。因此,它适用于捕捉整体的单调趋势,而不仅仅是线性相关性。