尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ML-For-Beginners 实战:用南瓜回归模型重建 Flask Web 应用(“Try a different model“作业指南)
ML-For-Beginners 实战用南瓜回归模型重建 Flask Web 应用Try a different model作业指南【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners本篇技术指南围绕 ML-For-Beginners 课程第 3 单元3-Web-App作业任务展开当你已经用 UFO 数据集训练逻辑回归模型并构建了一个可用的 Flask Web 应用后如何从之前的回归课程中挑选另一个模型重新设计这个 Web 应用并正确调整输入以匹配新模型的训练方式。读完本文你将掌握模型消费端的完整迁移方法论——包括数据清理、模型 pickle 序列化、Flask 表单与预测路由的联动以及如何让输入输出契约跟随模型一起更换最终交付一个可以部署到云端的新 Web 应用。一、作业任务解读本质是换模型而不是换框架本作业translations/el/3-Web-App/1-Web-App/assignment.md英文原版见 3-Web-App/1-Web-App/assignment.md的要求非常明确现在你已经使用一个训练好的回归模型构建了一个 Web 应用请使用之前回归课程中的一个模型来重新设计这个应用。你可以保持原有风格也可以重新设计样式以反映南瓜数据。务必修改输入字段使其反映你所选模型的训练方法。这句话拆解出三个硬性验收点必须换模型UFO 应用里的模型不能再直接沿用需要从第 2 单元2-Regression的回归课程中挑选替代模型必须换输入原表单的三个输入Seconds、Latitude、Longitude与 UFO 模型的特征一一对应换了模型表单输入就必须对应新模型的特征这是最容易出错、也是作业特别提醒的环节必须能运行并部署评估标准明确要求应用按预期运行并部署到云端。对应的评估标准Rubric整理如下标准优秀Exemplary合格Adequate需改进Needs ImprovementWeb 应用功能与部署应用按预期运行并已部署到云端应用存在缺陷或出现意外结果应用无法正常运行也就是说仅仅本地能跑只能算合格完整得分的前提是部署上云。本文后续会给出一个可操作的部署检查清单云部署需注意关闭调试模式等。二、先回顾原应用UFO 预测 Web App 是怎么构建的要重新设计这个应用首先必须吃透原应用的构建链路。原应用完整教程见 3-Web-App/1-Web-App/README.md完整可运行源码见 solution 目录。整条链路分四步清理数据 → 训练模型 → pickle 序列化 → Flask 消费。2.1 为什么模型要序列化生产环境里训练和推理往往是分离的数据科学团队在 Notebook 里训练模型应用团队在 Web 服务里消费模型。本课程使用两个 Python 工具完成衔接Flask微框架提供路由、模板渲染等 Web 基础能力用来搭建消费模型的页面PicklePython 自带的序列化/反序列化模块。pickle.dump将模型对象压平成二进制文件后缀.pklpickle.load再还原。⚠️ 注意pickle 本身不安全不要反序列化来路不明的文件——这在换模型时同样适用请只加载你自己训练的.pkl。2.2 数据清理从 80,000 条 UFO 目击记录到训练集本课使用 NUFORC美国国家 UFO 报告中心收集的约 8 万条目击记录数据位于 3-Web-App/1-Web-App/data/ufos.csv包含city、state、country、shape、latitude、longitude等列。在配套的 notebook.ipynb 中按以下步骤处理import pandas as pd import numpy as np ufos pd.read_csv(./data/ufos.csv) ufos.head()# 只保留建模需要的四列并查看 Country 的唯一值 ufos pd.DataFrame({Seconds: ufos[duration (seconds)], Country: ufos[country], Latitude: ufos[latitude], Longitude: ufos[longitude]}) ufos.Country.unique()# 丢弃空值只保留目击时长 1-60 秒的记录减少数据规模 ufos.dropna(inplaceTrue) ufos ufos[(ufos[Seconds] 1) (ufos[Seconds] 60)] ufos.info()# LabelEncoder 按字母顺序把国家文本编码为数字 from sklearn.preprocessing import LabelEncoder ufos[Country] LabelEncoder().fit_transform(ufos[Country]) ufos.head()编码后数据形如Seconds/Country/Latitude/Longitude2 20.0 3 53.200000 -2.916667 3 20.0 4 28.978333 -96.645833 14 30.0 4 35.823889 -80.253611 23 60.0 4 45.582778 -122.352222 24 3.0 3 51.783333 -0.783333换模型的第一个启发文本类别 → 数字的转换LabelEncoder是在训练前完成的新模型的表单提交数值必须与编码后的语义一致。2.3 训练模型输入三个特征输出国家编号from sklearn.model_selection import train_test_split Selected_features [Seconds,Latitude,Longitude] X ufos[Selected_features] y ufos[Country] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state0)from sklearn.metrics import accuracy_score, classification_report from sklearn.linear_model import LogisticRegression model LogisticRegression() model.fit(X_train, y_train) predictions model.predict(X_test) print(classification_report(y_test, predictions)) print(Predicted labels: , predictions) print(Accuracy: , accuracy_score(y_test, predictions))该模型准确率约95%——并不意外因为Country与经纬度天然强相关。作者也明确提示这个模型并不革命性它的意义在于演示从清理数据 → 导出模型 → 在 Web 中消费的完整工程链路。2.4 pickle 序列化与验证import pickle model_filename ufo-model.pkl pickle.dump(model, open(model_filename,wb)) # 重新加载并预测一个样例[秒数, 纬度, 经度] model pickle.load(open(ufo-model.pkl,rb)) print(model.predict([[50,44,-12]]))输出3即英国UK的国家编码。仓库中已训练好的模型文件位于 solution/ufo-model.pkl。2.5 Flask 应用三个文件撑起一个预测页面在原 README 的指导下web-app目录结构如下web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl① requirements.txt作用类似 JavaScript 项目的package.json声明依赖scikit-learn pandas numpy flask安装cd web-app后执行pip install -r requirements.txt。仓库中的真实依赖清单见 solution/web-app/requirements.txt。② static/css/styles.css黑色背景的简约深色样式核心代码见 solution/web-app/static/css/styles.cssbody { width: 100%; height: 100%; font-family: Helvetica; background: black; color: #fff; text-align: center; letter-spacing: 1.4px; font-size: 30px; } input { min-width: 150px; } .grid { width: 300px; border: 1px solid #2d2d2d; display: grid; justify-content: center; margin: 20px auto; } .box { color: #fff; background: #2d2d2d; padding: 12px; display: inline-block; }③ templates/index.html注意两个 Jinja2 模板语法——{{ }}插值由后端注入的变量url_for(predict)生成路由地址表单以 POST 提交到/predict路由。完整代码见 solution/web-app/templates/index.html!DOCTYPE html html head meta charsetUTF-8 title UFO Appearance Prediction! /title link relstylesheet href{{ url_for(static, filenamecss/styles.css) }} /head body div classgrid div classbox pAccording to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?/p form action{{ url_for(predict)}} methodpost input typenumber nameseconds placeholderSeconds requiredrequired min0 max60 / input typetext namelatitude placeholderLatitude requiredrequired / input typetext namelongitude placeholderLongitude requiredrequired / button typesubmit classbtnPredict country where the UFO is seen/button /form p{{ prediction_text }}/p /div /div /body /html④ app.py模型消费的核心逻辑见 solution/web-app/app.pyimport numpy as np from flask import Flask, request, render_template import pickle app Flask(__name__) model pickle.load(open(./ufo-model.pkl, rb)) app.route(/) def home(): return render_template(index.html) app.route(/predict, methods[POST]) def predict(): int_features [int(x) for x in request.form.values()] final_features [np.array(int_features)] prediction model.predict(final_features) output prediction[0] countries [Australia, Canada, Germany, UK, US] return render_template( index.html, prediction_textLikely country: {}.format(countries[output]) ) if __name__ __main__: app.run(debugTrue)这段代码的运行流程是加载依赖并启动应用 →pickle.load导入模型 → 首页路由渲染index.html当表单 POST 到/predict时按表单字段顺序收集数值并转为 numpy 数组交给model.predict再把预测出的国家编号映射回可读的国家名最后回填模板。 提示debugTrue让 Flask 在代码改动后自动重载便于本地调试但生产环境严禁开启存在安全隐患。本作业要求部署到云端部署前务必移除或改为debugFalse。关键工程经验用 Flask pickle 消费模型的难点不在框架而在弄清楚模型预测所需的输入数据形状shape——它完全取决于模型训练时的特征。原模型训练用了 3 个特征所以表单有 3 个输入框这正是作业要求修改输入以反映模型训练方法的根本原因。三、挑选替代模型从第 2 单元回归课程取材作业指定使用之前回归课程中的一个模型。第 2 单元2-Regression提供了多个候选3-Linear 线性回归用南瓜价格数据集2-Regression/data/US-pumpkins.csv以Month、DayOfYear、Variety等特征预测每蒲式耳南瓜价格数值型输出是换模型重做最贴合的选择——因为作业明确提到重新设计以反映南瓜数据4-Logistic 逻辑回归同样是南瓜数据但预测的是二分类目标Color橙色/白色特征包括City Name、Package、Variety、Origin、Item Size等其他课程1-Tools、2-Data 侧重于工具与数据可视化。以线性回归预测南瓜价格为例对应课程 2-Regression/3-Linear/README.md模型的输入输出契约与 UFO 模型对比如下维度UFO 原模型逻辑回归南瓜新模型线性回归输入特征Seconds、Latitude、Longitude3 个数值Month/DayOfYear、Variety、Package、Item Size等输出国家编号0-4类别每蒲式耳价格连续数值输入处理全部为数值直接int()转换含文本类别特征需先LabelEncoder或 one-hot 编码展示映射countries[output]映射国家名直接展示数值或格式化为货币从源码结构看solution/web-app/app.py 中int_features [int(x) for x in request.form.values()]隐含假设表单所有字段都是可直接转 int 的数值。一旦换成含类别特征的南瓜模型这一行就必须重写——这正是作业强调改变输入的落点。四、迁移实现把 UFO 应用改造成南瓜价格预测应用下面给出基于 solution 源码风格的重建方案重点演示输入契约如何跟随模型变化。注意新模型需要先按 3-Linear 课程 的 notebook 流程训练课程指出其数据已预清理并计算了DayOfYear列再将模型 pickle 为pumpkin-model.pkl放到 web 应用目录。4.1 修改 requirements.txt保持四个基础依赖不变scikit-learn、pandas、numpy、flask若新模型使用了Pipeline等额外模块也无需新增依赖它们都在 scikit-learn 内。4.2 重写 app.py加载模型、改造路由核心变化有三处模型加载路径、表单数值收集逻辑处理类别特征、结果展示价格而非国家名。import numpy as np from flask import Flask, request, render_template import pickle from sklearn.preprocessing import LabelEncoder app Flask(__name__) # 加载新模型自行训练的南瓜价格模型 model pickle.load(open(./pumpkin-model.pkl, rb)) app.route(/) def home(): return render_template(index.html) app.route(/predict, methods[POST]) def predict(): # 注意这里需要按新模型的训练方式组织特征。 # 若模型包含对文本类别如 Variety的 LabelEncoder # 需先读取表单中的文本值并做同样的编码转换。 form request.form month int(form[month]) day_of_year int(form[day_of_year]) variety LabelEncoder().fit([PIE TYPE, FAIRYTALE]).transform([form[variety]])[0] final_features [np.array([month, day_of_year, variety])] prediction model.predict(final_features) price prediction[0] return render_template( index.html, prediction_textPredicted price per bushel: ${:.2f}.format(price), ) if __name__ __main__: app.run(debugFalse) # 部署到云端前必须关闭 debug上面LabelEncoder().fit(...)仅用于说明编码思路——实际实现必须复用训练阶段保存的同一个 encoder训练时一并 pickle或在模型中用Pipeline封装否则编码不一致会导致预测错乱。这是换模型后最隐蔽的坑。4.3 修改 index.html输入字段对应新特征原表单的seconds、latitude、longitude三个输入框需要替换为南瓜模型的特征字段例如月份、一年中的第几天、品种等form action{{ url_for(predict)}} methodpost input typenumber namemonth placeholderMonth (1-12) requiredrequired min1 max12 / input typenumber nameday_of_year placeholderDay of year (1-365) requiredrequired min1 max365 / input typetext namevariety placeholderVariety (e.g. PIE TYPE) requiredrequired / button typesubmit classbtnPredict pumpkin price/button /form p{{ prediction_text }}/p样式层styles.css可完全保留深色风格也可以按作业提示重新设计以反映南瓜数据调整配色——样式不影响模型契约属于自由发挥项。4.4 本地运行与验证cd web-app pip install -r requirements.txt python app.py # 或 python3 app.py浏览器打开本地地址填入表单值即可看到预测结果。验证要点用训练集里已知的样本数据如某月、某品种的真实价格回填检查输出是否与训练时的预测一致——这一步能快速暴露输入契约错位的问题。4.5 部署到云端达到优秀等级的关键按 Rubric已部署到云端才得满分。通用做法是把web-app目录推送到支持 Python 的 PaaS 平台如 Azure App Service、Render、Railway 等平台会根据requirements.txt自动安装依赖并启动app.py。部署前务必检查app.run(debugFalse)或使用平台注入的端口环境变量ufo-model.pkl/pumpkin-model.pkl与app.py的相对路径在部署环境同样有效建议使用os.path.join基于脚本目录构造绝对路径requirements.txt完整列出运行依赖。五、完成度自检清单对照 Rubric 自查提交前对照评估标准逐项检查新模型来自第 2 单元回归课程线性/逻辑回归皆可本文以南瓜价格线性回归为例表单输入已改为新模型的特征且与训练时的特征顺序、编码方式完全一致app.py的predict路由能正确处理新模型输出数值价格 vs. 类别编号的展示方式不同本地python app.py运行无报错用已知样本验证预测结果合理已部署到云端线上地址可访问未开启debugTrue样式可选重新设计以反映南瓜数据主题。六、进阶挑战在 Flask 应用内直接训练模型原 README 的 Challenge 提出了一个延伸方向不经过 Notebook 和 pickle直接在 Flask 应用里训练模型——即在数据清理完成后为应用增加一个train路由在应用进程内完成model.fit()预测路由直接复用内存中的模型对象。这种方法的好处是省去了训练环境 → 部署环境的模型搬运和版本同步问题代价是每次启动应用都要重新训练耗时随数据量增长、Web 进程与训练负载耦合不利于扩展且调试与实验迭代体验不如 Notebook。这也是作业要求之外值得思考的架构权衡模型应该驻留在应用内还是存放在云端由 API 提供会直接影响整个应用的技术选型。七、小结本作业的核心不在换一个模型跑通而在于理解模型输入输出契约contract对 Web 应用形态的约束。回顾整条链路UFO 应用是3 个数值特征 → 类别编号南瓜价格应用则是混合特征含类别→ 连续数值差异直接体现在表单字段、编码逻辑和结果展示三处。通过 solution 目录的完整源码对照练习你就能掌握训练与消费解耦的通用能力——这也是数据科学团队与 Web 工程团队协作时最关键的接口知识。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

comprehensive-rust 教程:在 AOSP 中构建、部署与调用 Rust Binder 服务(birthday_server 实战指南)

comprehensive-rust 教程:在 AOSP 中构建、部署与调用 Rust Binder 服务(birthday_server 实战指南)

comprehensive-rust 教程:在 AOSP 中构建、部署与调用 Rust Binder 服务(birthday_server 实战指南) 【免费下载链接】comprehensive-rust This is the Rust course used by the Android team at Google. It provides you the material to qu…

📅 2026/9/10 15:41:07
如何用 dart_roll_helper.py 把新的 Dart SDK 版本 roll 进 Flutter 引擎

如何用 dart_roll_helper.py 把新的 Dart SDK 版本 roll 进 Flutter 引擎

如何用 dart_roll_helper.py 把新的 Dart SDK 版本 roll 进 Flutter 引擎 【免费下载链接】flutter Flutter makes it easy and fast to build beautiful apps for mobile and beyond 项目地址: https://gitcode.com/GitHub_Trending/flutter41/flutter Flutter 仓库通过…

📅 2026/9/10 15:36:06
SQL基础语句精要:从查询到优化的实用指南

SQL基础语句精要:从查询到优化的实用指南

1. SQL基础语句概述SQL作为关系型数据库的标准查询语言,是每个开发者必须掌握的核心技能。我在实际工作中发现,80%的数据库操作都集中在20%的基础SQL语句上。本文将系统梳理这些高频使用的SQL基础语句,涵盖数据查询、操作、表管理等核心功能模…

📅 2026/9/10 15:36:06
MORE NEWS

更多资讯

📰

AI Agent+DevEco CLI:从零自动生成、构建并安装鸿蒙应用全流程实测

最近我一直在折腾一件事:让AI Agent不停留在“生成代码片段”这个层面,而是真正自己把一个鸿蒙应用从零写出来、编译通过、装进设备。搞了一圈之后发现,完成这条链路的关键不是AI模型选哪个,而是DevEco CLI这套命令行工具链能不能…

📰

Solid Query 查询失效指南:invalidateQueries 的精确匹配、后台重取与底层实现

Solid Query 查询失效指南:invalidateQueries 的精确匹配、后台重取与底层实现 【免费下载链接】query 🤖 Powerful asynchronous state management, server-state utilities and data fetching for the web. TS/JS, React Query, Solid Query, Svelte Q…

📰

燕千云:国产IT运维解决方案助力企业数字化转型

1. 燕千云:本土企业IT运维体系的破局者在数字化转型浪潮中,IT运维体系正面临前所未有的挑战。传统运维工具效率低下、响应迟缓,而国际主流平台如ServiceNow又存在本地化适配不足、数据安全合规风险等问题。燕千云作为国产IT运维解决方案的代表…

📰

方向难找不用愁:2026有AR增强现实导航定位系统推荐

2026年,随着公共场馆、工业园区及医疗机构数字化升级加速,AR增强现实导航定位系统成为解决室内寻路难题的关键工具。面对市场上繁杂的方案,如何精准选型?本文将以北京大希科技有限公司的全链条服务能力为例,从选型维度…

📰

opencode不是工具,而是源码级开发行为与环境治理方法论

1. “opencode”不是产品名,而是一类开发行为的统称——从热词混乱中厘清真实语义你搜“opencode”,页面弹出一堆 npm 报错、VS Code 插件失效、ARM 头文件找不到、PowerShell 执行被拒……但翻遍 GitHub、npm 官网、主流 AI 工具平台,根本找…

📰

会议录音不发云端:Buzz 三步离线转文字的完整走法

会议录音不发云端:Buzz 三步离线转文字的完整走法 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz Buzz 是一款离线…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬