ARTICLE DETAIL

资讯详情

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

基于随机森林的空气质量预测系统:从Django后端到Vue前端的毕设实战

基于随机森林的空气质量预测系统:从Django后端到Vue前端的毕设实战 这个标题拆开来看其实很有意思随机森林、空气质量指数预测、Django、Vue再加上“大数据深度学习毕设”这个包装。很多同学第一眼就被吓住觉得又是大数据又是深度学习又是前后端分离一听就是个“大工程”。但实际上这类项目真正落地的时候核心就三件事一份能用的数据、一个训练好的模型、一条从前端到后端再到模型推理的完整链路。我今年带过几批做同类毕业设计的学弟学妹也自己完整走过几遍这个流程今天就把从选题拆解到前后端联调的完整经验写出来。先说清楚什么是“空气质量指数预测”。AQI这套体系大家应该不陌生就是根据SO2、NO2、PM10、PM2.5、CO、O3这几项污染物浓度按照国标换算成空气质量分指数再取最大值得出综合指数。预测系统要做的就是给模型一批历史污染数据和气象数据让模型学会从这些特征里去预测未来某时刻的AQI数值。本质上是一个回归问题不是分类问题。很多毕设题目里写着“预测系统”最后做出来却是一个“分类器”预测“优/良/轻度污染/中度污染/重度污染/严重污染”六个等级这其实已经偏离了“预测指数”的本意。我建议所有做这个题目的同学目标直接定义为预测连续AQI数值做完数值预测之后再根据数值映射到等级展示这样一个系统既满足“指数预测”也能可视化展示等级。为什么要选随机森林而不是更“高级”的深度学习模型这是很多人的第一反应也是标题里最唬人的地方。有些人一看到“深度学习算法毕设”就想着上CNN、LSTM、Transformer觉得随机森林“太简单”撑不起毕设的“科技感”。但真做了之后你会发现空气质量预测这个场景数据量通常就是几千到几万条结构化表格特征无非就是污染物浓度、温度、湿度、风速、气压、季节、时段。这种场景恰恰是随机森林和XGBoost这种集成学习模型的舒适区深度学习模型在这种小规模表格数据上反而不容易发挥优势还容易过拟合训练周期也更长。我做对比测试时用同一份数据集随机森林R²能到0.85以上简单的LSTM模型调半天也只能到0.82左右差异真的不大。毕设答辩的时候老师问“为什么不用深度学习”你完全可以有理有据地回答深度学习擅长处理高维非结构化数据比如图像、文本、语音而结构化表格数据上树模型有更好的精度和可解释性。这个回答反而比“因为深度学习太难了”显得专业得多。围绕这个思路我会从五个方面展开说系统整体设计、随机森林原理与数据处理、Django后端实现、Vue前端对接、踩坑实录。内容比较长但每一步都是可以直接复现的操作。1. 项目整体设计与技术选型背后的取舍做毕设和做企业项目最大的区别是毕设既要“能跑起来”又要“体现出工作量”还必须在答辩时讲得出原理。所以整体设计不能只盯着某一个环节而要站在一条完整数据链路上思考。我一般会把系统分成三层数据层、算法层、应用层。数据层负责采集和存储历史空气质量数据和气象数据算法层负责特征工程、模型训练和评估应用层就是Django后端加Vue前端提供用户交互界面、数据可视化和实时预测功能。这个三层结构对应到论文里就是几个章节对应到代码里就是几个独立的目录和模块边界清晰写起来不混乱。1.1 为什么是随机森林经典机器学习比深度学习更适合这个场景先解释一下“大数据深度学习算法毕设”这个标题里的水分。随机森林属于集成学习是经典机器学习方法不是深度学习。深度学习特指基于多层神经网络的模型比如CNN、RNN、Transformer。现在很多项目标题喜欢把大数据、深度学习、人工智能这些词混合使用实际内容还是传统机器学习。这不能说错毕设题目本身允许“大数据挖掘”这类广义表述但你心里要清楚自己做的到底是什么不然答辩的时候一问就露怯了。回到技术选型本身。空气质量预测的数据格式非常典型一条记录包含若干污染物浓度值、气象特征值、时间戳。这种数据表格高度结构化特征之间既有线性关系也有非线性关系最关键的是特征维度不算高一般也就10到20个特征字段。随机森林对这种情况有很多天然优势它对特征尺度不敏感不需要做归一化决策树在分裂时会自动处理不同量纲它能捕捉非线性关系和特征交互污染物浓度和气象条件之间的关系确实不是简单线性它内置了特征重要性评估可以直接输出每个特征对预测结果的贡献排序这一条在论文里特别好写答辩老师也很吃这一套。相比之下深度学习模型虽然表达能力更强但需要更大的数据量来支撑。毕设能拿到的空气质量数据集撑死几万条很多学校自己采集的可能就几千条。这点数据喂给LSTM很难学出稳定的时序依赖更不用说Transformer这种动辄百万级参数的模型。我在实验中发现当训练集只有5000条样本时随机森林的R²稳定在0.85左右而LSTM的R²只有0.79到0.83浮动不说训练时间还是随机森林的十几倍。这还没算调参的试错成本。所以我的结论很明确如果你不是专门做深度学习方向的研究型课题空气质量指数预测这种项目用随机森林是性价比最高的选择。1.2 DjangoVue前后端分离的架构定位标题里写了Django和Vue这就决定了系统形态是一个Web应用而不是一个本地跑个命令行脚本加一个matplotlib图表的“玩具”。Django作为后端承载的是模型推理接口、数据管理和用户交互逻辑Vue作为前端负责渲染页面、图表展示和表单交互。前后端通过HTTP接口通信标准RESTful风格前端发一个包含输入参数的请求后端返回模型的预测结果。选Django的理由很实际Python是机器学习生态最成熟的语言模型训练代码和Django后端可以直接共用一套Python环境模型文件用joblib或pickle导出后Django直接加载推理完全没有跨语言跨平台的问题。如果换Java Spring Boot做后端那还得分一个Python服务去跑模型系统复杂度直接翻倍对毕设来说没有必要。Vue这边我用的是Vue 3 Vite Element Plus ECharts。Vue 3的Composition API写起来比较清爽适合模块化管理预测表单和图表状态。ECharts用于展示历史AQI趋势曲线、污染物浓度雷达图、预测结果对比柱状图。这套组合在清华、GitHub上都有大量现成示例遇到样式问题很好查。前后端分离架构的另一个好处是职责清晰分工明确。前端只管发请求和渲染数据后端只管处理数据和返回结果联调的时候只需要盯着接口文档。答辩的时候架构图、接口文档、代码目录结构都能直接展示设计思路。1.3 系统功能模块划从用户能做什么来倒推设计我在设计模块时习惯从用户视角倒推不直接一上来就写代码。针对这个系统我把核心用户场景列了四类每一类对应一组功能场景一用户想查询某一天或某一时段的空气质量情况对应数据查询模块展示历史记录、趋势图、污染物雷达图。场景二用户想根据当前的污染物和气象参数预测未来的AQI值对应指数预测模块用户在前端表单里输入SO2、NO2、PM2.5、PM10、CO、O3、温度、湿度、风速等参数后端调用随机森林模型返回预测结果和空气质量等级。场景三用户想了解模型的准确度和各因素的影响力对应模型评估模块展示测试集上的R²、RMSE、MAE这几个指标并附上特征重要性排序图。场景四管理员需要管理数据和模型对应数据管理模块提供数据上传入口、历史数据列表、模型重训练入口等功能。这四个模块拆分出来之后前端路由、后端API、数据库表结构就都清楚了。前端路由大概就是首页仪表盘、历史数据、AQI预测、模型分析、数据管理这几个页面。后端API对应数据接口、预测接口、模型评估接口、数据上传接口。数据库表至少需要一张历史监测数据表记录采样时间、各污染物浓度、气象参数和对应的AQI值。2. 随机森林回归核心原理与数据处理要点2.1 随机森林回归是如何工作的随机森林是一个由多棵决策树组成的集成模型核心思想可以用一句话概括三个臭皮匠顶个诸葛亮。每棵决策树都独立地在训练集的随机子集上学习最终预测值是所有树预测结果的平均值回归场景或者投票结果分类场景。具体来说它有两个关键随机机制。第一是Bagging采样随机性从原始训练集中有放回地随机抽取样本每棵树使用的样本集合都不同。这样能保证每棵树各有侧重点不会所有树都学到一模一样的内容。第二是特征随机性在每棵树、每个节点的分裂过程中不是从所有特征里挑最优分裂点而是从随机抽取的一部分特征子集中选择。这样做的好处是防止某些强特征被所有树反复使用导致树与树之间高度相似集成效果大打折扣。最终预测时回归问题取所有决策树预测值的算术平均这是在聚合大量“略有差异但都偏向真实值”的预测从而有效降低方差。你可以把它类比成“让多个经验不同的预测员各自独立判断然后取平均”——单个人可能错得离谱但平均下来错误往往会相互抵消。这也是随机森林在表格数据上表现稳定、不容易过拟合的根本原因。针对空气质量预测这个特性特别有价值AQI数值受很多因素影响噪声比较大单棵决策树容易学过头随机森林的随机采样和平均策略正好能在噪声环境下保持稳定。我训练出来的模型特征重要性排序里PM2.5通常是第一名其次是PM10和湿度风速对AQI的影响相对较弱这个结果从环境科学角度是合理的也说明模型确实学到了一些领域的先验规律。2.2 空气质量数据预处理流程训练模型之前数据质量决定了模型的“天花板”。很多同学直接拿原始CSV喂给模型训练出来的预测结果一团糟然后又去疯狂调参其实问题根本不在参数而在数据。空气质量监测数据常见的坑有三个。第一个坑是缺失值。站点设备检修、网络传输故障都会导致某小时或某天的数据缺失。处理方式一般是在时间序列上做线性插值或者用前后邻近时刻的平均值填充。对于少量缺失比如小于5%直接删除该行也可以但如果缺失比例较高删除行会导致时间不连续后面的时序特征提取会出问题所以我会优先用前后两小时的数据做线性插值。第二个坑是异常值。设备标定误差、特殊污染事件有时候会制造极端离谱的数据比如某条记录的PM2.5达到9999。处理方法是先用箱线图或3σ原则识别离群点再决定是修正还是剔除。我在实际操作中规定如果某个污染物浓度超过正常物理上限的5倍判定为设备故障产生的异常值予以剔除或替换为邻域中位数。这里要特别注意不能用简单的“删除所有离群点”思路因为某些极端值可能就是真实的重污染事件全删掉会破坏模型对极端情况的泛化能力。第三个坑是特征尺度差异。NO2浓度单位是ug/m³范围在10到150之间而CO浓度的单位是mg/m³范围只有0.3到2.5左右具体数值域相差很大。对于随机森林而言这是小问题因为决策树只关心分裂点的相对大小不受绝对值影响。但如果你习惯性地套用深度学习的数据处理流程把数据做了标准化那对随机森林来说反而没有意义白做。真正值得做的事情是特征工程。空气质量预测的特征工程一般包括两类。一类是时间特征把采样时间拆成年、月、日、小时、星期几、是否节假日、是否供暖季另一类是气象交互特征比如温度湿度配合产生的体感指标、风速风向和污染物浓度结合起来的扩散条件指数。特征工程做完之后模型效果会有明显提升。我的经验是时间特征里的“小时”和“是否供暖季”对北方城市的数据特别重要冬季供暖期燃煤排放直接拉高PM2.5浓度模型如果不掌握这个信号预测精度会掉一大截。2.3 超参数调优与评估指标随机森林最核心的超参数有三个n_estimators决策树数量、max_depth树的最大深度、max_features每次分裂考虑的特征数量。这三个参数的价值在于控制模型的复杂度和鲁棒性。n_estimators太小模型不够稳定不同次训练结果差异大太大训练时间线性增长但精度提升趋于平缓。我在实验中画过学习曲线当n_estimators到100棵之后测试集误差基本进入平台期200棵和500棵差距微乎其微所以最终选定了200棵。 max_depth控制单棵树长多深。深度太小模型欠拟合捕捉不到复杂关系深度太大单棵树过拟合虽然集成模型有一定免疫能力但会带来不必要的方差。空气质量数据量不大我在调优时把max_depth设置在5到15之间做网格搜索最优结果是9。这个深度已经足够捕捉污染物之间的交互关系了。 max_features是分裂时随机抽取的特征数默认值是特征总数的平方根。做回归任务时一般用不到太多设置在3到5之间效果都不错我用GridSearchCV网格搜索最终确定了4。模型评估指标用三个R²决定系数、RMSE均方根误差、MAE平均绝对误差。R²表示模型能解释多少比例的数据方差越接近1越好RMSE和MAE衡量预测值与真实值的偏差数值越小越好。RMSE对大误差更敏感如果测试集上RMSE比MAE大非常多说明模型对某些极端污染事件预测得很差这刚好是空气质量预测的难点之一重污染日样本少且往往伴随复杂的物理化学过程模型很难准确预测。我在最终模型上的指标大约是R²0.86、RMSE14.2、MAE9.8。作为对比当天如果直接用前一天AQI做朴素预测R²只能到0.72随机森林的提升是实打实的。3. Django后端与Vue前端的完整联调实现3.1 Django项目骨架构建与数据模型动手写代码之前先确认本机的Python版本推荐3.9以上。在虚拟环境里安装依赖注意不要直接在全局环境里装否则后面打包部署会带来一堆依赖冲突问题。核心依赖有django、djangorestframework、django-cors-headers、joblib、pandas、scikit-learn、numpy。PANAS是数据处理的基础库scikit-learn直接提供RandomForestRegressor。创建项目和管理应用执行以下命令django-admin startproject aqi_project cd aqi_project python manage.py startapp prediction这里注意一个点Django的项目名和app名不要太随意因为后面写的引用路径、自动生成的数据库表都会带上这些名字。我见过有人起名为test2结果代码里到处都是test2.urls、test2.settings看着就头疼。数据模型方面我建了一张历史监测数据表字段包括采样时间、SO2、NO2、PM10、PM2.5、CO、O3、温度、湿度、风速、AQI。如果你在数据集里没有直接给出AQI字段就需要根据《环境空气质量标准》的插值计算规则手动算出来这个过程本身就是论文里很好的一个“方法设计”章节素材。from django.db import models class AirQualityRecord(models.Model): timestamp models.DateTimeField() so2 models.FloatField() no2 models.FloatField() pm10 models.FloatField() pm25 models.FloatField() co models.FloatField() o3 models.FloatField() temperature models.FloatField() humidity models.FloatField() wind_speed models.FloatField() aqi models.IntegerField() class Meta: db_table air_quality_record ordering [timestamp]数据导入不需要手工一条条插用python脚本批量读取CSV再遍历写入就行。我写了一个import_data.py脚本放在app目录下通过python manage.py shell执行。这个脚本在论文里可以作为“数据采集与预处理”部分的关键代码。3.2 模型预测接口的实现细节模型训练完之后不能每次预测都重新训练一遍而是要把训练好的模型保存成文件。scikit-learn的标准做法是使用joblib。import joblib joblib.dump(rf_model, prediction/models/rf_aqi_model.pkl)前端请求预测的时候Django从磁盘加载这个pkl文件对输入参数做特征变换然后调用模型的predict方法返回预测值。这里有一个坑Django视图函数每次处理请求时如果都重新加载一次模型文件高并发场景下会有严重的IO性能问题。解决办法是在模块加载时就把模型对象放到全局变量里后续请求直接复用。我一般用一个model_loader.py模块import joblib import os _model None def get_model(): global _model if _model is None: model_path os.path.join( os.path.dirname(__file__), models, rf_aqi_model.pkl ) _model joblib.load(model_path) return _model预测接口的API设计用Django REST Framework的api_view装饰器来实现。接收前端POST请求JSON格式携带特征字段。后端校验参数完整性和数值合法性然后构造二维数组输入到模型返回预测AQI值和对应的空气质量等级。api_view([POST]) def predict(request): try: data request.data features np.array([[ float(data[so2]), float(data[no2]), float(data[pm10]), float(data[pm25]), float(data[co]), float(data[o3]), float(data[temperature]), float(data[humidity]), float(data[wind_speed]) ]]) model get_model() result model.predict(features)[0] return JsonResponse({ code: 0, predicted_aqi: round(result, 2), level: aqi_level(round(result)) }) except Exception as e: return JsonResponse({code: 1, error: str(e)})注意一个问题Django自带的JsonResponse接收dict的时候默认只能处理Python内置数据类型numpy的float32类型会被当成不合法对象。用.round()方法先转为Python float再塞进dict里是最简单的规避方式。这个问题我踩过当时报错信息是TypeError: Object of type float32 is not JSON serializable排查了好一会儿才反应过来。跨域问题的处理开发环境下前端跑在Vite的5173端口后端跑在8000端口端口不同就属于跨域请求。需要在settings.py里配置django-cors-headersINSTALLED_APPS [ ... corsheaders, ] MIDDLEWARE [ corsheaders.middleware.CorsMiddleware, ... ] CORS_ALLOW_ALL_ORIGINS True注意CORS中间件要放在CommonMiddleware之前如果位置不对跨域请求依然会被拦截。这个细节很隐蔽Django文档也只是简单提了一嘴实际排错时容易忽略。3.3 Vue前端交互与实时推送Vue端的搭建我直接用的Vite你执行npm create vitelatest frontend -- --template vue就行然后安装vue-router、axios、element-plus、echarts这几个依赖。页面组件划分Dashboard.vue作为首页展示整体概览HistoryView.vue负责历史数据表格和图表PredictView.vue包含预测表单和结果展示ModelView.vue展示模型指标和特征重要性图。路由通过vue-router配置注意用createWebHashHistory模式。在开发阶段hash模式能避免刷新页面时404的问题部署到生产环境的访问路径也更灵活。前端发请求的封装很简单。在src目录下建一个request.js用axios实例统一配置baseURL指向Django接口地址。// src/request.js import axios from axios const request axios.create({ baseURL: http://127.0.0.1:8000/api, timeout: 30000 }) export default request预测表单提交的逻辑是这样按钮点击后把表单字段拼装成一个对象通过request.post(/predict, payload)发送到后端。拿到返回的predicted_aqi之后在页面上渲染出来同时触发ECharts的更新。除了常规的请求-响应模式我还做了一部分实时推送的尝试。热词里有人搜“python django websocket实现后台有数据前端推送”这个需求一般出现在两类场景一类是后台重训模型、进度推送给前端另一类是站点数据周期性刷新。如果要做WebSocketDjango接入django-channels框架来实现。先安装channels再在settings.py里配置ASGI_APPLICATION和channel layer然后新建异步消费者类用channels的AsyncWebsocketConsumer接收和发送消息。但这里我要说句实话对毕设项目来说如果你只是要一个周期性刷新效果用前端的setInterval定时器轮询接口就足够了完全不需要上WebSocket。WebSocket主要的价值是减少无意义请求但这套系统本身访问量有限定时3秒拉一次数据完全不会造成压力。把WebSocket这种异步通信架构加进来会增加部署的复杂度对核心功能的加分其实有限。我在项目里保留了WebSocket的通道设计作为扩展方向但最终演示时用的还是轮询方案稳定性更高。4. 实操踩坑记录与排查速查表4.1 数据与模型层面的坑数据层面最容易出问题的就是中文编码。很多空气质量数据是CSV格式用Excel保存时喜欢带一个UTF-8 BOM头或者干脆是GBK编码。你用pandas读取时如果不指定encoding参数会出现解析乱码。解决办法是在read_csv时加入encodinggbk或utf-8如果都不对就打开文件用记事本另存为UTF-8编码再处理。模型层面的坑主要是特征对齐问题。我训练模型时用了9个特征但前端如果少传了一个字段或者后端取参数的key拼写错误predict方法输入维度就不匹配模型直接抛错。所以接口端务必要做参数数量校验。我在实际调试时就遇到过前端传的是pm25后端的字段名写的也是pm25但Vue表单model里绑定的是pm2_5导致请求发出后后端给的错误提示是“缺少pm25参数”。这种前后端字段名不一致的问题靠肉眼很难发现我后来约定所有前后端共享字段名统一维护在一个接口文档里前后端同时对照文档开发。还有一类隐蔽问题是训练集和测试集的时间分布。如果直接把数据集随机打乱分成训练集和测试集模型会“偷看”到邻近时间段的数据测试指标会虚高。正确做法是按时间顺序切分比如用前80%时间区间的数据训练后20%数据测试这样评估结果才符合实际应用场景。很多教程里不讲这个细节我是在自己实验时发现测试集R²0.89换成时间序列切分后掉到0.86才意识到随机切分导致的信息泄漏。4.2 Django与前端联调问题联调阶段最容易遇到的问题有三个。一是跨域问题前面已经提过CORS中间件位置不对或者CORS_ALLOW_ALL_ORIGINS没有设置浏览器控制台会报错。典型报错是Access to XMLHttpRequest has been blocked by CORS policy这个报错很直白看到它基本就是CORS的问题。二是前端调用接口时报404。这个问题大概率是路由没配对。Django的urls.py里配置了path(api/predict, predict_view)但前端baseURL里已经带上了/api前缀请求发出时就变成了/api/api/predict。所以一个原则baseURL里加了的前缀Django的urls里就不要再写一遍。三是前端页面拿到数据之后不渲染。排查思路是先看浏览器网络的Response是不是真的有数据真的有数据就看Vue代码是不是操作了错误的数据结构。我踩过的坑是接口返回JSON结构是{code: 0, predicted_aqi: 43.2}我在Vue里写的是res.data.data.aqi取不到值导致页面空白。解决方法是加一层console.log打出来看实际返回结构。这句话说起来像废话但排查时最有用的永远就是它。4.3 部署与打包注意事项毕设项目最后通常需要演示最稳妥的方案是在本机同时跑两个服务。但你如果要交一个“开箱即用”的项目包给老师可以考虑前端构建后由Django托管静态文件。操作方式前端执行npm run build把dist目录下的静态文件复制到Django的static目录然后Django配置一个路由指向index.html。需要注意Vue Router如果是history模式需要配置Django对所有非api路由都返回index.html否则刷新页面就会404。这就是前面推荐hash模式的原因——hash模式不需要服务端配置刷新也不会丢路由。数据库方面如果你的项目要换机器演示SQLite数据库文件需要一并拷贝路径不要写死成绝对路径用BASE_DIR拼接相对路径。我见过有人把数据库路径写成C:/Users/xxx/...换一台电脑就启动失败这个低级错误在答辩时特别尴尬。还有一个容易被忽略的点模型文件大小。随机森林模型保存到pkl文件后可能只有几十MB到几百MB。如果你的Git仓库里有这个文件提交代码时要注意。GitHub对单文件100MB以上会限制上传建议用Git LFS或者在部署时单独从网盘下载模型文件。毕设代码仓库一般建议把模型文件放在公共网盘代码里写好加载路径即可。5. 扩展思路与最终建议5.1 如何把这个项目拔高一个档次如果只做随机森林预测加页面展示内容略显单薄。想拿高分可以考虑加三块内容。第一是模型对比模块。在系统里同时训练随机森林、决策树、线性回归、KNN这几种模型用相同的测试集计算指标展示在一张对比表格和柱状图里。这一步能直接体现你的对比实验能力也是论文里“实验分析”章节的核心数据。第二是特征重要性分析。随机森林自带feature_importances_属性按重要性排序后与领域知识结合分析。比如我的实验结果是PM2.5和PM10最具决定性其次是O3温度和湿度的影响需要看季节——冬季温度越低反而AQI越高因为供暖排放加剧。这种分析不仅展示技术能力还能体现你对业务问题的理解。第三是数据可视化。ECharts可以做很多值得展示的图表AQI小时变化折线图、污染物浓度雷达图、预测值与真实值散点图、模型特征重要性横向柱状图、不同季节AQI分布箱线图。答辩时PPT上放几张高质量图表比贴一堆代码强得多。5.2 答辩时容易被问到的几个问题把这些问题准备好基本能平稳过关。“随机森林为什么会比单棵决策树准确率高”答案是集成学习降低了方差。单棵决策树容易过拟合训练集中的噪声而随机森林通过样本抽样和特征抽样让每棵树“各有所长”取平均后系统性偏差不变随机性误差互相抵消。“有哪些特征你是怎么做特征工程的”按实际字段回答强调时间特征、季节特征和气象特征的组合。“模型评估指标为什么选RMSE”因为RMSE单位与AQI一致且对大误差惩罚更大。你可以补充一句RMSE对极端污染日预测失败非常敏感这正好对应这个项目的实际应用场景。“如果让你把模型部署上线你会怎么做”答上来“Django加载模型文件保持常驻内存不做实时训练通过API接收请求返回结果”就足够了。如果还知道加一层Redis做缓存那就更有亮点。5.3 写在最后的个人体会这个项目做完之后我最大的感受是随机森林本身不难难的是整个工程链路里的细节。数据清洗、特征对齐、模型保存路径、CORS配置、字段命名统一、构建部署每一个环节都可能让一个看起来很简单的系统跑不起来。毕设项目选这个题目最大的收获不是学会了某个算法而是把“算法能力”真正落地成“一个可交付的系统”这个过程里踩过的坑才是未来工作中最有用的经验。如果你现在正卡在某个环节建议按这个思路排查先确认数据格式没问题再确认模型能单独跑通预测最后再去联调前后端。从后往前逆推往往比从前往后顺推更容易定位问题。祝顺利。
返回列表