逻辑回归(Logistic Regression)及其在推荐系统中作用

373 阅读5分钟

逻辑斯蒂回归及其在推荐系统中的应用

完整代码实现和Jupyter运行:(github.com/Myolive-Lin…)

逻辑斯蒂回归(Logistic Regression, LR)是一种广泛应用于分类问题的统计学方法。与线性回归不同,逻辑斯蒂回归用于处理二分类问题,预测某一事件发生的概率。其主要优势在于能够提供概率输出,且具有较好的计算效率。近年来,随着大数据和机器学习技术的快速发展,逻辑斯蒂回归逐渐在推荐系统中展现出重要的应用价值,尤其在用户行为预测和个性化推荐方面。

1. 推荐系统中逻辑回归的核心思想

协同过滤和矩阵分解主要依据用户与物品之间的相似度来进行推荐,而逻辑回归则独辟蹊径,将推荐问题转化为一个分类问题。它通过预测用户对物品产生正反馈(如点击、购买、观看等)的概率,对物品进行排序,从而生成推荐列表。本质上,逻辑回归是将推荐问题转化为点击率(CTR,Click-Through Rate)预估问题,通过对用户在特定情境下与物品交互可能性的预测,实现精准推荐。

2. 推荐过程

在协同过滤中,推荐系统通过分析用户历史行为(如点击、浏览、购买等)来预测用户可能感兴趣的物品。逻辑斯蒂回归通过分析用户与物品之间的交互特征,能够有效地判断用户是否会对某个物品产生兴趣。

例如,假设我们有以下特征:

  • 用户的年龄、性别等人口统计信息;
  • 用户历史行为,如过去购买过的商品类别;
  • 物品的特征,如价格、品牌、评分等。

逻辑斯蒂回归可以利用这些特征建立一个分类模型,预测用户对特定商品的点击概率或购买概率。通过训练逻辑斯蒂回归模型,我们能够输出用户与物品的匹配度,从而生成个性化推荐列表。

3. 评估推荐效果

推荐系统的效果评估通常依赖于一些常见的度量标准,如精确度(Precision)、召回率(Recall)、F1值以及ROC曲线等。逻辑斯蒂回归可以通过输出概率值来生成推荐的排序,并与真实标签进行对比,从而评估推荐的效果。

例如,假设用户是否点击某个推荐物品作为目标变量,逻辑斯蒂回归可以根据推荐的概率值来排序推荐物品。通过与实际行为数据对比,计算精确度、召回率等指标,进而评估推荐系统的性能。

4. 逻辑回归的数学模型

4.1 输入与加权求和

  1. 输入与加权求和:将特征向量 x=x1x2...xnx = (x_1、x_2...x_n)作为模型的输入,为每个特征赋予相应的权重 (w1,w2,...,wn+1)(w_1,w_2,..., w_{n+1}),通过加权求和得到 xTwx^Tw,以此来表示各特征在模型中的重要性差异。

  2. sigmoid 函数映射:将 xTwx^Tw 输入 sigmoid 函数,其数学表达式为 。sigmoid 函数能够将输入值映射到 0~1 的区间,正好符合点击率的物理意义,即预测用户点击物品的概率。因此,逻辑回归模型的最终输出为 ,其中 b 为偏置项。

4.2 Sigmoid 函数映射

(xTw)( x^T w ) 输入 Sigmoid 函数,其数学表达式为:

f(z)=11+ezf(z) = \frac{1}{1 + e^{-z}}

Sigmoid 函数能够将输入值映射到 (01)( 0 \sim 1 ) 的区间,正好符合点击率的物理意义,即预测用户点击物品的概率。因此,逻辑回归模型的最终输出为:

f(x)=11+e(wx+b)f(x) = \frac{1}{1 + e^{-(w \cdot x + b)}}

其中,( b ) 为偏置项。

image.png

5. 逻辑回归模型的训练方法

逻辑回归模型的训练方法众多,其中梯度下降法是应用最为广泛的一种。梯度下降法是一种一阶最优化算法,其核心思想是沿着函数当前点对应梯度的反方向,以规定的步长进行迭代搜索,从而找到函数的局部极小值。

5.1 确定目标函数

在使用梯度下降法来优化逻辑回归模型时,第一步是明确逻辑回归的目标函数。根据上述公式,逻辑回归的数学形式为 fw(x)f_w(x)。对于一个输入样本 xx,其预测结果可以是正样本(类别 1)或负样本(类别 0),对应的概率分别为:

{P(y=1x;w)=fw(x)P(y=0x;w)=1fw(x)\begin{cases} P(y = 1 | x; w) = f_w(x) \\ P(y = 0 | x; w) = 1 - f_w(x) \end{cases}

将其联合起来,得到数据点的条件概率表达式:

p(yx;w)=(fw(x))y(1fw(x))1yp(y | x; w) = (f_w(x))^y(1 - f_w(x))^{1-y}

根据极大似然估计的原理,逻辑回归的目标是最大化样本数据的似然性。通过对样本数据的分析,我们可以得到逻辑回归的目标函数为:

L(w)=i=1mP(yixi;w)L(w) = \prod_{i=1}^{m} P(y_i | x_i; w)

其中 (P(yx;w))( P(y|x; w) ) 表示在给定特征 x x 和参数 ww 的情况下,样本属于类别 yy 的概率。

5.2 目标函数转换

由于目标函数是连乘的形式,不便于求导,因此我们对其两侧取对数,并乘以系数 1m-\frac{1}{m} ,将求最大值的问题转化为求最小值的问题。经过转换后,目标函数变为:

J(w)=1ml(w)=1mL(w)=1m(i=1m(yilogfw(xi)+(1yi)log(1fw(xi)))\begin{aligned} J(w) & = -\frac{1}{m}l(w) = -\frac{1}{m}L(w) \\ &=-\frac{1}{m}(\sum_{i=1}^{m}(y^ilogf_w(x^i) + (1 -y^i)log(1- f_w(x^i))) \end{aligned}
  • 其中m是样本的数量

  • fw(xi)f_w(x^i)是逻辑回归的预测值,通常通过sigmoid函数表示

  • yiy^i是第i个样本的标签

5.3 求偏导与梯度下降

对目标函数 J(w)J(w) 中的每个参数求偏导,得到梯度方向。例如,对参数 wjw_j 求偏导的结果为:

J(w)wj=1mi=1m(fw(x(i))y(i))xj(i)\frac{\partial J(w)}{\partial w_j} = \frac{1}{m} \sum_{i=1}^{m} \left( f_w(x^{(i)}) - y^{(i)} \right) x_j^{(i)}
  • y(i)y^{(i)}是第 i 个样本的标签。
  • 公式中的 wjw_j 是逻辑回归模型的参数,xj(i)x_j^{(i)} 是样本i的第 j 个特征。

损失函数对偏置 b 的偏导数计算如下:

L(w,b)b=1mi=1m(fw(x(i))y(i))\frac{\partial L(w, b)}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} \left( f_w(x^{(i)}) - y^{(i)} \right)
  • fw(x(i))f_w(x^{(i)}) 是第 i 个样本的预测值,计算公式为:

  • y(i)y^{(i)} 是第 i 个样本的真实标签。

在得到梯度之后,我们利用梯度下降法来更新模型参数。梯度下降的更新规则为:

wj=wjα1mi=1m(hw(x(i))y(i))xj(i)b=bα1mi=1m(fw(x(i))y(i))w_j = w_j - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} \left( h_w(x^{(i)}) - y^{(i)} \right) x_j^{(i)}\\ b = b - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} \left( f_w(x^{(i)}) - y^{(i)} \right)

通过以上步骤,我们就完成了逻辑回归模型参数更新的推导过程。 至此,完成了逻辑回归模型的更新推导。

6. 代码实现

def sigmoid(w,x,b):
    """
    计算sigmoid函数
    Args:
      w (ndarray): 权重参数,n*1
      x (ndarray): 样本矩阵,m*n
      b (scalar): 偏置项
    Returns:
      p (ndarray): sigmoid计算结果,m*1
    """
    
    z = np.dot(x,w) + b
    return 1 / (1 + np.exp(-z))

def compute_cost(X, y, w, b, fw = None):
    """
    计算损失函数
    Args:
      X (ndarray): 样本矩阵,m*n
      y (ndarray): 标签矩阵,m*1
      w (ndarray): 权重参数,n*1
      b (scalar): 偏置项
    Returns:
      cost (scalar): 损失函数值
    """
    m = X.shape[0]
    #同样使用矩阵计算

    #如果已经计算了fw,就不用再计算一遍了sigmoid
    if fw is not None :
      cost = -(1/m) *  np.sum((y * np.log(fw) + (1 - y) * np.log(1 - fw)))
    else:
      cost = -(1/m) *  np.sum((y * np.log(sigmoid(w, X, b)) + (1 - y) * np.log(1 - sigmoid(w, X, b))))
    return cost

def logicstic_regression(X, y, learning_rate = 0.01, num_iterations = 1000):
    """
    X: input data
    y: output data
    learning_rate: learning rate for gradient descent
    num_iterations: number of iterations for gradient descent
    return: weights and bias
    """
    
    rows,cols = X.shape
    w = np.random.rand(cols,1)
    b = 0 
    
    pbar = tqdm(range(num_iterations),desc ='Logicstic Regression',ncols = 100,unit = 'it')

    for i in pbar:
        predictions = sigmoid(w,X,b).astype(np.float32)
        cost = compute_cost(X, y, w, b,fw = predictions)
        
        # 注意这里用矩阵计算,纬度是m*1
        error = predictions - y 
        dw = (1/rows) * np.dot(X.T,error) 
        db = (1/rows) * np.sum(error)

        w -= learning_rate * dw
        b -= learning_rate * db
        
        pbar.set_postfix({"cost": cost})

    return w, b

7. 逻辑斯蒂回归的优势

  • 高效性 逻辑斯蒂回归的计算复杂度相对较低,适合大规模数据的处理,尤其在实时推荐系统中能够提供较快的预测结果。

  • 可解释性强 与深度学习模型不同,逻辑斯蒂回归具有较好的可解释性。其参数(即权重)可以直接反映每个特征对预测结果的影响,为推荐系统的调试和优化提供了便利。

  • 概率输出 逻辑斯蒂回归提供的是一个概率值,可以根据实际需求调整推荐的阈值,生成不同的推荐列表。

8. 总结

逻辑回归模型凭借其对多特征的融合能力和成熟的训练方法,在推荐系统中发挥着重要作用。通过将推荐问题转化为分类问题,利用梯度下降法优化模型参数

9 Reference

  1. 王喆 《深度学习推荐系统》
  2. 机器学习中的数学——激活函数(一):Sigmoid函数
  3. 神经网络中的激活函数——Sigmoid函数