标签权重的计算方法之贝叶斯平滑
贝叶斯平滑(Bayesian Smoothing)是一种平滑技术,用于解决评分和标签数据中的样本稀疏性问题。在某些推荐系统或广告点击率预估的场景中,我们可能会遇到标签(例如点击次数和曝光次数)不均衡的问题,有些标签的数据量较少,容易导致模型过拟合。这时候,贝叶斯平滑通过引入贝叶斯估计的思想,为稀疏样本提供平滑效果,从而提高模型的稳定性和泛化能力。
贝叶斯平滑的核心思想是基于贝叶斯理论,通过对二项分布的参数进行平滑估计,最终得到可靠的标签权重。下面将从底层原理、数学推导到实际实现逐步展开。
1. 原理和数学背景
贝叶斯平滑的基本步骤是通过对点击率(或评分等标签)进行平滑估计,减少噪声影响。其核心是使用 Beta 分布 对二项分布参数进行估计。Beta 分布的形状由两个参数 α 和 β 决定,适用于对概率进行建模。
假设我们有以下信息:
- n:某个广告的总展示次数
- x:点击次数
如果直接用 (即点击率),当 n 很小(特别是为 1 或 0)时,该估计值不可靠,会受随机波动影响严重。
Beta 分布
Beta 分布常用于对概率的分布进行建模。其概率密度函数为:
其中 是 Beta 函数,用于归一化概率密度函数,使得积分为 1。
我们可以把 α 理解为“正向事件(如点击)"的先验数,把 β 理解为“负向事件(如未点击)”的先验数。
贝叶斯估计代码
在贝叶斯估计中,我们会将观察到的点击数据 与 Beta 分布的参数 (α,β) 结合起来,更新对点击率的估计。这个过程可以通过最大化对数似然函数的方法来估计 α 和 β。
2. 贝叶斯平滑参数估计
贝叶斯平滑的关键步骤是估计出合适的 α 和 β 参数。我们通过最大化对数似然函数来找到最佳参数:
对数似然函数为:
其中,N 是样本总数。
3. 牛顿法迭代估计 α 和 β
为了求解 α 和 β 的最大似然估计,我们可以使用牛顿法进行迭代。迭代更新规则为:
这里, 是对 α 或 β 的一阶导数, 是二阶导数。
4. 实现步骤
我们将基于上述推导,实现贝叶斯平滑的代码。
第一步:初始化参数
import numpy as np
from scipy.special import digamma, gammaln# 初始化 alpha 和 beta
alpha = 1.0
beta = 1.0
第二步:定义对数似然函数及其导数
我们需要计算对数似然函数的一阶导数和二阶导数,用于牛顿法迭代更新参数。
def compute_gradient_and_hessian(alpha, beta, impressions, clicks):# 计算一阶导数grad_alpha = sum(digamma(clicks + alpha) - digamma(alpha))grad_alpha += sum(digamma(impressions - clicks + beta) - digamma(beta))grad_alpha -= len(impressions) * (digamma(alpha + beta) - digamma(alpha))grad_beta = sum(digamma(impressions - clicks + beta) - digamma(beta))grad_beta -= len(impressions) * (digamma(alpha + beta) - digamma(beta))# 计算二阶导数hessian_alpha = -len(impressions) * digamma(alpha + beta)hessian_beta = -len(impressions) * digamma(alpha + beta)return grad_alpha, grad_beta, hessian_alpha, hessian_beta
第三步:使用牛顿法更新参数
根据一阶导数和二阶导数,迭代更新 α 和 β。
def bayesian_smoothing(impressions, clicks, max_iter=100, tol=1e-5):alpha = 1.0beta = 1.0for i in range(max_iter):grad_alpha, grad_beta, hessian_alpha, hessian_beta = compute_gradient_and_hessian(alpha, beta, impressions, clicks)# 更新 alpha 和 betaalpha -= grad_alpha / hessian_alphabeta -= grad_beta / hessian_beta# 检查收敛性if abs(grad_alpha) < tol and abs(grad_beta) < tol:breakreturn alpha, beta
第四步:计算平滑后的标签权重
通过贝叶斯平滑得到的平滑标签权重可以使用如下公式计算:
def smoothed_ctr(impressions, clicks, alpha, beta):return (clicks + alpha) / (impressions + alpha + beta)
第五步:测试代码
# 示例点击次数和展示次数数据
impressions = np.array([100, 200, 50, 10, 5])
clicks = np.array([5, 10, 3, 1, 0])# 估计 alpha 和 beta
alpha, beta = bayesian_smoothing(impressions, clicks)
print(f"Estimated alpha: {alpha}, beta: {beta}")# 计算平滑的点击率
smoothed_click_through_rate = smoothed_ctr(impressions, clicks, alpha, beta)
print("平滑后的点击率:", smoothed_click_through_rate)
5. 部署到生产环境
将平滑后的模型部署到生产环境中,通常是将参数 α 和 β 存储下来并与数据计算平滑标签权重。可以通过 API 服务实现,将展示次数和点击次数作为输入,输出平滑后的标签权重。
Flask API 部署
from flask import Flask, request, jsonify
import numpy as npapp = Flask(__name__)# 加载 alpha 和 beta
alpha, beta = 1.5, 5.0 # 预先计算好的 alpha 和 beta 值@app.route('/predict', methods=['POST'])
def predict():data = request.jsonimpressions = np.array(data["impressions"])clicks = np.array(data["clicks"])# 计算平滑后的点击率smoothed_rates = (clicks + alpha) / (impressions + alpha + beta)return jsonify({"smoothed_ctr": smoothed_rates.tolist()})if __name__ == '__main__':app.run(debug=True)
总结
贝叶斯平滑通过 Beta 分布进行平滑估计,是处理稀疏标签数据的一种有效方法。我们通过定义对数似然函数、使用牛顿法迭代优化参数 α 和 β,最终得到平滑后的标签权重,从而提高模型的稳定性。