4. 逻辑回归与FM:逻辑回归在推荐中的应用、特征交叉、FM因子分解机原理

好,咱们进入第四章。

这一章,我打算聊聊推荐系统里两个非常经典的模型——逻辑回归和FM。说实话,这两个模型虽然“年纪”不小了,但直到今天,很多工业级推荐系统的底层架构里,依然能看到它们的身影。你想想看,能在深度学习大行其道的今天还屹立不倒,肯定是有两把刷子的。

4.1 逻辑回归在推荐中的应用

逻辑回归,说白了就是一个线性模型加了个sigmoid函数。但别小看它,它在推荐系统里可是个“万金油”角色。

为什么逻辑回归适合做推荐?

核心原因就两点:可解释性强计算效率高

  • 可解释性:每个特征都有一个对应的权重w。权重越大,说明这个特征对点击率的影响越大。这在业务排查和调优时特别有用。我记得有一次,线上CTR突然下跌,我直接拉出逻辑回归的权重表,发现某个特征的权重异常高,一查果然是数据埋点出了问题。
  • 计算效率:逻辑回归的预测就是一次矩阵乘法加一个激活函数,计算量非常小。在广告系统这种动辄千万级QPS的场景下,逻辑回归依然是很多团队的首选。

具体怎么用?

在推荐场景里,我们通常把逻辑回归当作一个CTR预估模型。输入是用户特征、物品特征、上下文特征,输出是用户点击该物品的概率。

# 一个简单的逻辑回归CTR预估示例
import numpy as np
from sklearn.linear_model import LogisticRegression

# 假设我们有1000个样本,每个样本有10个特征
X = np.random.rand(1000, 10)
y = np.random.randint(0, 2, 1000)

model = LogisticRegression()
model.fit(X, y)

# 预测点击概率
pred_proba = model.predict_proba(X)[:, 1]
print(pred_proba[:5])
我的小建议: 在实际项目中,千万别直接用sklearn的默认参数。我习惯把C值(正则化强度的倒数)调小一点,比如0.1或0.01,防止过拟合。另外,特征一定要做归一化,不然权重会乱掉。

4.2 特征交叉:逻辑回归的“阿喀琉斯之踵”

逻辑回归虽然好,但它有一个致命的弱点——无法自动学习特征之间的交互关系

举个例子:假设“男性”喜欢“足球”,“女性”喜欢“美妆”。逻辑回归只能学到“男性”这个特征对点击有正向作用,“足球”这个特征也有正向作用。但它学不到“男性+足球”这个组合的额外加成效果。

为什么会这样?因为逻辑回归是线性模型,它的输出是各个特征的加权和。特征之间是“独立”的,没有交叉项。

怎么解决?

最直接的办法就是手动做特征交叉。比如把“性别=男”和“品类=足球”组合成一个新特征“性别=男_品类=足球”。

# 手动特征交叉示例
import pandas as pd

data = pd.DataFrame({
    'gender': ['male', 'female', 'male'],
    'category': ['football', 'beauty', 'football'],
    'click': [1, 0, 1]
})

# 手动构造交叉特征
data['gender_category'] = data['gender'] + '_' + data['category']
print(data)

但问题来了:如果特征维度很高,比如用户有1万个,物品有10万个,那交叉后的特征维度就是1万×10万=10亿。这谁受得了?

我曾经踩过的坑: 有一次我为了提升模型效果,一口气做了几十个特征的笛卡尔积交叉。结果模型训练时间从半小时变成了三天,而且效果几乎没有提升。后来我才明白,特征交叉不是越多越好,要讲究“有效性”。一般只交叉那些业务上明显有协同作用的特征,比如“用户年龄”和“物品价格区间”。

4.3 FM因子分解机原理

好了,既然手动交叉特征不靠谱,那有没有一种模型能自动学习特征交叉,又不会导致参数爆炸呢?

有,就是FM(Factorization Machine,因子分解机)

FM的核心思想

FM的聪明之处在于:它不再为每个交叉特征单独分配一个权重,而是为每个特征学习一个隐向量(embedding)。两个特征的交叉权重,就等于它们隐向量的点积。

举个例子:

  • 特征“男性”的隐向量是 [0.1, 0.2, 0.3]
  • 特征“足球”的隐向量是 [0.4, 0.5, 0.6]
  • 那么“男性+足球”的交叉权重 = 0.1×0.4 + 0.2×0.5 + 0.3×0.6 = 0.32

这样一来,参数数量就从O(n²)降到了O(nk),其中k是隐向量的维度(通常取10~50)。

FM的数学公式

FM的预测公式长这样:

y(x) = w0 + Σ(wi * xi) + ΣΣ( <vi, vj> * xi * xj )

其中:

  • w0是全局偏置
  • wi是每个特征的线性权重
  • <vi, vj>是特征i和特征j隐向量的点积,代表交叉权重

FM的优势

  1. 自动学习交叉:不需要手动构造特征,模型自己会学。
  2. 泛化能力强:即使两个特征在训练数据中从未同时出现过,只要它们各自与其他特征有交互,FM也能通过隐向量推断出它们的交叉权重。
  3. 计算高效:FM的交叉项可以化简为O(nk)的时间复杂度,比暴力计算O(n²)快得多。
我个人习惯: 在工业级推荐系统中,我通常把FM当作“特征交叉层”来用。比如在深度模型里,先用FM把稀疏特征映射成稠密向量,再输入到DNN中。这样既保留了FM的交叉能力,又利用了DNN的非线性拟合能力。这种结构,业内叫“DeepFM”。

4.4 逻辑回归 vs FM:怎么选?

最后,我简单总结一下这两个模型的适用场景:

对比维度 逻辑回归 FM
特征交叉能力 无(需手动交叉) 强(自动学习)
可解释性 强(权重一目了然) 中等(隐向量需分析)
计算效率 极高
泛化能力 弱(依赖特征工程) 强(能处理稀疏特征)
推荐场景 简单场景、高QPS场景 特征稀疏、需要交叉的场景

嗯,这一章的内容就到这里。逻辑回归和FM,一个是“老黄牛”,一个是“多面手”。搞懂了它们,你就掌握了推荐系统里最基础也最核心的建模思路。下一章,我们聊聊深度学习在推荐中的应用,到时候你会发现,很多复杂模型其实都是FM的“变种”或“升级版”。