一、召回阶段

  1. 特征工程
    • 用户特征:收集用户的基本信息,如年龄、性别、地域、职业等,进行编码处理;分析用户的历史行为数据,包括浏览记录、购买历史、收藏行为、搜索关键词等,提取行为特征,如浏览商品的类别偏好、购买频率、平均消费金额等。
    • 物品特征:获取商品的属性信息,如商品类别、品牌、价格、颜色、尺寸等,对类别和品牌等进行独热编码;统计商品的销量、好评率、差评率、库存等销售特征。
    • 上下文特征:考虑时间维度,如季节、节假日、一天中的时段等,将其转化为可用于计算的特征形式;提取用户访问的设备信息,如手机型号、操作系统版本等,判断用户使用场景。
  2. 输入特征
    • 基于用户特征构建用户画像向量,每个维度代表一种用户属性或行为特征值;将物品特征按照相同的逻辑整理成物品描述向量;上下文特征根据具体场景进行量化或编码后作为辅助输入。
  3. 采用的模型及实现
    • 协同过滤模型
      • 基于用户的协同过滤:通过计算用户之间的相似度(常用皮尔逊相关系数或余弦相似度),找到与目标用户相似的其他用户群体,然后推荐这些相似用户喜欢而目标用户尚未接触的物品。例如,在大规模用户行为数据上,可以使用 Spark 的分布式计算能力来加速相似度计算过程。代码示例(伪代码):
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.recommendation import ALS

# 初始化 Spark 会话
spark = SparkSession.builder.appName("UserCF").getOrCreate()

# 假设已有用户-物品评分数据 df,包含用户 ID、物品 ID 和评分字段
vectorAssembler = VectorAssembler(inputCols=["user_id", "item_id", "rating"], outputCol="features")
df = vectorAssembler.transform(df)

# 使用 ALS 算法训练模型
als = ALS(maxIter=10, regParam=0.01, userCol="user_id", itemCol="item_id", ratingCol="rating", coldStartStrategy="drop")
model = als.fit(df)

# 为目标用户召回物品
user_id = 1  # 示例目标用户 ID
recalled_items = model.recommendForUserSubset(df.filter(df.user_id == user_id), 10)  # 召回 10 个物品
  • 基于物品的协同过滤:计算物品之间的相似度,推荐与用户历史购买或浏览物品相似的其他物品。同样可以借助 Spark 等分布式框架提升计算效率。
  • 基于内容的召回模型:利用物品的文本描述(如商品详情页的文案),通过自然语言处理技术(如 TF - IDF 算法提取关键词特征向量),结合用户的兴趣关键词向量(从用户历史行为文本中提取),计算两者相似度来召回物品。例如,使用 Scikit - learn 的 TfidfVectorizer 实现:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 假设已有商品描述列表 item_descriptions 和用户兴趣关键词列表 user_interests
vectorizer = TfidfVectorizer()
item_features = vectorizer.fit_transform(item_descriptions)
user_interest_feature = vectorizer.transform(user_interests)

# 计算相似度并召回物品
similarities = cosine_similarity(user_interest_feature, item_features)
recalled_items = [np.argmax(similarities[0])]  # 简单示例,召回最相似物品,实际可扩展
  • 热门召回模型:直接按照商品的销量、浏览量等热度指标进行排序,召回前 N 个热门商品。这可以通过简单的数据库查询实现,如在 MySQL 中:
SELECT item_id, sales_volume
FROM items
ORDER BY sales_volume DESC
LIMIT 100; -- 召回 100 个热门商品
  1. 输出目标:从海量商品库中快速筛选出几百到几千个候选商品,这些候选商品应涵盖用户可能感兴趣的不同类型,既要包含个性化推荐的潜在商品,也要有热门商品以保证推荐的多样性和吸引力,作为粗排的输入。

二、粗排阶段

  1. 特征工程
    • 在召回阶段特征基础上,进一步细化用户与候选物品的交互特征,如用户最近一次浏览或购买与候选物品同类别商品的时间间隔;计算候选物品相对于用户历史购买均价的价格差比例;统计候选物品在召回阶段的综合得分(如协同过滤得分、内容相似度得分等加权求和)。
  2. 输入特征
    • 将用户特征向量、候选物品特征向量以及新构建的交互特征向量拼接在一起,形成每个候选物品的综合特征表示,送入粗排模型。
  3. 采用的模型及实现
    • 逻辑回归模型:逻辑回归是常用的简单高效的二分类模型,可将候选物品是否符合用户兴趣看作二分类问题。在 Python 中使用 Scikit - learn 实现:
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import numpy as np

# 假设已有粗排训练数据 X_train(包含上述综合特征)和对应的用户反馈标签 y_train(是否点击或购买,0/1)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)

# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train_scaled, y_train)

# 对新的候选物品进行预测打分
X_test = np.array([...])  # 新的候选物品综合特征向量
X_test_scaled = scaler.transform(X_test)
predicted_scores = model.predict_proba(X_test_scaled)[:, 1]
  • 线性模型的变体:如 FFM(Field - Aware Factorization Machines),它考虑了特征的域信息,在处理高维稀疏特征时表现较好,可使用开源库 xlearn 实现:
import xlearn as xl

# 假设已有训练数据格式化为 libffm 格式,存放在 train_file 和 test_file 中
fm_model = xl.create_ffm()
fm_model.setTrain(train_file)
fm_model.setValidate(test_file)

# 训练模型
fm_model.fit(..., epoch=10)

# 预测
fm_model.predict(test_file, output_prediction)
  1. 输出目标:对召回的候选商品进行初步排序,筛选出前 100 - 500 个商品,这些商品进入精排阶段,排序结果要大致反映出商品对用户的潜在吸引力,降低精排的计算压力。

三、精排阶段

  1. 特征工程
    • 深度挖掘用户行为细节,如用户在浏览商品详情页时的停留时间分布、滚动深度(反映对页面内容的关注程度)、是否将商品加入购物车后又移除等;全方位细化物品特征,包括商品的材质细节、生产工艺、售后服务条款等;结合更多外部数据,如行业趋势数据(某类商品的市场热度增长趋势)、竞品价格动态等,融入特征体系。
  2. 输入特征
    • 将经过复杂处理和扩展的用户特征、物品特征、交互特征以及外部特征整合为高维特征向量,通常维度可达数百甚至上千维,输入到精排模型。
  3. 采用的模型及实现
    • 深度神经网络模型:如多层感知机(MLP),构建多层神经元结构,通过隐藏层自动学习用户与物品复杂的非线性关系。以 TensorFlow 为例:
import tensorflow as tf

# 假设已有精排训练数据 X_train 和对应的真实评分标签 y_train(如用户购买后的评分,1 - 5 分)
model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu', input_shape=(X_train.shape[1],)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

# 编译模型
model.compile(optimizer='adam', loss='mse')

# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32)

# 对新的候选物品进行预测打分
X_test = np.array([...])  # 新的候选物品特征向量
predicted_scores = model.predict(X_test)
  • 树模型及其集成:如梯度提升树(GBDT),它由多个决策树组成,通过不断拟合前一棵树的残差来提升预测精度,对特征的自动筛选和组合能力强,可使用 LightGBM 实现:
import lightgbm as lgb

# 假设已有训练数据 dtrain,以 LightGBM 的数据格式
params = {
    'objective':'regression',
    'metric':'mse'
}
gbm = lgb.train(params, dtrain, num_boost_round=100)

# 对新的候选物品进行预测打分
X_test = np.array([...])  # 新的候选物品特征向量
dtest = lgb.Dataset(X_test)
predicted_scores = gbm.predict(dtest)
  1. 输出目标:对粗排后的商品进行精确排序,确定前 10 - 50 个商品作为推荐列表的核心部分,这些商品的得分要精准反映用户对其的喜好程度和购买可能性,直接影响用户看到的最终推荐结果。

四、重排阶段

  1. 特征工程
    • 重点关注业务规则相关特征,如商品的库存状态(确保推荐商品可购买)、是否为新品(新品推荐策略)、是否有促销活动(促销商品优先展示);考虑推荐结果的多样性,提取候选商品的类别分布特征,计算与已推荐商品的类别相似度;衡量商品的新颖性,如根据商品的上架时间、用户历史浏览覆盖程度等构建新颖性指标。
  2. 输入特征
    • 将精排得到的商品得分以及上述重排相关特征作为输入,综合考量各种因素对推荐顺序的调整需求。
  3. 采用的模型及实现
    • 规则引擎:基于业务规则直接调整推荐顺序,如优先推荐库存充足且有促销的商品,若库存告急则降低其推荐优先级;对于已经推荐过较多同类别商品的情况,降低该类别后续商品的推荐顺序。代码实现较为简单,根据规则编写条件判断语句即可,例如在 Python 中:
# 假设已有精排结果 ranked_items(包含商品 ID 和得分)和商品库存信息 inventory、促销信息 promotions
re_ranked_items = []
for item in ranked_items:
    item_id = item['item_id']
    score = item['score']
    if inventory[item_id] > 0 and item_id in promotions:
        re_ranked_items.insert(0, item)  # 优先插入
    else:
        re_ranked_items.append(item)

# 调整多样性,确保不同类别商品分布合理
categories = [get_category(item['item_id']) for item in re_ranked_items]
for i in range(len(re_ranked_items)):
    if categories.count(categories[i]) > 2:  # 同一类别商品过多
        similar_items = find_similar_items(categories[i], re_ranked_items, 1)  # 找一个不同类别的相似得分商品替换
        if similar_items:
            re_ranked_items[i] = similar_items[0]
  • 基于模型的重排:如行列式点过程(DPP)模型,它能够从概率角度优化推荐集合的多样性,可使用 Python 的 dppy 库实现:
  1. 输出目标:综合考虑业务规则、多样性、新颖性等因素,对精排结果进行优化调整,得到最终推荐给用户的商品列表,该列表既要符合用户喜好,又要满足业务运营需求,提升用户体验和购买转化率。

五、混排阶段

  1. 特征工程
    • 分析不同推荐策略(如个性化推荐、热门推荐、新品推荐、关联推荐等)的历史表现数据,提取策略的有效性指标,如各策略带来的用户点击率、购买转化率、用户留存率等;考虑用户场景特征,如用户是新用户还是老用户、当前所处的页面位置(首页、分类页、详情页等)、访问时间是高峰时段还是低谷时段等,判断不同策略在不同场景下的适用性。
  2. 输入特征
    • 将上述策略表现特征和用户场景特征作为输入,用于决定不同推荐策略在最终推荐列表中的占比和组合方式。
  3. 采用的模型及实现
    • 基于规则的混排:根据业务经验制定固定比例规则,如对于新用户,在首页推荐中热门推荐占 60%、个性化推荐占 40%,以快速吸引新用户并引导其发现感兴趣的商品;对于老用户在浏览分类页时,个性化推荐占 80%、关联推荐占 20%,满足其深度探索需求。代码通过简单的条件判断和比例分配实现,例如在 Python 中:
# 假设已知用户类型 user_type,当前页面 page_type,不同推荐策略结果 result_hot(热门推荐)、result_personal(个性化推荐)等
if user_type == 'new' and page_type == 'home':
    final_result = result_hot[:6] + result_personal[:4]  # 按比例选取
elif user_type == 'old' and page_type == 'category':
    final_result = result_personal[:8] + result_associated[:2]
  • 基于模型的混排:构建多臂老虎机(MAB)模型,如汤普森采样算法,它能够在推荐过程中不断学习不同策略的优劣,动态调整策略的选择概率。以 Python 的 mabwiser 库为例:
from mabwiser.mab import MAB, Policies

# 假设已有不同推荐策略的历史反馈数据 history_data(包含策略选择、用户反馈等),初始化 MAB 模型
mab = MAB(arms=['hot', 'personal', 'associated'], policy=Policies.Thompson)
mab.fit(arms, history_data)

# 实时为用户选择推荐策略并组合结果
user_id = 1
page_type = 'home'
chosen_arm = mab.predict(user_id, page_type)
if chosen_arm == 'hot':
    final_result = result_hot
elif chosen_arm == 'personal':
    final_result = result_personal
else:
    final_result = result_associated
  1. 输出目标:将多种推荐策略的结果进行合理混合,生成最适合用户当前场景的推荐列表,兼顾用户个性化需求、业务推广需求以及整体推荐效果的优化,提高用户满意度和电商平台的运营效益。

业界最佳实践案例:亚马逊的推荐系统是电商领域的标杆,其召回阶段融合了多种协同过滤和基于内容的方法,利用海量用户数据挖掘用户兴趣;粗排采用高效的线性模型快速筛选;精排运用深度神经网络结合大量特征精准预测用户偏好;重排依据业务规则确保商品可购买性和多样性;混排根据用户不同阶段(新用户、老用户)和场景灵活调配推荐策略,为用户提供高度个性化且高效转化的推荐服务,推动了亚马逊电商业务的持续增长。

以上案例涵盖了电商平台推荐系统从理论到实践的各个环节,在实际搭建过程中,还需根据平台自身的数据规模、业务特点、技术架构等因素进行不断优化和调整。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐