示例工程机器学习深度学习【免费下载链接】python-machine-learning-book-2nd-editionThe Python Machine Learning (2nd edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book-2nd-edition点击查看免费下载本篇技术指南围绕《Python Machine Learning第 2 版》第 9 章展开讲解如何把一个训练好的 scikit-learn 情感分类模型电影评论分类器封装成可在浏览器中使用的 Flask Web 应用。你将掌握序列化 scikit-learn 估计器、基于 SQLite 存储数据、使用 WTForms 做表单校验与渲染、以及将应用部署到公网服务器的完整流程并理解movieclassifier与movieclassifier_with_update两个版本在增量学习上的差异。第 9 章概览从 Notebook 到 Web 应用本章是本书从离线实验走向线上产品的关键一章其技术路线可归纳为五个环节序列化训练好的 scikit-learn 估计器pickle 持久化模型与词表组件搭建 SQLite 数据库用于存储用户提交的评论及标注结果使用 Flask 开发 Web 应用把模型预测能力暴露为 HTTP 接口表单校验与渲染借助 WTForms 提升交互健壮性部署到公网服务器并支持基于新反馈的在线增量更新。仓库中与本章配套的完整实现位于 code/ch09其中包含四个可直接运行的 Flask 应用目录以及配套的 ch09.ipynb完整教学 Notebook和movie_data.csv.gz50,000 条 IMDb 电影评论语料压缩包约 25 MB。四个 Flask 应用目录代码演进路线code/ch09/README.md 明确给出了四个目录的分工它们构成一条从最小可运行到可增量更新的渐进式演进路径目录定位1st_flask_app_1最简单的 Flask Web 应用仅渲染一个静态表单页1st_flask_app_2在1st_flask_app_1基础上引入 WTForms 表单校验与渲染movieclassifier把电影评论分类器完整嵌入 Web 应用movieclassifier_with_update与movieclassifier功能相同但启动时会从 SQLite 数据库读取历史反馈增量更新模型本地运行方式原文档给出的启动方式完全适用于当前仓库。进入任一应用目录后执行主脚本即可例如cd code/ch09/1st_flask_app_1 python3 app.py终端中会出现类似如下的输出表示 Flask 内置开发服务器已启动* Running on http://127.0.0.1:5000/ * Restarting with reloader随后在浏览器地址栏输入终端显示的地址通常为http://127.0.0.1:5000/即可访问该应用。需要说明的是这一运行方式依赖本地已安装 Flask、WTForms、scikit-learn、numpy 等依赖且app.run(debugTrue)仅在开发调试场景下使用若面向公网部署应改用 WSGI 服务器如 gunicorn并关闭 debug 模式。第一步序列化 scikit-learn 估计器pickle 持久化Web 应用无法每次请求都重新训练模型因此第 9 章的第一步是把训练好的模型与文本特征提取器冻结为可复用文件。在 movieclassifier 中这一目标通过两个 pickle 文件实现pkl_objects/classifier.pkl训练好的分类器对象pkl_objects/stopwords.pkl停用词集合供特征提取时过滤。模型加载逻辑位于 movieclassifier/app.pycur_dir os.path.dirname(__file__) clf pickle.load(open(os.path.join(cur_dir, pkl_objects, classifier.pkl), rb)) db os.path.join(cur_dir, reviews.sqlite)这里使用os.path.dirname(__file__)定位应用所在目录确保无论从哪个工作目录启动脚本都能正确找到pkl_objects与reviews.sqlite——这是 Web 应用部署时常见的路径陷阱值得在自定义部署时沿用。与模型配套的特征提取器由 movieclassifier/vectorizer.py 提供from sklearn.feature_extraction.text import HashingVectorizer import re import os import pickle cur_dir os.path.dirname(__file__) stop pickle.load(open( os.path.join(cur_dir, pkl_objects, stopwords.pkl), rb)) def tokenizer(text): text re.sub([^]*, , text) emoticons re.findall((?::|;|)(?:-)?(?:\)|\(|D|P), text.lower()) text re.sub([\W], , text.lower()) \ .join(emoticons).replace(-, ) tokenized [w for w in text.split() if w not in stop] return tokenized vect HashingVectorizer(decode_errorignore, n_features2**21, preprocessorNone, tokenizertokenizer)这里使用了HashingVectorizer哈希向量化其关键在于n_features2**21把文本映射到约 209 万维的稀疏特征空间decode_errorignore可容忍编码噪声preprocessorNone并自定义tokenizer分词器先用正则剔除 HTML 标签[^]*、提取表情符号如:)、:D、;(再把剩余非单词字符替换为空格最后过滤停用词由于哈希向量化无需保存词汇表因此在线预测时无需维护词表文件配合 pickle 模型即可完成完整的离线训练、在线部署闭环。第二步SQLite 数据库存储用户反馈情感分类器的价值不仅在于预测还在于收集用户反馈以持续改进。第 9 章用 SQLite 作为轻量级存储方案movieclassifier/app.py 中的写入函数如下def sqlite_entry(path, document, y): conn sqlite3.connect(path) c conn.cursor() c.execute(INSERT INTO review_db (review, sentiment, date)\ VALUES (?, ?, DATETIME(now)), (document, y)) conn.commit() conn.close()SQL 使用参数占位符?绑定用户输入避免 SQL 注入DATETIME(now)自动记录提交时间。仓库中已包含一份可直接连接的数据库文件 code/ch09/reviews.sqlitemovieclassifier目录内也各有一份reviews.sqlite其中review_db表按(review, sentiment, date)三列组织数据。第三步用 Flask 搭建第一个 Web 应用3.1 最小应用1st_flask_app_11st_flask_app_1/app.py 完整展示了 Flask 的最小骨架from flask import Flask, render_template app Flask(__name__) app.route(/) def index(): return render_template(first_app.html) if __name__ __main__: app.run(debugTrue)app.route(/)把根路径绑定到index()视图函数render_template(first_app.html)从同目录的 templates 中加载模板并渲染。模板 first_app.html 是一个简单的 HTML 表单收集用户输入的姓名并 POST 到/hello。3.2 引入 WTForms 表单校验1st_flask_app_2纯 HTML 表单无法校验输入1st_flask_app_2/app.py 引入 WTFormsfrom flask import Flask, render_template, request from wtforms import Form, TextAreaField, validators app Flask(__name__) class HelloForm(Form): sayhello TextAreaField(,[validators.DataRequired()]) app.route(/) def index(): form HelloForm(request.form) return render_template(first_app.html, formform) app.route(/hello, methods[POST]) def hello(): form HelloForm(request.form) if request.method POST and form.validate(): name request.form[sayhello] return render_template(hello.html, namename) return render_template(first_app.html, formform) if __name__ __main__: app.run(debugTrue)关键点在于表单类HelloForm通过validators.DataRequired()声明必填约束form.validate()在校验通过后才进入业务处理否则重新渲染表单页模板会利用field.errors展示错误信息。错误信息的渲染由宏模板 templates/_formhelpers.html 完成{% macro render_field(field) %} dt{{ field.label }} dd{{ field(**kwargs)|safe }} {% if field.errors %} ul classerrors {% for error in field.errors %} li{{ error }}/li {% endfor %} /ul {% endif %} /dd {% endmacro %}该宏在多个应用间复用先渲染字段控件field(**kwargs)允许传入cols、rows等 HTML 属性再遍历field.errors输出校验错误列表。样式由 static/style.css 提供模板通过url_for(static, filenamestyle.css)引用。第四步把电影评论分类器嵌入 Web 应用movieclassifier4.1 预测主流程movieclassifier/app.py 把前三步整合为完整的分类 Web 应用。核心预测函数def classify(document): label {0: negative, 1: positive} X vect.transform([document]) y clf.predict(X)[0] proba np.max(clf.predict_proba(X)) return label[y], proba预测链路为vect.transform把原始文本转为哈希特征向量 →clf.predict得到类别标签0negative1positive→clf.predict_proba取最大概率作为置信度。路由/results收到 POST 后调用classify并把结果传入模板app.route(/results, methods[POST]) def results(): form ReviewForm(request.form) if request.method POST and form.validate(): review request.form[moviereview] y, proba classify(review) return render_template(results.html, contentreview, predictiony, probabilityround(proba*100, 2)) return render_template(reviewform.html, formform)与上一版相比ReviewForm增加了长度约束validators.length(min15)即要求影评至少 15 个字符避免过短输入影响特征提取质量。4.2 三个模板页面的交互闭环应用由三个模板构成完整闭环templates 目录reviewform.html提交表单页。导入_formhelpers.html的render_field宏渲染form.moviereviewcols30, rows10POST 到/resultsresults.html结果展示页。同时回显用户原文{{ content }}、预测结论{{ prediction }}与置信度{{ probability }}%并提供Correct / Incorrect两个反馈按钮以及Submit another review返回入口。注意其中两个input typehidden分别携带prediction与原始review文本随反馈表单 POST 到/thanksthanks.html感谢页确认反馈已收到。4.3 在线增量训练与持久化反馈按钮的落点位于 movieclassifier/app.py 的/thanks路由app.route(/thanks, methods[POST]) def feedback(): feedback request.form[feedback_button] review request.form[review] prediction request.form[prediction] inv_label {negative: 0, positive: 1} y inv_label[prediction] if feedback Incorrect: y int(not(y)) train(review, y) sqlite_entry(db, review, y) return render_template(thanks.html)逻辑值得注意若用户点击Incorrect则把预测标签取反int(not(y))得到一个纠正后的真实标签train(review, y)调用clf.partial_fit(X, [y])对分类器做在线增量学习——这是 scikit-learn 中支持partial_fit的模型如 SGDClassifier、MultinomialNB 等才具备的能力可以逐样本更新而无需重训全量数据sqlite_entry(db, review, y)把原文 纠正标签写入 SQLite供后续离线重训或启动时增量更新使用。由此形成预测 → 用户反馈 → 在线更新 → 入库的完整数据闭环。第五步启动时从 SQLite 增量更新模型movieclassifier_with_updatemovieclassifier的在线训练只作用于当前进程内存中的模型进程重启即丢失。因此 movieclassifier_with_update 在启动阶段把 SQLite 中累积的反馈批量喂回模型。update.py 是这一机制的核心def update_model(db_path, model, batch_size10000): conn sqlite3.connect(db_path) c conn.cursor() c.execute(SELECT * from review_db) results c.fetchmany(batch_size) while results: data np.array(results) X data[:, 0] y data[:, 1].astype(int) classes np.array([0, 1]) X_train vect.transform(X) model.partial_fit(X_train, y, classesclasses) results c.fetchmany(batch_size) conn.close() return model实现要点fetchmany(batch_size)分批默认每批 10,000 条读取全部反馈记录避免一次性把大结果集载入内存每条记录被拆分为文本X与标签y经vect.transform后调用model.partial_fit(..., classes[0, 1])——注意必须显式传入classes因为首次partial_fit需要告知模型全部可能的类别否则会报NotFittedError更新后的模型默认只保存在内存中供本次会话使用若确认要永久固化需取消 update.py 末尾被注释的pickle.dump代码将新模型以protocol4写回pkl_objects/classifier.pkl。部署到公网服务器原文档指出本教程构建的应用已有在线实例http://raschkas.pythonanywhere.com/由作者部署读者可访问体验完整流程。对于自行部署仓库结构给出了清晰的素材movieclassifier与movieclassifier_with_update都自带static/、templates/、pkl_objects/与reviews.sqlite是一个自包含的 Web 应用单元可整体上传到任意支持 Python 的主机如 PythonAnywhere、云服务器运行。部署时建议注意使用python3 app.py直接启动仅适合开发调试debugTrue会开启 reloader 与交互式调试器切勿在生产环境开启生产环境应通过 WSGI 服务器托管 Flask 应用并确保pkl_objects/、reviews.sqlite目录具有正确的读写权限尤其启用更新功能时需要写库数据持久化依赖本地 SQLite 文件多进程/多实例部署时需评估写入并发与备份策略。总结本章用四个递进的 Flask 应用完整演示了模型上线的工程链路用 pickle 序列化 scikit-learn 估计器与特征提取器用 SQLite 沉淀用户反馈用 WTForms 保证表单健壮性再用partial_fit实现从在线增量训练到启动时批量更新的模型自进化。你可以在 code/ch09 中逐一运行这四个目录也可以参考 ch09.ipynb 按步骤重演全部代码配合仓库内附的 movie_data.csv.gz 语料与 pickle-test-scripts含pickle-dump-test.py、pickle-load-test.py等序列化验证脚本即可完整体验从离线训练到线上服务的全过程。赞分享示例工程机器学习深度学习【免费下载链接】python-machine-learning-book-2nd-editionThe Python Machine Learning (2nd edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book-2nd-edition点击查看免费下载相关推荐Windows精简工具实战开源方案让旧电脑提速开机从两分钟到二十秒Windows精简工具实战开源方案让旧电脑提速开机从两分钟到二十秒 Windows精简工具能不能救活一台老电脑为了回答这个旧电脑提速的问题我翻出抽屉操作系统将机器学习模型嵌入 Web 应用基于 Flask 的 scikit-learn 电影评论分类器实战将机器学习模型嵌入 Web 应用基于 Flask 的 scikit learn 电影评论分类器实战 导读 本文以《Python Machine Learnin机器学习教程python-machine-learning-book-2nd-edition自动机器学习AutoML工具应用python machine learning book 2nd edition自动机器学习AutoML工具应用 你是否还在为机器学习模型的繁琐调参而烦恼是示例工程机器学习深度学习上一篇Metro构建错误处理终极指南如何优雅调试React Native打包问题下一篇Binance-Futures-Connector-Python完全指南从安装到实战的终极入门教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考