尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于Spark ALS的短视频推荐系统搭建与实现

基于Spark ALS的短视频推荐系统搭建与实现 基于Spark的个性化短视频推荐系统是计算机毕业设计里综合性较强的一类题目。它同时涉及大数据存储、分布式计算、Web 后端和推荐算法恰好覆盖 Hadoop、Spark、Django、Python 四类技术栈。很多同学拿到题目后的第一反应是去找源码但源码一旦跑不起来反而比空手更难答辩。这篇文章按照一条可运行的毕设主线来拆解从环境搭建、数据流设计、ALS 离线推荐、Django 接口再到运行验证和排错清单最终形成一个能讲清楚、能演示、能提交的闭环。1. 先搞清楚推荐系统为什么是 Hadoop Spark Django 的组合1.1 短视频推荐系统至少包含四个子系统一套完整的短视频推荐系统并不是只写一个推荐算法那么简单。实际运行时要区分四块内容用户端负责展示视频列表、上报用户行为。行为采集记录播放、暂停、点赞、评论、分享、完播率等行为。离线计算从历史行为中统计特征、训练推荐模型、生成每个用户的候选视频列表。在线服务根据当前用户请求从模型结果或缓存中取出视频列表并返回给前端。在毕业设计场景中用户端可以做成简单的 Web 页面也可以只预留 Django 接口行为采集由 Django 接收前端请求后写入数据库离线计算由 Spark 完成在线服务仍然由 Django 提供。这样划分的好处是每层职责清楚代码结构和答辩思路都容易讲明白。1.2 Spark 解决计算Hadoop 解决存储Django 解决业务服务很多初学者会把 Spark 和 Hadoop 混在一起。更准确的理解是Hadoop HDFS 解决“海量原始数据放哪里”的问题。Spark 解决“海量数据怎么算”的问题。Django 解决“推荐结果怎么给前端”的问题。Python 负责把 Spark 的机器学习 API 和数据预处理逻辑串起来。短视频场景的数据量虽然单机也能处理但毕业设计里使用 Hadoop 和 Spark 的意义在于数据文件可以统一放在 HDFS 上Spark 可以并行读取和训练Django 不直接参与分布式计算。这样既避免 Django 进程被长时间占用也方便后期把推荐任务做成定时调度。Django 不适合直接做 ALS 矩阵分解因为 ALS 需要大量迭代计算纯 Python 在百万级行为数据上会非常慢。Spark 的 MLlib 已经封装了 ALS 实现可以直接读取 DataFrame、训练模型并批量输出推荐结果。反过来Spark 也不适合直接作为业务接口层暴露给前端因为它需要提交任务、启动 JVM、维护 executor跨网络调用复杂且不稳定。1.3 为什么推荐召回阶段先选 ALS短视频项目没有电商那样明确的“评分”数据用户不会给视频打 1 到 5 星。常见的做法是把用户行为转换成隐式反馈例如点击1 分观看超过 30 秒2 分点赞3 分评论4 分转发5 分完播5 分ALS 的implicitPrefsTrue模式专门处理这类隐式反馈数据。它不会要求每个用户都对每个视频有评分而是通过用户历史行为矩阵学习用户向量和物品向量再计算用户对未接触视频的偏好分。相比深度推荐模型ALS 在毕业设计中更容易解释、训练更快、参数更少。答辩时可以从“交替最小二乘”原理、用户向量和物品向量内积、隐式反馈置信度几个角度展开。它虽然不是最高级的方案但足够作为一个闭环系统的核心推荐算法。2. 环境准备Java、Hadoop、Spark、Django 的安装顺序不能乱2.1 版本选型先定下来否则后面全是兼容性报错推荐系统依赖涉及很多底层组件。版本不统一是最常见的跑不起来原因。下面给出一个在毕业设计场景中较常见的组合落地前要结合自己电脑的系统和网络环境确认具体版本。组件常见版本组合说明JDK8 或 11Hadoop 和 Spark 都依赖 Java先用java -version确认Hadoop3.3.x用于提供 HDFS 存储和伪分布式环境Spark3.3.x 或 3.4.x注意 Spark 和 Scala 版本是否匹配建议用自带 Scala 的预编译包Python3.8 至 3.10Django 和 PySpark 对版本要求不同避免使用过新版本Django4.2.x LTS长期支持版本文档多适合毕业设计MySQL5.7 或 8.0Django 主库保存业务数据和推荐结果Redis6.x 或 7.x可选用于缓存推荐接口结果如果原始项目资料没有明确给出依赖版本最好先看项目里的requirements.txt、pom.xml或build.sbt。不要直接安装最新版因为 Spark 和 Hadoop 对 Java 版本非常敏感。2.2 安装 Java 并配置环境变量Hadoop 和 Spark 都是 JVM 系组件第一步要装 JDK。Linux 或 macOS 环境下可以先更新软件源再安装 OpenJDKsudo apt update sudo apt install openjdk-8-jdk java -version安装完成后配置JAVA_HOME。打开用户环境变量文件vim ~/.bashrc追加以下内容export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH执行source ~/.bashrc后用echo $JAVA_HOME确认路径。一个常见坑是Hadoop 安装时扫描不到 JDK原因是JAVA_HOME没有写入$HOME/.bashrc或者当前用户不是 root 却没有读取权限。2.3 搭建 Hadoop 伪分布式环境下载 Hadoop 二进制包后解压到固定目录例如~/hadoop。先设置 Hadoop 环境变量export HADOOP_HOME~/hadoop export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATHHadoop 伪分布式需要修改etc/hadoop/core-site.xml和hdfs-site.xml。核心配置如下!-- core-site.xml -- configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/hadoop/data/tmp/value /property /configuration!-- hdfs-site.xml -- configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/home/hadoop/data/name/value /property property namedfs.datanode.data.dir/name value/home/hadoop/data/data/value /property /configuration注意dfs.replication在伪分布式环境必须设为 1否则副本数超过节点数。设置完成后先格式化 NameNodehdfs namenode -format start-dfs.sh jpsjps输出中应该能看到NameNode、DataNode和SecondaryNameNode三个进程。如果没有DataNode多半是格式化目录不对或者hadoop.tmp.dir下的历史数据冲突。2.4 安装 Spark 并验证 PySparkSpark 可以下载预编译版本不需要单独编译 Scala。下载后解压到~/spark配置export SPARK_HOME~/spark export PATH$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH export PYSPARK_PYTHONpython3先不要启动集群直接用本地模式验证环境pyspark --master local[4]进入 PySpark Shell 后执行from pyspark.sql import SparkSession spark SparkSession.builder.master(local[4]).appName(check).getOrCreate() df spark.createDataFrame([(1, a), (2, b)], [id, val]) df.show()如果能在终端看到两行数据说明 Spark 和 Python 的适配没有问题。后面需要提交完整任务时再启动 Spark Standalonestart-master.sh start-worker.sh spark://localhost:70772.5 创建 Django 虚拟环境Django 建议安装到独立虚拟环境避免和系统 Python 包冲突。先创建目录mkdir video-recommend-system cd video-recommend-system python -m venv venv source venv/bin/activate pip install --upgrade pip pip install django4.2.* pymysql django-redis djangorestframeworkWindows 环境下激活命令是venv\Scripts\activate。安装完确认 Django 版本python -m django --version django-admin startproject config .这里的config只是 Django 项目配置文件所在目录具体目录结构在第三章展开。启动 Django 开发服务python manage.py migrate python manage.py runserver 0.0.0.0:8000浏览器访问http://127.0.0.1:8000/能看到 Django 默认页面就说明后端骨架已经跑通。3. 整体架构从点击日志到推荐结果的数据流3.1 数据流主线推荐系统的整体数据流可以概括为一条主线前端用户操作 - Django 行为上报接口 - MySQL 用户行为表 - 定时导出 JSON 或 CSV 到 HDFS - Spark 清洗和特征构造 - ALS 模型训练 - 为全部用户生成 TopN 推荐 - 推荐结果写回 MySQL 或 Redis - Django 推荐接口读取结果返回给前端。在离线场景中模型不需要每秒钟都训练。常见做法是每天凌晨跑一次推荐任务生成当天的候选集白天用户请求时直接查询结果。这样 Spark 任务和在线接口可以解耦即使模型任务失败前端也能用前一天结果兜底。3.2 核心表结构设计毕设项目至少要设计四张表用户表、视频表、用户行为表、推荐结果表。表结构可以简化但字段要能支持推荐任务。表名核心字段作用usersuser_id, nickname, age, gender, city用户信息videosvideo_id, title, category_id, duration, upload_time视频内容信息user_actionsid, user_id, video_id, action_type, watch_progress, score, action_time用户行为记录recommend_resultid, user_id, video_list, update_time离线推荐结果用户行为表是训练数据来源。action_type字段常见的值有click、play、like、comment、share、finish。score字段建议在写入时就计算好例如点击记为 1点赞记为 3评论记为 4分享和完播记为 5。MySQL 建表语句示例CREATE TABLE user_actions ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, video_id bigint(20) NOT NULL, action_type varchar(20) NOT NULL DEFAULT play, watch_progress int(11) DEFAULT NULL COMMENT 观看进度0到100, score float NOT NULL DEFAULT 1.0, action_time datetime NOT NULL, PRIMARY KEY (id), KEY idx_user (user_id), KEY idx_video (video_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;在 HDFS 上可以把行为数据导出成 JSON 文件每行一条用户行为方便 Spark 读取{user_id: 1, video_id: 100, action_type: play, score: 1.0, action_time: 2024-12-01 10:10:00} {user_id: 1, video_id: 101, action_type: like, score: 3.0, action_time: 2024-12-01 10:12:00}3.3 推荐系统项目目录结构实际项目中Django 代码和 Spark 任务建议分开不要混在同一个views.py里。一个较清晰的目录如下video-recommend-system/ ├── config/ # Django 项目配置 │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── apps/ │ ├── recommend/ # 推荐接口 │ ├── behavior/ # 用户行为上报 │ └── users/ # 用户管理 ├── rec_engine/ │ ├── train_als.py # Spark 训练任务 │ ├── gen_recall.py # TopN 召回任务 │ ├── export_data.py # 从 MySQL 导出训练数据 │ └── requirements.txt ├── scripts/ │ ├── mock_data.py # 生成模拟数据 │ └── run_offline.sh # 离线任务调度脚本 ├── data/ │ ├── user_actions.json │ └── videos.json ├── sql/ │ └── init.sql ├── manage.py └── README.md这个结构的好处是Django 代码和 Spark 任务依赖不同rec_engine可以单独跑不会因为 Django 配置错误影响离线训练。4. 核心实现用 Spark ALS 训练离线推荐模型4.1 生成模拟用户行为数据训练推荐模型之前先准备一份模拟数据。数据规模不用太大1000 个用户、500 个视频、10 万条行为已经足够跑通流程。下面是生成 JSON 行为数据的最小脚本import json import random import datetime random.seed(42) users list(range(1, 1001)) videos list(range(1, 501)) actions [click, play, like, comment, share, finish] score_map { click: 1.0, play: 1.0, like: 3.0, comment: 4.0, share: 5.0, finish: 5.0, } rows [] for _ in range(100000): user_id random.choice(users) video_id random.choice(videos) action_type random.choice(actions) row { user_id: user_id, video_id: video_id, action_type: action_type, score: score_map[action_type], action_time: datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S), } rows.append(row) with open(data/user_actions.json, w, encodingutf-8) as f: for row in rows: f.write(json.dumps(row, ensure_asciiFalse) \n)实际毕设数据可以从公开数据集改造也可以把用户点击日志按行导入 MySQL。关键在于字段中必须有user_id、video_id和行为分值。4.2 读取 HDFS 数据并做特征加工Spark 训练任务的第一步是创建SparkSession然后读取 HDFS 上的 JSON 文件。from pyspark.sql import SparkSession from pyspark.ml.recommendation import ALS from pyspark.sql.functions import col spark SparkSession.builder \ .appName(ShortVideoALS) \ .config(spark.sql.shuffle.partitions, 8) \ .getOrCreate() df spark.read.json(hdfs://localhost:9000/data/rec/user_actions.json) train_df df.select( col(user_id).cast(int), col(video_id).cast(int), col(score).cast(float) ).na.drop() train_df.printSchema() train_df.show(5, truncateFalse)这里执行了两个关键操作把user_id、video_id、score转换为数值类型因为 ALS 不接受字符串 ID。使用na.drop()丢弃空值避免训练时报错。如果 CSV 或 JSON 中存在重复行为推荐先按用户和视频分组汇总例如同一天多次点击同一视频时取最高分或分数累加from pyspark.sql.functions import max as spark_max train_df df.groupBy(user_id, video_id) \ .agg(spark_max(score).alias(score))4.3 ALS 参数为什么这样设ALS 模型训练的核心参数直接影响召回效果。下面列出毕设中最常用的几个参数参数默认值作用调参建议rank10用户向量和物品向量的维度维度越大表达能力越强但更容易过拟合maxIter10最大迭代次数过大无明显收益15 到 20 即可regParam0.1正则化系数数据稀疏时可以调大到 0.2 到 0.5implicitPrefsFalse是否使用隐式反馈短视频场景建议设为 Truealpha40隐式反馈置信度参数行为次数少时调低行为密集时调高coldStartStrategynan冷启动处理策略设为drop避免预测时出现空值训练代码als ALS( userColuser_id, itemColvideo_id, ratingColscore, rank20, maxIter15, regParam0.1, implicitPrefsTrue, alpha40, coldStartStrategydrop ) model als.fit(train_df)implicitPrefsTrue后ALS 不再把score当作显式评分而是把数值理解为“观察到的置信度”。分数越高代表用户和物品的关联越强。4.4 生成 TopN 召回并写回 MySQL模型训练完成后可以用recommendForAllUsers为数据集内所有用户生成推荐列表from pyspark.sql.functions import explode recs model.recommendForAllUsers(20) recs recs.select( col(user_id), explode(col(recommendations)).alias(rec) ).select( col(user_id), col(rec.video_id).alias(video_id), col(rec.rating).alias(rating) ) recs.write.mode(overwrite).parquet(hdfs://localhost:9000/data/rec/rec_output) # 抽样查看结果 recs.show(30, truncateFalse)输出示例------------------------- |user_id|video_id|rating | ------------------------- |1 |168 |2.4517899 | |1 |327 |2.1472329 | |2 |12 |1.9528706 | -------------------------写回 MySQL 时建议先写到 HDFS 临时目录再用 Spark 的 JDBC 写入功能同步到数据库。如果直接在 Spark 读取 MySQL 也要保证驱动版本匹配recs.write \ .mode(overwrite) \ .jdbc( urljdbc:mysql://localhost:3306/video_rec?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai, tablerecommend_result_detail, properties{user: root, password: your_password} )生产环境更常见的做法是只把 TopN 列表按用户聚合后写入 Redis避免把每条推荐明细都存 MySQL。5. Django 后端推荐接口和行为上报5.1 推荐接口返回什么Django 不需要直接调用 Spark。推荐结果已经由离线任务生成到数据库或 Redis在线接口只需要读取。接口设计如下接口请求方式参数返回说明/api/v1/recommendGETuser_id返回该用户的 TopN 视频列表/api/v1/behaviorPOSTJSON 行为数据保存用户行为推荐接口的views.py可以这样实现import json from django.http import JsonResponse from django.views.decorators.http import require_GET from django.core.cache import cache from .models import RecommendResult require_GET def recommend_videos(request): user_id request.GET.get(user_id) if not user_id or not user_id.isdigit(): return JsonResponse( {code: 400, message: user_id is required}, status400, ) user_id int(user_id) cache_key frec:{user_id} video_list cache.get(cache_key) if video_list is None: result RecommendResult.objects.filter(user_iduser_id).first() video_list result.video_list if result else [] cache.set(cache_key, video_list, 60 * 10) return JsonResponse({ code: 0, user_id: user_id, videos: video_list, })这里使用 Redis 缓存的原因在于推荐结果每天更新一次如果每个请求都查询 MySQL高并发时会有压力。缓存 10 分钟过期离线任务更新结果后接口最多 10 分钟后读到最新数据。5.2 行为上报接口前端上报用户行为时接口需要区分动作类型、观看进度和当前用户。最简洁的实现是请求体采用 JSONimport json from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST from django.utils import timezone from .models import UserAction csrf_exempt require_POST def report_action(request): try: payload json.loads(request.body) except json.JSONDecodeError: return JsonResponse({code: 400, message: invalid json}, status400) user_id payload.get(user_id) video_id payload.get(video_id) action_type payload.get(action_type) watch_progress payload.get(watch_progress, 0) if not user_id or not video_id or not action_type: return JsonResponse({code: 400, message: missing field}, status400) UserAction.objects.create( user_iduser_id, video_idvideo_id, action_typeaction_type, watch_progresswatch_progress, score_score_map(action_type), action_timetimezone.now(), ) return JsonResponse({code: 0, message: ok})_score_map是动作到分值的映射函数。在真实项目中行为上报会写入消息队列由消费者异步落库避免刷接口时阻塞正常业务。毕设阶段直接写 MySQL 可以接受但要在答辩时说明你知道异步才是生产方案。5.3 跨域、缓存、空结果兜底前后端分离时Django 需要处理跨域问题。最简单的方式是使用django-cors-headerspip install django-cors-headers然后在settings.py中配置INSTALLED_APPS [ ... corsheaders, ] MIDDLEWARE [ corsheaders.middleware.CorsMiddleware, ... ] CORS_ALLOWED_ORIGINS [ http://localhost:5173, http://127.0.0.1:5173, ]空结果兜底非常重要。新用户没有历史行为ALS 无法生成推荐此时接口不应该返回空列表而应该返回热门视频。可以在推荐接口中加一段逻辑if not video_list: video_list list( Video.objects.filter(status1) .order_by(-play_count) .values_list(id, flatTrue)[:30] )这样新用户也能看到内容演示时也不会出现空白页面。6. 运行验证把整条链路完整跑通6.1 检查 Hadoop 和 Spark 状态推荐任务跑之前先确认基础组件状态。检查顺序如下jps预期能看到NameNode、DataNode、SecondaryNameNode。如果运行了 Spark Standalone还会有Master和Worker进程。如果没有启动先启动 HDFSstart-dfs.sh再启动 Sparkstart-master.sh start-worker.sh spark://localhost:7077浏览器访问 Spark Web UI 地址http://localhost:8080/能看到一个存活 Worker。6.2 执行推荐任务和预期输出先把模拟数据上传到 HDFShdfs dfs -mkdir -p /data/rec hdfs dfs -put data/user_actions.json /data/rec/然后提交 Spark 任务cd rec_engine spark-submit \ --master local[4] \ --driver-memory 2g \ --executor-memory 2g \ train_als.py正常执行时日志中会看到command run finished并输出推荐结果抽样表。本次任务完成后检查 HDFS 输出文件hdfs dfs -ls /data/rec/rec_output如果输出目录存在且有part-00000文件说明离线任务成功。这里要注意Spark SQL 默认输出是目录而不是单个文件不要用直接查看常规文件的方式检查。6.3 Django 接口测试启动 Django 服务python manage.py runserver 0.0.0.0:8000在另一个终端用curl测试推荐接口curl http://127.0.0.1:8000/api/v1/recommend?user_id1预期返回{ code: 0, user_id: 1, videos: [168, 327, 12, 45, 201] }再测试行为上报接口curl -X POST \ -H Content-Type: application/json \ -d {user_id: 1, video_id: 88, action_type: like, watch_progress: 90} \ http://127.0.0.1:8000/api/v1/behavior返回{code: 0, message: ok}表示上报成功。到这一步从行为数据、离线模型到在线接口的闭环已经完整。7. 常见问题清单现象、根因、处理7.1 常见问题对照表下面整理毕业设计过程中最常遇到的五类问题每个问题都按照现象、原因、检查方式、处理建议展开。问题现象常见原因检查方式处理建议Hadoop 启动后看不到 DataNode格式化目录和启动进程使用不同临时目录查看ls/hadoop/data目录时间停止进程清空hadoop.tmp.dir重新格式化并启动Spark 任务一直卡在连接 Master使用集群模式但 Master 没启动或 URL 错误查看logs/spark-hadoop-org.apache.spark.deploy.master*.out改用local[4]或先启动 MasterALS 训练报错empty dataset输入数据全被过滤或字段类型不对打印train_df.count()和schema检查 JSON 导入路径、字段名和数据类型转换Django 查询中文乱码MySQL 表使用 latin1连接串没有指定 utf8执行SHOW CREATE TABLE user_actions;建表时使用utf8mb4连接 URL 增加characterEncodingutf8推荐接口一直返回空列表离线任务没有写入结果或缓存了空列表查 Redis keyrec:1查 recommend_result 表先清空 Redis 中的空缓存再确认离线写入任务7.2 排错顺序建议遇到整套系统跑不通时不要先怀疑推荐算法有问题。按下面顺序排查输入数据是否正确是否有用户行为、数值是否为空。路径和文件名是否正确HDFS 路径、Spark 脚本参数、Django 模型名。依赖版本是否匹配JDK、Spark、Hadoop、PySpark 和 Django 版本。配置是否生效环境变量、配置文件、缓存配置。权限、端口、网络是否正常9000、8080、8000 端口占用或防火墙。日志是否出现明确异常重点看Caused by后面的内容。数据集规模和业务逻辑是否有问题用户量太少时 ALS 召回效果会不稳定。一个很常见的坑是清空了缓存列表。某些缓存库会把空列表缓存下来导致离线任务更新后接口仍然返回空。推荐在写入空结果时设置更短的过期时间或者在离线任务结束后显式删除对应 key。7.3 调参时最常见的三个坑第一个坑是rank过高。毕设数据只有几千个用户和视频时rank设置到 100 以上会让模型过拟合训练速度慢且推荐结果不稳定。建议从 10 到 20 开始。第二个坑是忽略coldStartStrategy。默认情况下 ALS 会对没有训练样本的新用户或新物品产生 NaN 评分写回数据库时会失败。设置coldStartStrategydrop可以避免这类异常。第三个坑是隐式反馈打分不合理。如果所有行为的score都为 1 分模型只区分是否发生交互无法区分喜欢和随手划走。要保留不同行为的数值差异。8. 毕业设计交付和组织最佳实践8.1 源码、文档和演示视频怎么组织毕业设计不是只交代码还需要让老师在短时间内看懂系统。建议按以下材料组织材料类型内容要求需求文档系统背景、功能清单、角色分析、业务流程数据库设计文档ER 图、表结构、字段说明运行说明环境版本、启动步骤、演示账号核心算法说明ALS 原理、参数选择、效果示意图演示视频跑通数据流、展示接口返回、说明冷启动兜底答辩 PPT技术架构、数据流、难点、创新点README.md中必须写清楚启动顺序1. 启动 Hadoop: start-dfs.sh 2. 启动 Spark: start-master.sh, start-worker.sh 3. 初始化 MySQL: source sql/init.sql 4. 导出模拟数据: python scripts/mock_data.py 5. 上传 HDFS: hdfs dfs -put data/user_actions.json /data/rec/ 6. 提交 Spark: spark-submit --master local[4] rec_engine/train_als.py 7. 启动 Django: python manage.py runserver8.2 代码评审时可执行的检查清单写完代码后不要直接打包提交。按下面的清单检查一遍[ ] 数据库密码是否正确写死在代码里生产环境应改为环境变量。[ ] HDFS 路径是否全部硬编码建议抽成配置文件。[ ] Spark 任务是否在主函数中包含了训练和写入逻辑建议拆分成独立函数。[ ] Django 接口是否对参数做了类型校验和异常处理。[ ] 行为上报接口是否做了幂等和防刷限制至少要有用户 ID 校验。[ ] 缓存实现是否避免缓存空列表。[ ] README 是否包含版本号和启动命令。[ ] 是否存在不必要的日志输出例如在任务中打印全量训练数据。对毕设来说代码质量不要求达到工业级但至少要体现“我知道生产环境应该怎样做”。比如在答辩时说“这里的配置应该外置到环境变量当前为了演示方便才写在文件里”比被动暴露问题更好。8.3 从毕设到真实系统的差距离线 ALS 推荐适合快速演示但真实短视频平台通常要解决三个额外问题实时性用户刚看完一个视频系统需要立刻更新推荐结果而不是等第二天的离线任务。冷启动新内容没有行为数据需要结合视频标签、封面、作者特征做内容理解。效果评估不能只看“推荐出来了”还需要通过点击率、播放时长、完播率判断推荐好坏。在毕设中可以加入一个简单评估模块把训练集和验证集分割计算召回率或者预测 RMSE然后说明优化方向。这样会让项目深度比单纯跑通源码高出一块。8.4 后续扩展方向如果时间允许推荐按以下顺序扩展第一步加入视频特征表在 ALS 之外增加“热门视频”和“相似视频”召回形成多路召回。第二步用户行为写入消息队列例如 Kafka 或 Redis Stream再通过 Spark Streaming 做分钟级更新。第三步引入 Redis 做候选集、埋点数据做 AB 实验比较不同参数组合下推荐效果。第四步把模型升级为双塔、DSSM 或 DeepFM但需要先保留 ALS 作为基准模型否则效果变差时无法定位是数据问题还是模型问题。整个项目里最值得坚持的一条原则是先跑通最小闭环再优化效果。环境、数据、训练、接口四层全部跑通后再考虑加日志、监控、AB 实验和更复杂的模型。对毕业设计而言能讲清楚数据从哪来、模型怎么训练、结果怎么产出、失败怎么排查比堆砌一堆没有运行验证的概念更重要。
返回列表