实战项目

第32课:推荐基础

协同过滤、矩阵分解、基于内容推荐、冷启动、评估方法

1. 推荐类型

协同过滤(行为相似度)、基于内容(特征相似度)、混合推荐

2. 协同过滤

User-Based: 找相似用户→推荐其喜好。Item-Based: 找相似物品→Amazon经典。

问题:稀疏性、冷启动、可扩展性

3. 矩阵分解

R ≈ U×Vᵀ,SGD/ALS优化。加偏置:r̂=μ+bᵤ+bᵢ+uᵀv

ALS适合隐式反馈大规模数据。

4. 冷启动

新用户:热门推荐/引导选择/注册信息。新物品:基于内容/探索-利用。

5. 评估

离线:RMSE/Precision@K/NDCG@K/覆盖率。在线:A/B测试

Python代码实现与验证

💡 代码说明:以下代码使用 Python / Scikit-learn 实现,已实机运行验证。

完整代码


import numpy as np
from sklearn.metrics import mean_squared_error
np.random.seed(42)

n_users, n_items = 50, 30
R = np.zeros((n_users, n_items))
for u in range(n_users):
    rated = np.random.choice(n_items, np.random.randint(5,15), replace=False)
    R[u,rated] = np.random.randint(1,6,len(rated))
print("评分矩阵: {} 稀疏度: {:.2%}".format(R.shape, np.mean(R==0)))

print("\n=== 矩阵分解(SGD) ===")
k = 10; U = np.random.normal(0,0.1,(n_users,k)); V = np.random.normal(0,0.1,(n_items,k))
lr = 0.01; reg = 0.1; mask = R > 0

for epoch in range(100):
    for u in range(n_users):
        for i in range(n_items):
            if R[u,i] > 0:
                err = R[u,i] - U[u]@V[i]
                U[u] += lr*(err*V[i]-reg*U[u])
                V[i] += lr*(err*U[u]-reg*V[i])

R_pred = U@V.T
rmse = np.sqrt(mean_squared_error(R[mask], R_pred[mask]))
print("MF RMSE: {:.4f}".format(rmse))

u_test = 0
unrated = np.where(R[u_test]==0)[0]
scores = R_pred[u_test,unrated]
top5 = unrated[np.argsort(scores)[-5:]][::-1]
print("用户0 Top-5推荐: {} 预测评分: {}".format(top5, R_pred[u_test,top5].round(2)))

运行结果

评分矩阵: (50, 30) 稀疏度: 66.47% === 矩阵分解(SGD) === MF RMSE: 0.4139 用户0 Top-5推荐: [ 7 21 5 19 18] 预测评分: [4.72 4.59 4.37 3.9 3.75]
✅ 验证通过

深入理解:从项目到产品的关键步骤

ML项目成功的关键因素

  1. 定义清晰的目标:业务指标 > ML指标(提升AUC不是目的,提升收入才是)
  2. 数据质量:Garbage in, garbage out。花80%时间在数据上是正常的
  3. 简单优先:简单基线 > 复杂模型(如果简单就够了)
  4. 持续监控:模型上线不是终点,漂移检测和重训练是必须的
  5. 沟通能力:能向非技术人解释模型为什么做某个预测

项目时间分配建议

阶段时间占比关键产出
问题定义10%明确的评估指标和成功标准
数据获取/清洗30%干净可用的数据集
特征工程25%强特征集
模型训练/调优20%最优模型
评估/部署15%上线模型+监控方案

从竞赛到生产的差距

Kaggle竞赛和实际生产的差异:

ML系统技术债

D. Sculley等人在2015年的经典论文中指出,ML系统中只有很小一部分是实际的ML代码,其余都是胶水代码、配置、数据管道、监控等。隐藏的技术债包括:

项目复盘与进阶路线

5个项目的核心收获

  1. 房价预测:回归全流程——EDA→特征工程(对数变换+交叉特征)→多模型比较→融合。关键教训:特征工程比模型选择更重要,对数变换处理右偏目标是标准操作。
  2. 欺诈检测:极度不平衡——SMOTE/类别权重/异常检测框架。关键教训:AUC-PR比AUC-ROC更有意义,监督方法远优于无监督方法。
  3. 客户分群:无监督业务应用——RFM+聚类+画像解读。关键教训:业务可解释性比聚类指标重要,K值选择要考虑运营成本。
  4. 推荐基础:推荐系统经典算法——协同过滤+矩阵分解。关键教训:冷启动是最难的问题,简单方法(SVD)常常足够好。
  5. 文本分类:NLP传统方法——TF-IDF+NB/SVM。关键教训:预处理影响巨大,线性SVM在文本上通常最好。

从竞赛到生产的差距

维度竞赛生产
数据已清洗CSV多源异构、实时流
目标单一指标多目标(精度+延迟+成本)
模型复杂集成简单高效、可维护
评估离线CV在线A/B测试
部署不涉及Docker/K8s/服务化
监控不涉及漂移检测+重训练

继续学习路线

推荐学习资源

类别资源特点
教材ISLR (Python版)统计学习入门经典
教材ESL统计学习圣经(进阶)
课程Andrew Ng ML最佳入门课
课程Stanford CS229更数学化
实践Kaggle Learn动手学ML
文档Scikit-learn最优秀的ML库文档

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

📝 课后练习

  1. 实现User-Based协同过滤
  2. 实现Item-Based协同过滤
  3. 用SGD实现矩阵分解
  4. 分析冷启动问题及解决方案
  5. 比较不同推荐算法的离线评估指标
🎁
推荐架构师
完成推荐系统基础项目