【选择偏差】IPS方法——Recommendations as Treatments: Debiasing Learning

#论文题目:【选择偏差】IPS——Recommendations as Treatments: Debiasing Learning and Evaluation(作为治疗的建议:消除学习和评估的偏见)
#论文地址:https://www.cs.cornell.edu/people/tj/publications/schnabel_etal_16b.pdf
#论文源码开源地址:https://www.cs.cornell.edu/~schnabts/mnar/
#论文所属会议:ICML 2016
#论文所属单位:美国纽约州伊萨卡康奈尔大学

在这里插入图片描述

一、导读

本文可以说是推荐系统中存在的偏差问题的解决办法的“鼻祖”。提出了逆倾向分数(Inverse Propensity Score, IPS),旨在消除推荐系统中的选择偏差问题。
注意:IPS方法是一个损失函数,用于后期对模型进行修正的方法。

二、方法

2.1 前者的工作不合理

首先,作者提出了理想的评测方法,即在所有的用户-物品对都可以观察到时的标准评测指标:
在这里插入图片描述
但是由于真实的YYY是未知的,传统做法中利用观察到的YYY的平均值来估计R(Y))R(Y))R(Y))
在这里插入图片描述
接着作者证明了这种方法只有在MCAR (Missing Completely At Random) Pu,i ≡ p 的 uniform 的情况 (且互相独立) 下才是 (1) 的无偏估计:
在这里插入图片描述
而通常的 MNAR (Missing Not At Random) 情况, 上述的无偏性就失效了, 即在这里插入图片描述

2.2 IPS方法

作者提出IPS方法来代替公式(5):
在这里插入图片描述
其中PPPu,i表示用户u和物品i的相关性。

2.2.1 PPPu,i计算方法

一般来说PPPu,i可以在宏观上表示为:
在这里插入图片描述
其中,XXX表示一些可观察到的特征(比如:向用户显示的预测评级),XXXhid表示观察不到的隐藏特征(比如:该商品是否由朋友推荐),YYY是其评分。

一旦考虑到可观测特征,有理由假设OOOu,i独立于新的预测Y^\hat{Y}Y^是合理的(因此也独立于δ\deltaδu,i(YYY, Y^\hat{Y}Y^))
所以,论文提出了两个计算PPPu,i的方法:

  1. 基于朴素贝叶斯的倾向估计
    此方法需要设置一个小的MCAR数据集进行观测。
    在这里插入图片描述
  2. 通过逻辑回归的倾向估计
    此倾向估计方法(不需要MCAR数据样本)是基于逻辑回归,通常用于因果推断。
    在这里插入图片描述
    Φ\PhiΦ=(W, β\betaβ, γ\gammaγ),因此P可以变形为:
    在这里插入图片描述
    在这里,Xu,i是一个向量,它对用户-项目对的所有可观察信息进行编码得到的,另外两个参数是i和u的偏置项。
<think>嗯,用户遇到了Python中未使用局部函数generate_recommendations的警告,需要解决这个问题。首先,我得想想这个警告的原因。通常,当定义一个函数或变量但未使用时,IDE或静态检查工具会给出警告,比如PyCharm的“未使用的局部函数”或者flake8的类似提示。 用户提供的代码中有一个函数定义ddef generate_recommendations(),这里可能有个拼写错误,应该是def generate_recommendations(),但可能只是用户输入时的笔误。不过不管怎样,关键问题在于这个函数没有被调用,所以才会出现警告。 那么解决方法有几个可能性。首先,用户可能忘记调用这个函数,这时候只需要在定义后调用它即可。例如,在函数定义后添加generate_recommendations()。但需要确保调用的位置正确,不会导致循环引用或其他问题。 其次,如果这个函数是故意不使用的,比如暂时注释掉或者未来需要,可以添加一个# noqa注释来禁用警告,或者使用@unused装饰器,但这可能不是最佳实践,因为最好还是处理掉未使用的代码。 另外,可能用户误拼了函数名,导致其他地方调用时名字不一致,比如大小写或者拼写错误。这时候需要检查函数名是否在调用时一致,或者在定义时是否有错别字。 还有一种情况是这个函数是作为回调或者被其他部分引用的,但可能由于某些原因没有被正确引用。例如,在类中定义但未被其他方法调用,或者作为某个事件的处理器但未绑定。这时候需要检查代码结构,确保函数被正确引用。 另外,用户提到的其他引用信息中,比如引用[4]关于生成器的内容,可能和这个函数无关,但需要确认用户是否在函数内部使用了生成器,但未正确调用。比如,如果generate_recommendations是一个生成器函数,但未通过next()或循环来使用,也可能导致未使用的警告。 所以,总结可能的解决方案:1. 调用该函数;2. 删除未使用的函数;3. 重命名或修正拼写错误;4. 添加禁用警告的注释。需要根据具体情况选择合适的方法,并确保代码的整洁和可维护性。</think>在Python中遇到未使用局部函数的警告(例如`generate_recommendations`),通常是因为该函数在代码中被定义但从未被调用。以下是分步解决方案: --- ### **解决方法** #### 1. **调用函数(推荐)** 如果函数是实际需要的逻辑,在定义后直接调用它: ```python def generate_recommendations(): # 函数逻辑 pass generate_recommendations() # 添加调用语句 ``` #### 2. **删除未使用函数(适用于冗余代码)** 如果函数是临时调试或无用代码,直接删除定义: ```python # 删除以下定义 # def generate_recommendations(): # pass ``` #### 3. **重命名或修正拼写错误** 检查函数名是否被误写(例如用户输入的`ddef`可能是拼写错误): ```python def generate_recommendations(): # 修正可能的拼写错误 pass ``` #### 4. **通过装饰器或注释抑制警告** 若需保留但暂时不用,可通过以下方式抑制警告: ```python def generate_recommendations(): # noqa: F811 (flake8忽略未使用警告) pass # 或使用类型注解抑制警告 @unused # 需定义或导入unused装饰器 def generate_recommendations(): pass ``` --- ### **原因分析** - **静态检查工具行为**:PyCharm、flake8等工具会检测未使用的代码,避免冗余代码影响可维护性[^4]。 - **潜在错误提示**:若函数名拼写错误,可能导致预期外的未调用行为(如`generate_recommendation`少写末尾的`s`)。 --- ### **扩展场景** - **函数作为参数传递**:若函数被其他模块或回调引用,需确保引用路径正确(例如通过`import`或参数传递)。 - **类方法未调用**:如果是类方法,需通过实例调用(如`self.generate_recommendations()`)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值