
针对用户学习行为(课程观看时长、作业完成情况)的个性化课程推荐,采用混合推荐模型(内容推荐+协同过滤),通过用户行为特征工程(学习投入度、掌握程度)与课程内容特征(知识点、难度)构建特征矩阵,结合模型互补性解决冷启动与数据稀疏性问题,并融入工程优化(稀疏存储、实时更新)与业务指标评估(点击率、课程完成率),提升模型可落地性与业务价值。
老师会先解释数据特征工程:用户学习行为转化为机器可理解的特征,比如“课程观看时长”通过“学习投入度”体现(计算时长与用户平均观看时长的比值,反映用户对该课程的专注程度);“作业完成情况”转化为“掌握程度”(完成率除以100,量化用户对课程知识点的掌握水平)。课程内容特征则提取知识点标签(如“微积分基础”“Python编程”)、难度等级(如“入门”“进阶”)、关联课程(如“课程A是课程B的先修课”)等,通过TF-IDF或Word2Vec将文本标签向量化(比如“微积分基础”转化为[0.5, 0.3, 0.2]的向量)。
模型选择方面,协同过滤基于用户历史行为(如用户A看课程X时长长、作业完成好,推荐给与A行为相似的用户B),能发现隐藏关联但存在冷启动(新用户/新课程无历史数据);内容推荐基于课程内容特征(如课程X和Y知识点相同),能解决冷启动但可能因用户行为稀疏导致推荐效果差;混合推荐结合两者优势——内容推荐解决协同过滤的冷启动(新课程用内容特征推荐),协同过滤解决内容推荐的稀疏性(用户行为不足时用相似用户行为),提升整体推荐效果。
| 模型类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 协同过滤 | 基于用户/物品的相似性,推荐与用户历史行为相似的用户喜欢的物品 | 依赖用户行为数据,能发现隐藏关联,但冷启动问题明显 | 用户行为丰富(如观看、购买记录多) | 新用户/新课程无历史数据时推荐效果差 |
| 内容推荐 | 基于物品内容特征(如文本、标签),推荐内容相似的物品 | 依赖物品内容特征,无需用户历史 | 课程内容特征明确(如知识点、难度) | 内容特征不充分时推荐效果有限 |
| 混合推荐 | 结合协同过滤与内容推荐,互补优势 | 两者结合,提升推荐效果,但模型复杂度增加 | 两者数据都有(用户行为+内容特征) | 需平衡模型权重,避免过拟合 |
伪代码示例(包含特征工程、混合模型训练、推荐逻辑及工程优化):
# 数据预处理
def preprocess_data(user_behavior, course_info):
user_features = user_behavior[['user_id', 'course_id', 'watch_duration', 'assignment_completion']]
course_features = course_info[['course_id', 'knowledge_tags', 'difficulty']]
return user_features, course_features
# 特征工程
def feature_engineering(user_features, course_features):
# 用户行为特征:标准化+时间衰减
user_features['learning_intensity'] = user_features['watch_duration'] / user_features['watch_duration'].mean()
user_features['master_rate'] = user_features['assignment_completion'] / 100
# 时间衰减:近期行为权重更高(假设最近7天行为权重为1,之前每天衰减0.9)
user_features['time_decay'] = user_features['watch_duration'] * (0.9 ** (7 - user_features['days_since_last_action']))
# 课程内容特征:标签向量化(TF-IDF)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
tag_vectors = tfidf.fit_transform(course_features['knowledge_tags'].apply(lambda x: ' '.join(x.split(',')))) # 假设标签用逗号分隔
course_features['tag_vector'] = tag_vectors.toarray()
return user_features, course_features
# 混合模型训练(协同过滤+内容推荐)
def train_hybrid_model(user_features, course_features):
# 协同过滤矩阵(用户-课程,值=学习投入度)
user_item_matrix = user_features.pivot(index='user_id', columns='course_id', values='learning_intensity')
# 内容推荐矩阵(课程-标签向量,值=TF-IDF权重)
course_content_matrix = course_features[['course_id', 'tag_vector']]
# 加权融合(假设协同过滤权重0.6,内容推荐权重0.4)
hybrid_matrix = 0.6 * user_item_matrix + 0.4 * course_content_matrix
# 稀疏矩阵存储(降低存储成本)
hybrid_matrix = hybrid_matrix.tocsr() # CSR格式存储稀疏矩阵
return hybrid_matrix
# 推荐逻辑(实时更新+排序学习)
def recommend_courses(user_id, hybrid_matrix, top_n=5):
# 获取用户已看课程
user_courses = user_features[user_features['user_id'] == user_id]['course_id'].values
# 计算未看课程得分(取均值,考虑时间衰减)
unseen_courses = set(hybrid_matrix.columns) - set(user_courses)
scores = hybrid_matrix[unseen_courses].mean(axis=1) # 每个未看课程的平均得分
# 排序输出Top N
top_courses = scores.sort_values(ascending=False).head(top_n).index
return top_courses
# 实时更新(在线学习模型示例)
def online_update(user_features, hybrid_matrix):
# 假设用FTRL算法在线更新用户-物品矩阵
# 新增用户行为后,更新对应行
new_user_row = user_features[user_features['user_id'] == new_user_id].pivot(index='user_id', columns='course_id', values='learning_intensity')
hybrid_matrix += new_user_row.tocsr() # 增量更新
return hybrid_matrix
各位面试官好,针对用户学习行为(如课程观看时长、作业完成情况)的个性化课程推荐,我的思路是采用混合推荐模型(内容推荐+协同过滤),通过用户行为特征工程和课程内容特征工程,解决冷启动与数据稀疏性问题,并融入工程优化提升可落地性。
首先,数据特征工程方面:用户行为转化为“学习投入度”(观看时长/均值)和“掌握程度”(完成率/100),课程内容提取知识点标签、难度等,用TF-IDF向量化;模型选择上,协同过滤基于用户行为相似性(比如用户A看课程X时长长,推荐给行为相似的B),内容推荐基于课程内容相似性(课程X和Y知识点相同),混合推荐结合两者——内容推荐解决协同过滤的冷启动(新课程用内容特征推荐),协同过滤解决内容推荐的稀疏性(用户行为不足时用相似用户行为);工程上,用稀疏矩阵存储用户-物品矩阵(降低存储成本),实时更新用在线学习模型(FTRL),评估用A/B测试(对照组用传统推荐,实验组用混合模型,指标是点击率、课程完成率,周期1周);这样既利用用户行为的历史关联,又利用课程内容的知识关联,提升推荐准确率。