
简介本资源是一套面向计算机专业本科生的毕业设计级实战项目聚焦电商用户行为分析与预测适用于深度学习、数据可视化及Web系统开发的学习与实践。项目基于Python构建完整闭环通过爬虫模块采集模拟淘宝用户行为数据利用Pandas、TensorFlow等库完成特征工程与LSTM/GRU模型训练MySQL存储结构化数据并以Django框架实现前后端交互与动态可视化展示。压缩包共630个文件含68个核心Python脚本含模型训练、API接口、爬虫逻辑、110个Vue前端组件、70个JS交互逻辑、48个PNG/JPG图表资源及159个SVG矢量图标整体31.91MB目录结构清晰模块职责分明。已有61人学习下载配套提供数据库设计文档、部署调试指南、源码说明及完整可运行环境配置Python 3.7开箱即用涵盖从数据获取、建模预测到结果呈现的全流程技术细节是理解电商智能推荐系统落地的优质参考范例。 每年到这个时候总有不少人对着“计算机毕业设计”这几个字发愁。你要是打算做Python方向又不想碰那些烂大街的图书管理系统、学生管理系统那你很可能搜到过这样一个标题——“python基于深度学习的淘宝用户购物可视化与行为预测系统设计”。这个题目听起来唬人拆开看其实就三件事用深度学习做行为预测、用可视化展示结果、用MySQL存数据。这篇我就把这套系统的完整设计思路、数据怎么处理、模型怎么选、可视化怎么做、以及论文和答辩怎么准备一次性讲清楚。先说这套东西到底能干什么。它本质上是一个基于淘宝用户行为日志的推荐/预测系统输入的是用户一段时间的浏览、收藏、加购、购买行为输出的是用户下一次行为尤其是购买行为的概率。业务侧可以用来做精准营销、商品推荐站在毕设角度它同时覆盖了数据分析、特征工程、深度学习建模、Web可视化、数据库设计几个大块工作量饱满技术栈完整评审老师一看就知道不是糊弄的。我接触过不少做这个题目的同学有人用公开的UserBehavior数据集有人自己爬数据但不管数据从哪来整个系统的架构和核心逻辑是共通的。下面按我自己实测过的路径把每一层怎么搭、每一步踩过什么坑都给你捋一遍。1. 淘宝用户购物行为预测这套毕设到底在解决什么问题1.1 典型数据集与业务问题定义做这个题目绝大多数人用的都是阿里巴巴公开的淘宝用户行为数据集UserBehavior这个数据集大概是这样的每一行是一条用户行为记录包含用户ID、商品ID、商品类目ID、行为类型、时间戳五个字段总数据量在一亿条左右。行为类型一共有四种pv点击浏览商品详情页cart加入购物车fav收藏商品buy下单购买不同行为之间有天然的逻辑递进关系用户通常先浏览再收藏或加购最后购买。所以这个数据集天然适合做行为序列建模也就是给定一个用户历史的、按时间排序的行为序列预测他下一步会不会购买某个商品。如果你下载过完整版会发现这个文件大概有一亿行压缩包解压出来有1.5GB左右。说实话一般毕设用的笔记本直接跑全量数据很吃力我建议做的时候要么只取部分用户比如随机抽取5000到10000个用户的行为数据要么限制时间窗口比如只取最近一周的数据。我用的是“抽取用户保留完整行为序列”的策略既控制了数据规模又不破坏行为序列的完整性模型训练起来也顺畅得多。1.2 系统整体架构从原始日志到预测结果这套系统的完整数据流向可以分成五层每一层都有明确的输入输出这样后面写说明文档也好、画系统架构图也好都特别清晰。第一层是数据层原始行为日志和商品信息落在CSV文件里经过去重、过滤、格式转换后导入MySQL形成结构化存储。第二层是特征层从MySQL里读出原始行为数据以用户和商品为粒度构造统计特征用户总点击数、商品被购买次数等和序列特征用户最近的行为序列加工后的特征写回特征表供模型读取。第三层是模型层特征拼接后输入深度学习模型。我这里采用的是GRU序列模型加注意力机制输出的预测结果购买概率回写到MySQL的预测结果表。第四层是可视化层Flask后端从MySQL读取统计数据并通过JSON接口输出前端用ECharts渲染大屏呈现核心KPI、行为漏斗、类目排行等图表。第五层是应用层面向使用者可以提供单个用户的预测查询也可以做批量预测输出“可能购买的用户/商品名单”。这套架构在论文里很好画数据流一路从下往上走每个模块职责单一、边界清晰。另外一个好处是每一层都可以单独测试比如模型训练没跑通之前可视化可以先拿MySQL里的历史统计数据做两件事不互相卡脖子。2. 数据清洗与特征工程行为日志里最容易忽略的坑2.1 时间戳、去重与异常行为过滤数据处理是整个项目最枯燥但最容易出成绩的部分因为评审老师爱问细节而且这些细节直接影响模型效果。先说时间戳。原数据集里的时间戳是Unix时间戳单位是秒而且只有7位比如1565593200这不是标准10位时间戳是因为原始文件本身做了某种泛化处理。第一步肯定是把它转成可读日期这一步不能用EXCEL直接转我写了个Python脚本统一处理import pandas as pd import datetime df pd.read_csv(UserBehavior.csv, headerNone, names[user_id, item_id, category_id, behavior, ts]) def ts_to_date(ts): return datetime.datetime.fromtimestamp(ts).strftime(%Y-%m-%d %H:%M:%S) df[time_str] df[ts].apply(ts_to_date) df[date] df[time_str].str[:10] df[hour] df[time_str].str[11:13]转完之后你会发现一个很有意思的现象每天的行为分布有非常明显的昼夜节律凌晨4到6点是低谷晚上20点到23点是高峰。这个规律后面在大屏可视化的时候可以直接用画一张“24小时行为分布图”特别能出效果。然后是去重。原始数据里存在少量的完全重复记录同一用户、同一商品、同一行为、同一时间戳大概率是日志系统重复上报。处理方式是直接drop_duplicates()注意要按全字段去重不是只按user_id和item_id去重否则会把用户对同商品一天内的多次浏览误删。还有一类异常用户要处理。比如有的用户行为次数是几十万次这明显是爬虫或刷单账号正常用户不可能在几天内产生这么多行为。我的处理办法是统计每个用户的总行为数按四分位法过滤掉P99以上的极端用户同时把行为数少于3条的用户也删掉——序列太短深度学习模型根本学不出什么东西。2.2 关键特征怎么构造从统计特征到序列特征这个项目的核心机器学习特征我分为三大类第一类叫用户统计特征描述“这个用户有多活跃”。包括用户总点击数、总加购数、总收藏数、总购买数、点击到购买转化率、活跃天数等。这些特征刻画了用户整体的购物倾向。第二类叫商品统计特征描述“这个商品有多受欢迎”。包括商品总点击数、被收藏次数、被加购次数、被购买次数、商品点击转化率等。这类特征对预测购买尤其重要因为热门商品天然有更高的转化概率。第三类叫交叉特征描述“这个用户和这个商品之间的关系”。包括用户对某个商品的点击次数、是否收藏过该商品、是否加购过该商品、上次点击该商品距现在多久等。这些是核心的强特征尤其是“历史加购过”对“是否购买”的预测能力远超其他特征。统计特征用Pandas的groupby聚合就能完成关键是聚合完的表格要和训练样本正确关联这里建议统一做成“user_id, item_id, label, 特征1, 特征2...”的宽表格式。序列特征这一步比较关键也是这个项目和普通机器学习分类器的最大区别。我把每个用户的所有行为按时间排序筛出商品ID序列比如[1001, 2394, 8721, 1001, 8830]同时记录对应的行为类型序列。构造序列的目的是用深度学习模型捕捉“用户在短时间内连续浏览同类商品然后下单”这类时序模式。序列长度统一截断为50——太短信息不够太长训练慢而且后面的行为会稀释前面的信号。不足50的用0填充。2.3 MySQL表结构设计特征存储与查询性能的平衡这个题目既然带MySQL那数据库设计就是躲不开的考察点。别偷懒只建一张表那样既不符合系统设计规范也经不起评审追问。我建议至少建五张表。用户表users存用户ID、活跃天数、总行为数、注册时间如果没有就用最早行为时间代替商品表items存商品ID、类目ID、商品热度字段用户行为表user_behavior存最原始的行为日志字段包括user_id、item_id、behavior、ts、date用户商品特征表user_item_feature存构造好的宽表特征供模型训练读取预测结果表predictions存模型的预测输出字段包括user_id、item_id、pred_prob、predict_date。建表语句我给出核心的几张方便你直接改改字段名就能用CREATE TABLE user_behavior ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, item_id BIGINT NOT NULL, category_id BIGINT, behavior VARCHAR(10), ts BIGINT, behavior_date DATE, behavior_hour TINYINT, INDEX idx_user_time (user_id, behavior_date), INDEX idx_item (item_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有两个重要的坑。第一字符集一定要用utf8mb4而不是utf8不然商品名称、中文类目名称一旦涉及emoji或者生僻字就会报错或乱码。第二behavior字段虽然只有几个枚举值但一定要加索引因为后面可视化大屏最频繁的查询就是“按行为类型分组统计数量”没有索引全表扫描一亿行MySQL直接卡死。如果你导入了全量数据集建议再加一个按日期范围做的分区或者干脆像我一样在清洗阶段就把数据控制在一千万行以内配合索引完全够用。另外一个实践是所有聚合统计尽量用一条SQL完成避免在Python里循环查数据库那会慢到让你怀疑人生。3. 深度学习模型选型与训练为什么最终没有选Transformer3.1 模型选型的前后排雷这个项目冠着“深度学习”的名头但具体用什么模型里面选择空间很大。我调研了几种主流方案也实际跑过对比列个表给你参考。方案一DNN/MLP多层全连接网络。只吃统计特征不吃序列特征。优点是简单、快缺点是捕捉不到行为间的顺序依赖关系预测效果一般。方案二LSTM/GRU。把用户行为序列作为输入能捕捉时间依赖结构清晰易于解释。方案三BiLSTM。双向LSTM能同时考虑上下文但对行为预测这种严格单向的任务反向信息意义不大而且参数量大、训练慢。方案四Transformer。效果确实好但对数据量要求高训练时间也长毕设的机器容易跑不动而且答辩时模型原理很难三句话讲清楚。方案五GRU Attention。这是最终选择的方案。GRU擅长处理序列依赖注意力机制自动学习序列中哪些行为比如加购、收藏对“买不买”影响更大。参数量适中效果明显优于纯GRU原理也容易向评审老师解释。为什么不用更复杂的Transformer核心原因是数据规模和训练成本。淘宝用户行为是一种典型的强时序、强局部依赖的数据用户“刚刚加购了一个商品”比“十天前看过这个商品”对当前购买决策的影响大得多。GRU加注意力在长序列压缩上够用且能保留关键信号。对毕设而言把模型控制在二十到六十分钟能训练完的规模会很舒服——你还有时间反复调参、重新训练不用每次等四五个小时。3.2 训练细节损失函数、正负样本和评估指标行为预测在建模上是个典型的二分类问题预测用户会不会购买某个商品1代表购买0代表不购买。但这里马上遇到一个尴尬的问题数据里购买行为占比极低。在UserBehavior全量数据里pv大约占90%buy大约占2%到3%cart和fav各占3%到5%。如果你把所有“未购买”样本都当作负样本模型会学成“永远输出0”的废模型因为全部预测为不购买准确率也能到97%但这没有任何意义。所以负样本要抽样。我的做法是对每个正样本购买行为随机抽取1到3个“同一用户浏览过但没买过的商品”作为负样本这样把正负样本比例控制到1:2到1:3左右。损失函数用二分类交叉熵binary crossentropy。优化器我试过Adam和RMSprop最终用Adam初始学习率设为0.001训练轮数上限设为30轮加上EarlyStopping——验证集损失连续5轮不下降就提前停。这个组合在多次实验里表现最稳定。评估指标这里要特别说别傻乎乎地在论文里写“模型准确率97%”这是在给自己挖坑。行为预测问题类别极度不平衡准确率根本不能反映真实效果正确做法是用AUC和GAUC。AUC大家相对熟悉它衡量的是模型把正样本排到负样本前面的能力数值越大越好0.5等于瞎猜0.7以上就是非常有用的模型。GAUC是AUC的分组加权版本按用户分组计算AUC再按曝光数加权求平均。这在推荐、行为预测场景里其实是更贴近业务的指标因为不同用户的行为习惯差异很大全局AUC高不一定代表每个用户都被预测得准。答辩时主动说出GAUC这个指标老师通常会觉得你确实理解业务。我当时跑出来的效果大概是AUC约0.75到0.78GAUC约0.65到0.68。这个数字不算高但对行为日志预测来说已经很能说明问题了。你要明白用户买不买一件商品本身受价格、物流、促销、天气等大量外部因素影响单靠行为日志能预测到这个程度已经不错。3.3 训练中收过哪些“学费”这块单独拎出来说是因为很多同学第一次从“会用sklearn”跨到“写神经网络训练脚本”时会遇到一堆莫名其妙的报错和低效问题。第一个坑Embedding层维度设置。用户数有上万个时如果one-hot编码直接喂全连接层参数数量会爆炸。正确做法是Embedding层把用户ID、商品ID、类目ID分别映射到低维稠密向量维度一般取16到64。我实测32维效果和64维差距很小但训练速度快了接近一倍。第二个坑序列填充方向。Keras里pad_sequences默认在序列前面补0也就是说paddingpre。但GRU这类模型对序列开头不太敏感补0会引入大量无效信息我后来改成paddingpost也就是在序列末尾补0效果和训练稳定度都有改善。这个细节论文里写出来老师会觉得你做实验做得很细。第三个坑模型保存的版本兼容问题。Keras的.h5模型和新的.keras格式在不同版本间不兼容训练环境用TensorFlow 2.10、Keras 2.x部署环境却升级到了TensorFlow 2.15这时候直接load_model会报错。解决办法是保存时用model.export()或者同时导出H5和SavedModel两种格式部署时优先用SavedModel。from keras.models import Sequential, load_model from keras.layers import Embedding, GRU, Dense, Dropout, Attention # 模型结构示意 model Sequential([ Embedding(input_dimnum_items 1, output_dim32, mask_zeroTrue), GRU(64, return_sequencesTrue), Dropout(0.3), GRU(32), Dense(1, activationsigmoid) ]) model.compile(optimizeradam, lossbinary_crossentropy, metrics[AUC]) model.save(behavior_predict.keras)4. 可视化大屏不是画个图那么简单4.1 图表选型与技术栈搭配可视化部分是这个项目最直观的成果也是答辩时第一眼抓住老师的东西。技术栈上我用的是Flask加ECharts这一套经典组合Flask负责提供数据接口ECharts负责前端图表渲染MySQL存聚合数据。这套组合的好处是生态成熟、资料多、遇到问题好搜而且不用额外学Vue或React。ECharts是百度开源的图表库纯前端渲染图表效果很抢眼大屏仪表盘、地图、漏斗图、桑基图都能画。它的核心思路是后端只要把JSON格式的数据返回给前端前端调用一个echarts.init()再setOption()就能完成渲染。不夸张地说用ECharts做毕业设计可视化是性价比最高的选择。4.2 可视化指标怎么定大屏设计不是把图表堆上去就完事你要让每个图表都有业务含义整体能讲出一个“用户从进来到购买”的故事。我的大屏布局方案是顶部放四个核心KPI——总用户数、总点击量、总加购量、总购买量数字实时跳动视觉上很有冲击力。中间主图放“用户行为漏斗图”展示浏览到购买的转化链路直接反映核心业务转化。左侧放“热门商品类目排行”用横向柱状图展示点击量最高的10个类目。右侧放“24小时行为分布”用折线图展示用户在全天各时段的行为活跃度这个图能明显看出夜间高峰。底部放“行为类型占比”的饼图和“每日行为趋势”的折线图。这几个图表各有侧重有宏观有微观、有静态有动态答辩时能讲出设计理由——为什么放这个图、它反映什么业务问题、和“行为预测”有什么关系。你可以这样讲行为预测模型的输入是用户的行为轨迹而可视化负责呈现“什么用户在什么时间对什么商品产生了什么行为”两者是一体两面。4.3 ECharts MySQL 的数据接口设计这里有一个初学者很容易踩的性能问题前端图表需要的数据量很大如果你直接让前端请求几百万行原始数据浏览器会卡成PPT。正确做法是所有的统计聚合都在MySQL端完成前端只拿最终聚合结果。比如漏斗图数据我写了一条SQL搞定SELECT behavior, COUNT(*) AS cnt FROM user_behavior GROUP BY behavior;再比如24小时行为分布SELECT behavior_hour, SUM(CASE WHEN behaviorpv THEN 1 ELSE 0 END) AS pv_cnt, SUM(CASE WHEN behaviorbuy THEN 1 ELSE 0 END) AS buy_cnt FROM user_behavior GROUP BY behavior_hour ORDER BY behavior_hour;Flask端把这些查询结果包装成JSON接口。接口路径这样设计/api/overview返回总用户数、总行为数等核心指标/api/funnel返回漏斗图数据/api/category_rank返回类目排行数据/api/hourly_trend返回24小时趋势数据。前端用fetch或者axios定时比如每30秒请求一次这些接口然后setOption更新图表这样就有了“数据实时刷新”的效果。我实际测下来几百万行数据聚合查询返回也就几百毫秒完全撑得起实时刷新。from flask import Flask, jsonify import pymysql app Flask(__name__) db pymysql.connect(hostlocalhost, userroot, password123456, databasetaobao, charsetutf8mb4) app.route(/api/overview) def overview(): cursor db.cursor() sql SELECT COUNT(DISTINCT user_id), COUNT(*) FROM user_behavior cursor.execute(sql) user_cnt, total_cnt cursor.fetchone() return jsonify({user_cnt: user_cnt, total_cnt: total_cnt})5. 源码结构、说明文档与毕设答辩的实战经验5.1 源码目录怎么组织才能让评审老师一眼看明白很多人的毕设源码就是一堆脚本散落在桌面训练脚本、预处理脚本、Web文件全混在一起光看文件名根本不知道谁依赖谁。这部分其实不用花太多时间但能让你的项目“看起来”专业非常多。一个清晰的项目结构应该是这样taobao-behavior-predict/ ├── data/ # 原始数据和清洗后的数据 │ ├── raw/ │ └── processed/ ├── sql/ # 建表和初始化脚本 │ └── init.sql ├── src/ │ ├── etl.py # 数据清洗和特征工程 │ ├── train.py # 模型训练脚本 │ ├── evaluate.py # 模型评估脚本 │ └── predict.py # 预测接口 ├── web/ │ ├── app.py # Flask主程序 │ ├── templates/ # HTML模板 │ ├── static/ # JS、CSS、ECharts配置 │ └── api.py # 数据接口 ├── models/ # 保存训练好的模型文件 ├── docs/ # 说明文档和论文相关材料 └── README.md我强烈推荐写一个README.md用二十分钟简单写好“项目介绍、环境要求、快速启动步骤、目录结构说明”。这玩意儿不仅能让你在答辩前一个月翻看时快速记起项目结构也能给评审老师留一个“这个同学工程素养不错”的印象。5.2 说明文档的重点内容说明文档不要写成一堆操作流水账。一份能加分的说明文档核心要回答四个问题这个系统是什么、为什么这么做、怎么做到的、效果怎么样。正文至少包含项目背景和意义、需求分析、系统架构设计配合架构图、数据库设计说明E-R图加表结构说明、数据预处理和特征工程方法、深度学习模型原理和训练过程、系统功能展示截图加说明、测试结果和分析。其中模型部分要把你选用的GRU加注意力机制的公式和结构画清楚评估部分把AUC和GAUC的对比表贴出来。我的个人体会是说明文档写得好不好直接决定老师对你这套毕设的第一印象分。文档里如果能把“为什么用GRU不用LSTM”“为什么用GAUC不用准确率”这类问题主动讲透答辩时老师就问不出能难住你的问题。5.3 答辩高频问题与现场演示技巧根据我接触过的答辩现场老师对这类系统最爱问的问题基本是固定的第一类数据相关。“你的数据是哪来的数据量多少怎么清洗的”如实回答就行用公开数据集就明确说出来。第二类模型相关。“为什么用GRU”“和其他模型对比过吗”“如何评估模型好坏”前面我把答案都备好了记住GAUC这个故事线。第三类系统相关。“预测结果怎么展示”“如果新来了用户没有历史行为怎么办”没有历史行为的用户通常用平均统计特征兜底或者直接归为一个“冷启动用户”类别。现场演示有一个特别实用的经验提前全部跑通一份完整流程不要在答辩现场训练模型。把训练好的模型文件放在项目里演示时直接从加载模型开始展示预测结果和大屏页面。即使是真实训练也把训练过程的日志截好图放进PPT而不是现场敲命令等进度条。另外大屏页面可能因为屏幕分辨率问题显示错位最稳妥的办法是答辩前一晚用答辩教室的电脑试一次或者预先截图多张图表作为兜底方案。这个项目后续还能怎么扩展最后再说几句题外话。做完这个毕设之后我的体会是这套系统的价值天花板不低因为它直接踩在推荐系统、用户增长分析这类真实业务方向上。如果之后你想继续深挖有几个明显的扩展方向。一是把预测结果做成实时推荐接口给每个用户实时返回“可能感兴趣的商品”这基本就是一个精简版推荐系统的雏形二是把模型升级成深度兴趣演化网络或者类似双塔模型结构这条路线在推荐领域有大量已经公开的工程方案可以参考三是加定时任务把训练好的模型在固定时间调度起来定期更新引入全流程自动化会是很棒的系统能力加分项。我实际操作中还有一个很深的体会这个项目从零开始会经历“数据清洗耗两周、模型调参耗一周、可视化被图表库折腾三天、论文憋半个月”的全过程真正推进时一定要记得给每个环节留足余量尤其是数据清洗它往往比预想中枯燥和耗时。但正因为整个链路覆盖了从原始数据到上线展示的全过程做完之后你对“数据系统”的认知会踏实非常多。本文还有配套的精品资源点击获取