ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

热点新闻推荐系统毕设全栈实战:Django+Vue+深度学习

热点新闻推荐系统毕设全栈实战:Django+Vue+深度学习 每年毕业季我都会遇到一批被“推荐系统”这个题目吸引的同学热点新闻推荐系统又是其中最常见的一款。选这个题的人多但真正能把它做明白的不多——多数人不是不会调模型而是不知道整个项目该怎么闭环数据从哪来、特征怎么提、模型用什么、Django和Vue怎么串起来、最后怎么演示才能让评委觉得“这活儿干得完整”。这个项目标题“热点新闻推荐系统-大数据深度学习算法毕设毕业设计项目DjangoVue”本质是一个典型的全栈型毕业设计。它要求你在后端用Django提供接口、在前端用Vue搭界面、在算法层用深度学习做个性化排序再把“热点”这个东西通过数据统计和热度计算识别出来。信息过载时代新闻App如果没有推荐系统用户每天面对几百条推送只会烦躁地卸载而有了推荐产品的停留时长和点击率完全是两个量级。这就是这个题目的价值所在。这篇文章不打算给你讲那种“打开一个网页就写好了”的假教程而是从选题逻辑讲到架构设计从模型原理讲到前后端落地从冷启动坑讲到演示答辩把整个项目的关键环节完整拆一遍。适合正在纠结毕设选题、或者选了类似题目之后不知道从哪下手的同学参考。1. 项目需求剖析与选题价值1.1 热点新闻推荐到底在解决什么问题先说一个真实的场景。假设你现在做一个新闻App每天入库的新闻有几千条用户打开首页只能看到按时间倒序排列的一堆标题。对所有用户推一模一样的内容后果就是想看科技新闻的人被娱乐八卦刷屏想了解财经动态的人被社会新闻淹没用户觉得“这App不懂我”第二天就卸载。推荐系统的核心任务就是把“人找信息”变成“信息找人”。放到新闻场景里要同时解决两个问题第一用户感兴趣的内容要排前面第二当下真正热门的事件不能被漏掉。这就决定了系统不能只做一个简单的协同过滤而是需要“个性化召回热点识别深度排序”组合起来干活。从毕设角度看这个方向还有一个实际优势数据容易获取效果容易展示。新闻数据要么爬要么用公开数据集评估指标比如点击率、推荐列表里用户真正点了多少条都是评委能直观感受到的结果。对比那些“基于深度学习的某某图像识别”类题目新闻推荐不需要GPU也能完成全部流程对学生党友好得多。1.2 技术栈组合的逻辑DjangoVue深度学习为什么合理毕设选题最怕的是什么是题目看起来高大上但自己根本没能力在三个月内做完。所以技术栈的选型本质上是一个“成本收益”的权衡问题。有些同学看到“大数据”三个字就想着上Hadoop、Spark、Flume全套结果搭个三节点集群就花了两周最后连推荐模型都没时间碰答辩的时候只能放一张集群监控页面截图显得很空。实际上毕设项目的“大数据”更多体现在数据采集规模、批处理流程和特征工程上而不是非要部署分布式框架。把MySQL、Redis和定时任务用好已经能支撑几十万条新闻数据和大量用户行为的处理。Django在这个项目里的定位是“能写业务、能出接口、能做后台权限”的一体化后端框架。它自带ORM、Admin后台和认证体系对于毕设这种需要快速出成果的场景比Spring Boot那一套更轻学起来也不费劲。Vue则负责前端SPA页面和数据可视化大屏和Django通过REST API沟通前后端分离的结构在毕业答辩里是个明显的工程化亮点。深度学习模型则聚焦在“排序”环节。推荐系统公认的流程是召回、排序、重排三步你在召回阶段可以用简单的规则和协同过滤保证覆盖率在排序阶段用深度学习模型精排这样既有算法深度又能保证整个系统跑得动不至于陷入“模型调不出来项目也不可用”的困境。1.3 功能模块到底要拆成哪几块站在毕设评委的角度他关心的不是你这系统能写出多少行代码而是你“有没有完整的产品思维”。所以功能模块不要只做一个孤零零的推荐列表要拆开做完整。用户模块注册、登录、兴趣标签选择、浏览历史、收藏/点赞/评论行为。新闻模块新闻抓取入库、分类管理、热点标记、新闻详情展示。推荐模块热门推荐、个性化召回列表、深度学习排序结果、推荐理由说明。热点模块热点事件识别、时间衰减热度分、热点榜单。管理模块用户管理、新闻上下架、后台数据统计大屏。这套模块拆下来你的项目在演示时就有话可讲用户注册后完善兴趣系统冷启动推荐用户浏览几条新闻后行为数据进入特征库后台定时任务更新模型下次打开时首页已经是个性化结果管理后台能看到全站点击分布。这个闭环一跑通项目完整度立刻上一个档次。2. 系统架构设计与数据链路2.1 分层架构与各层职责我的习惯是先分清楚“数据从哪儿来、到哪儿去”再开始写代码。这个项目本身不大但一定要用分层的思想去组织方便后期扩展也方便论文里画架构图。整个系统我拆成四层。第一层是数据采集层负责爬取新闻并清洗入库第二层是存储层MySQL存用户、新闻、行为等结构化数据Redis存热点榜、推荐缓存和会话状态第三层是推荐服务层包含召回、排序、重排以及热点计算第四层是应用层由Django提供REST接口Vue负责页面渲染。前端的可视化大屏数据也走接口拉取不做前后端混合。四层之间最需要注意的是依赖方向。让推荐服务层依赖存储层应用层依赖推荐服务层但不能让底层的采集逻辑去依赖上层的接口。有些同学为了省事直接在爬虫脚本里面查用户行为表看起来能跑后期改起来就是一团乱麻。2.2 用户行为数据的采集与流转没有行为数据的推荐系统就是空中楼阁。你模型做得再花哨没有用户的点击、曝光、停留时长作为训练样本一切都是白搭。这个项目里的埋点方案不用像大厂那样复杂前端在新闻卡片曝光和点击时主动向后端接口发送行为数据即可。行为数据流大概是这样的用户在首页看到推荐列表前端记录曝光日志新闻ID、位置、时间用户点击某条新闻前端发送点击行为用户阅读了30秒以上或者点了赞、收藏、评论额外记录深度行为。后端接收到行为后先写入MySQL的行为日志表同时同步更新Redis中对应新闻的热度值与用户最近的浏览列表。这个链路里有一个坑高频行为请求如果直接写MySQL数据库压力会很大页面也会卡。我的处理方案是用异步任务队列把行为数据先扔进Redis列表再由后台定时批量写入MySQL。毕设规模不大用Celery或者Django的异步视图都能解决最简单也可以写一个独立Python脚本消费队列。2.3 数据库建模的要点与扩展性数据库设计直接决定后期写代码是顺滑还是痛苦。用户、新闻、行为三张主表必须建好推荐相关表也不能漏。用户表的核心字段是用户ID、用户名、加密密码、兴趣标签可用JSON字段存多个分类ID、注册时间。新闻表要有新闻ID、标题、正文、分类、来源、发布时间、点击量、热度分等字段正文可以单独存一份或者用TEXT类型热度分用浮点数方便排序。行为日志表记录用户ID、新闻ID、行为类型曝光、点击、点赞、收藏、评论、行为时间、活跃时长这是训练样本的数据来源。另外我建议再加一张推荐结果表每次给用户生成推荐列表时把推荐结果和对应的用户ID、生成时间存下来。这样做有个好处训练深度学习模型时你可以拿到“推荐了什么”和“用户点了什么”的完整数据能够算出精确的曝光点击率评估模型的时候就不会缺负样本。2.4 热点识别的核心逻辑热点新闻推荐系统的“热点”二字不能只靠按点击量排序搞定。真正意义上的热点应该是“在短时间内点击量急剧上升”的新闻而不是老新闻长期霸榜。我采用的方案是带时间衰减的热度计算。基础热度分由点击量、评论量、点赞量按权重相加得到然后乘上一个随时间衰减的因子比如两三天前发布的新闻热度折半。再加一个增量加速判断如果一条新闻在一个小时内点击增量明显超过同分类其他新闻的平均值就给它一个hot标签并进入热点榜单候选。热点榜单用Redis的有序集合ZSET来维护再合适不过score就是热度分成员是新闻ID。后台每十分钟计算一次把结果同步到MySQL。这样既保证实时性又避免每次请求都全表扫描新闻表做排序性能上完全扛得住。3. 核心算法与深度学习模型实现3.1 推荐策略从简单到高级的四步走很多新手一上来就想直接上深度学习模型这是最容易翻车的思路。现实中的推荐系统一定是分层策略的每一步都有它存在的意义。第一步是热门推荐。冷启动阶段没有用户特征推荐热门新闻最合理成本最低。第二步是基于内容的推荐通过用户点击过的新闻提取分类、关键词、TF-IDF向量找相似内容推荐过去。第三步是协同过滤ItemCF算新闻与新闻的共现相似度给用户推荐“和你之前点过的新闻相似的其他用户也爱看”的内容。第四步才是深度学习排序把前几步召回的候选集统一交给模型打分。前两步用于解决冷启动第三步保证推荐的多样性第四步提升精度。很多同学的毕设只做了协同过滤或只做了深度学习前者论文深度不够后者没有前几步兜底模型效果会很差。四步全做论文每一章都有内容可写答辩时也能把“为什么需要深度学习”讲得有理有据。3.2 深度学习排序模型的选型WideDeep和DeepFM怎么选说到深度学习排序业界最常用的基础结构是Google提出的WideDeep模型后来华为的DeepFM在这个基础上引入了因子分解机的思想。对毕设来说两个都可以我更推荐先在WideDeep上跑通再根据效果决定是否升级。WideDeep的思路非常直白。Wide部分是一个线性模型输入的是人工构造的交叉特征比如“用户兴趣分类新闻分类”是否匹配这一部分负责“记忆”把用户历史上明确表达过的偏好记下来。Deep部分是一堆Embedding拼起来送进全连接网络负责“泛化”学习用户和新闻之间隐藏的关联。在新闻推荐场景里用户的性别、年龄、兴趣标签以及新闻的分类、来源、标题关键词都是离散特征为主。这里要特别说明一个细节新闻标题不能直接扔给模型要先分词再对词汇做Embedding常用的做法是训练一个Word2Vec或者直接用预训练的词向量也可以简单地对高频词做编号后查Embedding表。如果非要用深度学习的部分去处理正文可以再接一层TextCNN或BERT但对毕设项目来说标题级别的文本向量就已经足够。3.3 特征工程与训练样本构造我见过太多同学在模型代码上花大力气却忽略了样本构造最后训练出来的模型在测试集上表现很好一上线效果惨不忍睹。问题往往出在样本分布上。先说正负样本怎么来。用户点击过的新闻是正样本曝光但没点的新闻是负样本。这里有个细节一定是“曝光未点击”而不是“随机抽取未点击的新闻”当负样本。因为用户根本没看到那条新闻不代表他不喜欢这个负样本标签是有噪声的。你可以通过推荐结果表和曝光日志把真正展示给用户却没点的那部分挑出来配合一定比例的随机负采样。特征工程方面我建议分三组整理。用户特征组包括年龄、性别、注册天数、兴趣标签向量对用户兴趣标签做Embedding取平均、最近点击过的新闻ID序列做Attention或取平均向量。新闻特征组包括分类ID、来源、发布时间距离当前的时间差、热度分、标题关键词向量。上下文特征包括当前时间段早上、中午、晚上、深夜、设备类型、请求页面位置。这里特别提醒时间这个特征一定要进模型。新闻是有强时效性的发布超过三天的新闻用户点击意愿天然就会下降。把“发布时间距现在的小时数”作为连续特征输入模型能让排序结果自带时效性比单纯给新闻列表做时间倒序要科学得多。3.4 模型的训练细节与离线评估训练数据组织上需要按用户和时间切成训练集与测试集。正确的切法是用时间靠前的用户行为训练用时间靠后的行为做验证不能随机切分。随机切分在时间序列数据上会严重高估模型效果因为模型在训练时已经“偷看”了未来信息。模型目标就是预测点击概率。损失函数用二元交叉熵优化器用Adam学习率建议从0.001开始调。Embedding维度一般取32或64Deep部分的隐藏层可以用[256, 128, 64]这样的递减结构。Wide部分要做特征交叉建议手动构建一些有业务含义的组合比如“用户分类偏好×新闻分类”是否一致、用户是否点击过同一来源的新闻。离线评估指标我建议至少给出三个AUC、GAUC、RecallK。AUC衡量整体排序能力GAUC是用户维度的加权AUC能反映个性化效果RecallK看TopK推荐列表的召回比例。毕设答辩时能拿出一张AUC曲线和GAUC对比图再把WideDeep与纯协同过滤的Recall10对比讲清楚算法部分的深度就足够了。3.5 在线推荐流程的“召回-排序-重排”三段式模型训练好之后还要把它嵌入到在线推荐流程里。完整的在线推荐流程分三步。召回阶段系统从三个路获取候选集用户兴趣标签匹配的新闻基于内容、协同过滤相似新闻ItemCF、当前热点新闻列表。各路召回的结果取并集数量可以控制在200条左右。排序阶段把候选新闻加上用户特征、上下文特征批量送入训练好的WideDeep模型得到每条的预测点击率。重排阶段做的是一些业务规则同一分类的新闻不能连续超过两条活跃度太低的新闻需要加一个小随机扰动保证推荐结果多样性。我实际开发时经历过的教训是召回阶段一定要保留最热门的那一路。深度学习模型有个偏置问题它倾向于推用户历史上喜欢的东西导致老用户越来越难看到新热点。重排的时候强制把热点新闻插入列表前几位才能让“热点新闻推荐系统”真正对得起“热点”这两个字。4. Django后端工程落地4.1 Django项目结构与API设计Django后端部分我建议用Django REST Framework来提供接口项目结构按功能模块拆成多个app。看起来像这样apps/user用户注册、登录、兴趣标签、个人中心。apps/news新闻管理、分类、热点标记、新闻详情。apps/recsys召回、排序、重排和推荐列表接口。apps/dashboard后台统计与数据大屏接口。这样每个app各司其职比把所有逻辑堆在一个app里好维护得多。我在带项目时见过最痛苦的情况是路由写了几百行views.py超过两千行改一个推荐功能要同时滚三个文件这种代码放到答辩现场评委随便一问你就容易卡壳。接口设计方面核心接口我列一下。POST /api/user/register是注册POST /api/user/login是登录拿TokenGET /api/recommend/feed是首页信息流接收用户ID和分页参数POST /api/behavior/report是行为上报GET /api/hot/list是热点榜单GET /api/news/detail是新闻详情GET /api/dashboard/statistics返回大屏统计数据。4.2 用户行为上报接口的异步处理行为上报接口是整个系统数据闭环里最关键的入口。它的QPS会明显高于其他接口所以不能做太重的事情。前端传过来的JSON大概是这样的{user_id: 1, news_id: 123, behavior_type: click, duration: 32, timestamp: 1700000000}。Django后端收到之后首先做参数校验接着把数据写入Redis的列表结构比如rpush(behavior_queue, json_str)。然后有一个后台任务每隔十秒从Redis里批量取数据解析后批量插入MySQL。这里用Redis队列而不是直接写MySQL是为了削峰填谷。Redis的写入速度比MySQL快一到两个数量级这样即使前端在某一秒集中上报几百条行为后端也不会崩。批量插入MySQL的时候用django.db.transaction.atomic包裹事务insertmany的形式速度会快很多。这个方案在论文里还可以写成“基于消息队列的异步行为采集”显得有工程水准。4.3 推荐接口的缓存与更新策略推荐列表接口是用户感知最明显的接口响应速度直接决定体验。数据库查询再快也不可能比缓存快。我的方案是用户请求首页推荐时先从Redis拿推荐结果key格式是recommend:feed:{user_id}:{page}value存的就是排好序的新闻ID列表。那这个缓存什么时候更新呢我给两个触发条件。第一定时更新后台每个小时对所有活跃用户的推荐列表做一次异步重算并写回Redis。第二行为触发用户点击了某条新闻后该用户的推荐缓存立即过期下次请求时重新拉取。第二种方案能保证用户实时感受到推荐变化给用户“系统越来越懂我”的正反馈。如果推荐列表还没缓存那就要走实时推荐逻辑从MySQL拉召回候选加载模型批量预测做重排然后返回结果并写Redis。这个完整流程在数据量不大时一次请求200条新闻预测耗时也就几十毫秒完全在可接受范围。4.4 RBAC权限管理和Django Admin管理后台不能谁都能进。Django自带Admin但默认权限模型只有is_staff和is_superuser两个维度深度不够。我在项目里用的是Django自带的Group和Permission机制实现简单的RBAC权限管理。做法是创建三个分组普通用户、编辑、管理员。编辑可以上下架新闻、修改分类但看不到用户数据管理员拥有全部权限。Django的ModelAdmin里可以重写has_change_permission方法根据request.user的组来判断是否允许操作。登录认证用DRF自带的TokenAuthentication或者用JWT也行我自己更推荐JWT因为前端好处理过期和刷新而且特别适合前后端分离的项目结构。记住一个点Django的Permission机制本身不复杂答辩时一定要能讲清楚“为什么用RBAC”——因为新闻后台不是所有人都能改的编辑只能管内容管理员才能看用户行为数据这既是安全需求也是职责分离。5. Vue前端与可视化大屏5.1 前端工程初始化与环境配置前端部分我用的是Vue 3加Vite相比Vue 2的webpack方案Vite启动速度快配置也更简洁。环境配置是老生常谈的问题先装Node.js建议用LTS版本然后npm install -g create-vite创建项目。项目目录建议这样设计src/api放axios接口封装src/router放路由配置src/views放页面组件src/components放公共组件src/store放Pinia状态管理。ECharts单独放一个charts目录封装成可复用的图表组件方便大屏页面多个图表共用一套配色和主题。有一个很容易踩的坑是跨域。Django后端跑在8000端口Vue开发服务器跑在5173端口前端请求后端接口一定会遇到跨域。解决办法是在Django里装django-cors-headers把前端地址加入CORS白名单。生产环境部署时一般用Nginx把前端静态文件和后端接口放在同一个域名下通过反向代理解决跨域。5.2 页面布局与核心交互前端页面我规划了五个首页信息流、热点榜单页、新闻详情页、个人中心页、管理后台可视化大屏。首页信息流是推荐系统的门面用列表方式展示新闻卡片每张卡片包含标题、摘要、分类标签、热度值、推荐理由。用户点击卡片进入新闻详情页详情页可以点赞、收藏、评论这些行为都要通过接口上报。信息流采用滚动加载到底部自动请求下一页推荐列表分页就是前面说的recommend:feed:{user_id}:{page}。热点榜单页展示当前热门新闻按热度分倒序排列可以加一个“实时热点”的轮播模块用短轮询每隔一分钟拉取一次热点榜给用户“这个系统是实时的”的直观感受。个人中心展示用户的基础信息、兴趣标签和浏览历史支持用户修改标签——这个功能对应着Django后端的用户特征更新接口。5.3 ECharts可视化大屏的实现细节管理后台的可视化大屏是答辩时的加分项。大屏不用做得太花哨但要有数据含量。我的方案是四块图加一个表格。第一块是分类点击分布饼图展示不同新闻分类的点击量占比第二块是24小时用户活跃折线图按小时统计点击行为数量第三块是热点词云从近24小时点击量最高的新闻标题中提取关键词用词云展示第四块是推荐效果环比柱状图对比模型优化前后或者每日的点击率变化。表格部分展示近期的行为上报日志做一个自动滚动效果。ECharts的使用有几个细节。第一不要全局引入完整ECharts包按需引入echarts/core和需要的图表类型这样打包体积小很多。第二图表数据要封装成后端接口返回的固定格式比如{dates: [], values: []}前端组件直接消费。第三大屏页面要支持自动刷新用setInterval每30秒重新请求一次接口配合平滑动画展示效果更生动。5.4 Vue与Django接口联调的关键点前后端联调是很多同学翻车的重灾区。我标准化了一套Axios封装流程解决大部分问题。所有请求都经过一个request.js实例请求拦截器里从localStorage拿Token加在Authorization头。响应拦截器里统一处理HTTP状态码401跳到登录页500弹错误提示。接口地址用环境变量管理开发环境指向http://localhost:8000生产环境用相对路径配合Nginx反代。Vue Router配置路由守卫没有登录的用户访问首页时强制跳转到登录页。这里有个体验细节推荐系统的功能要“未登录也能用一部分”否则评委演示时还得先注册账号才能看到效果体验不好。我的做法是游客可以浏览热门推荐登录后才有完整个性化推荐和收藏功能这个设计在答辩时也可以讲既保证了体验又采集了更多用户行为数据。6. 常见问题与排查技巧实录6.1 推荐结果全是热门新闻没有个性化这个问题在模型上线后最容易出现。排查思路从数据、特征、模型三个方向走。先看训练样本里用户特征是否有区分度。如果很多用户的历史行为都是空的模型学不到用户差异就只能全部偏向热门。这时候要给冷启动用户单独用规则推荐别硬套模型。再看特征构造用户兴趣标签如果只有三四个分类表达力确实有限可以把“用户最近点击的新闻标题关键词”也塞进特征。最后看模型结构如果Deep部分输出被Wide部分主导说明交叉特征太强了可以适当调小Wide部分的权重或者增加Deep层的维度。我的经验是先确保代码里确实把user_features传进了模型再评估效果。很多同学写着写着就把用户特征丢了只用了新闻特征那结果当然是“千人一面”。先在日志里打印模型输入确认每个字段都有值再谈调优。6.2 数据稀疏阶段模型不收敛冷启动阶段用户行为很少深度学习模型非常容易欠拟合。这个问题不是模型不行而是数据量不够。我的解决方案分两条线。一条是降复杂度减小Embedding维度从64降到16缩小Deep隐藏层从[256,128,64]降到[64,32]让模型在数据少的时候更容易学到规律。另一条是兜底策略冷启动用户直接跳过模型排序用基于内容的热门召回顶替等用户行为积累超过20条后再走深度学习排序。另外一个细节是负采样比例。数据稀疏时负样本太多会让模型倾向于全部预测为负导致点击率预测值极低。建议负采样比例控制在1:1到1:3之间不要超过1:5。你可以在验证集上观察如果预测的点击率均值低于0.05就要考虑负采样是否过头了。6.3 前端首屏加载慢和ECharts卡顿首页信息流如果一次性渲染50条新闻卡片每张卡片都加载高清图片首屏速度一定惨不忍睹。图片加载必须做懒加载Vue里可以用v-lazy指令或者IntersectionObserver实现。列表接口要做分页每页10到15条滚动到底部再加载下一页。ECharts卡顿通常是因为初始化了太多图表实例没有销毁。Vue组件销毁时一定要调用chart.dispose()否则页面来回切换几次浏览器内存就爆了。大屏页面的多个图表组件可以用一个公共的Mixin统一管理实例创建和销毁省掉重复代码。模板编译方面还可以开Vue的异步组件用defineAsyncComponent把非首屏页面的组件延迟加载。管理后台大屏这种不常访问的页面完全可以等用户点进去再加载JavaScript首屏体验会好很多。6.4 训练数据质量差导致模型效果上不去这是推荐系统项目里最隐蔽的坑。行为数据采集如果做得不规范模型再强也白搭。常见的数据质量问题有三个。第一曝光日志和点击日志对不上比如点击了某条新闻但曝光表里没有记录说明前端埋点有漏报。解决方法是给每条行为数据加一个request_id曝光和点击通过它关联后端每天跑一遍对账脚本。第二爬虫新闻内容重复同一个来源的不同链接内容一模一样会造成推荐列表里的重复信息。建表时给新闻标题加唯一索引重复入库时自动跳过。第三用户行为时间跨度过大一个月前的点击行为和今天的兴趣可能完全无关。训练样本建议只取最近30天的行为数据并且按时间衰减给样本加权越近的行为权重越高。训练数据的质量直接决定模型的天花板这个观念一定要在论文里写清楚。评委问“你这模型为什么选这个结构”的时候你可以答“模型结构是次要的数据质量才是决定效果的核心”这个回答反而比堆术语更显深度。6.5 快速定位线上问题的排查工具推荐系统是一个链路过长的系统出问题后快速定位到具体环节很重要。我在本地调试时常用两个方法。第一个是接口日志打点。在Django中间件里记录每个接口的响应耗时在推荐接口里额外打印召回数量、模型预测耗时、缓存是否命中这些关键信息。日志格式做成JSON方便后期分析。第二个是提供一个“推荐诊断”调试接口传一个用户ID返回该用户的完整推荐链路信息包括候选集来源、特征向量前几维、模型得分、重排规则命中情况。演示阶段如果评委问“为什么给这个用户推荐了这条新闻”你可以当场打开诊断接口把推荐理由一步步展示出来这个设计在简历里也能写成一笔项目亮点。还要强调一个笨办法把模型预测结果落一份到本地CSV用Excel打开做抽样分析看看排在前面的新闻在人类视角下是否合理。模型自信度再高如果给一个篮球迷推荐美妆新闻一定是特征或样本出了问题。人工抽检永远是最直接的模型Debug方式。最后的实操体会带这个项目做完之后我个人最大的体会是推荐系统的难点从来不在某个单点技术而在数据链路能否闭环。很多同学把精力全押在模型结构上反复调参结果线上的推荐结果和训练数据对不上AUC再高也没有意义。这个项目从头到尾走一遍你会对“数据采集、特征工程、模型训练、在线服务、效果评估”这条完整链路有真切的体感这比单独学一个深度学习框架值钱得多。如果你现在正准备开始做这个毕设我的建议是先花三天时间把行为上报、存储、推荐展示这条主线跑通哪怕推荐结果就是按时间倒序的新闻列表也先把链路的骨架搭起来。之后再往里面填热点计算、协同过滤、深度学习排序这些血和肉。顺序反了很容易卡在某个细节上拖到最后连一个能演示的系统都交不出来。根据我带过的项目经验只要思路清晰、按模块推进这个题目做出来不仅答辩轻松写简历也能撑起“全栈推荐算法”两个方向性价比非常高。
返回列表