资讯详情

Python Machine Learning Book 实战:用 pickle-test-scripts 验证 scikit-learn 模型序列化与电影情感分类环境

📅 2026/9/23 4:30:23 | 华诺云谱 👁 阅读
Python Machine Learning Book 实战:用 pickle-test-scripts 验证 scikit-learn 模型序列化与电影情感分类环境
Python Machine Learning Book 实战用 pickle-test-scripts 验证 scikit-learn 模型序列化与电影情感分类环境【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book本章节围绕《Python Machine Learning (1st edition)》书仓库中 code/ch09/pickle-test-scripts 目录的官方测试脚本展开。该目录用于验证读者本地 Python 环境能否正确完成 scikit-learn 模型的 pickle 序列化dump与反序列化load——这是将训练好的机器学习模型嵌入 Flask Web 应用本书第 9 章主题的关键前置步骤。读完本文你将掌握 stopwords 与分类器的序列化/加载流程、HashingVectorizer 与 SGDClassifier 的配合用法并能在自己机器上复现 Prediction: positive / Probability: 85.71% 的输出。一、背景为什么需要 pickle 测试脚本本书第 8 章完成了基于 IMDb 电影评论数据集的情感分类sentiment analysis第 9 章则要把训练好的模型嵌入 Web 应用。模型落地到 Web 应用的关键在于模型持久化训练完成的分类器与停用词表需要保存到磁盘文件应用启动时再加载避免每次重启都重新训练。第 9 章涉及模型序列化的环节被作者评价为可能有点棘手见 pickle-test-scripts/README.md原因在于加载 pickle 文件时依赖的类必须可导入本案例中是HashingVectorizer与SGDClassifierpickle 的跨环境兼容性如 Python 版本、协议版本可能引发UnpicklingError词向量化所需的停用词表与分类器是分开序列化的加载顺序与路径必须正确。因此作者在pickle-test-scripts/目录提供了精简版测试脚本作为环境自检工具。该目录仅包含 5 个文件README、两个测试脚本dump 与 load、向量化器模块以及一份只有约 100 条样本的movie_data_small.csv小数据集。二、目录结构与文件职责文件职责movie_data_small.csv微型 IMDb 影评子集约 100 条样本含review与sentiment两列pickle-dump-test.py训练小模型并生成stopwords.pkl与classifier.pkl两个序列化文件pickle-load-test.py加载序列化文件对示例文本做预测并打印结果vectorizer.py定义共享的HashingVectorizer与分词器供加载脚本导入主次关系说明本文以 pickle-test-scripts 为绝对核心。书中 movieclassifier含vectorizer.py、app.py、pkl_objects/是它的完整版参照实现仅在必要时用于对照讲解ch09 README 给出了 Flask 应用的运行方式cd ./1st_flask_app_1 python3 app.py可视为该测试脚本服务的最终场景。三、第一步运行 pickle-dump-test.py 完成序列化3.1 运行命令与预期产物进入pickle-test-scripts/目录后执行cd code/ch09/pickle-test-scripts python pickle-dump-test.py脚本将完成以下两件事见 pickle-dump-test.py从movie_data_small.csv读取数据训练一个小型逻辑回归分类器在工作目录下生成两个 pickle 文件stopwords.pkl classifier.pkl3.2 序列化数据准备脚本首先构造停用词表与词向量化器stop stopwords.words(english) # nltk 英文停用词 def tokenizer(text): text re.sub([^]*, , text) # 去掉 HTML 标签 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)这里体现了本书第 8 章的核心预处理流程HTML 清理 → 小写化 → 表情符号保留 → 非单词字符剔除 → 停用词过滤。HashingVectorizer采用哈希技巧将文本直接映射为稀疏特征向量无需维护词汇表因此不使用TfidfVectorizer/CountVectorizer的vocabulary_属性——这正是它能被单独序列化、且模型与向量化器可以分文件保存的根本原因。n_features2**21约 210 万维是书中训练用的典型维度设置通过哈希冲突概率与内存开销的权衡得来测试脚本沿用了该配置以保证与完整版行为一致。3.3 训练并序列化两个对象clf SGDClassifier(losslog, random_state1, n_iter1) df pd.read_csv(./movie_data_small.csv, encodingutf-8) X_train df[review].values y_train df[sentiment].values X_train vect.transform(X_train) clf.fit(X_train, y_train) pickle.dump(stop, open(stopwords.pkl, wb), protocol4) pickle.dump(clf, open(classifier.pkl, wb), protocol4)关键点SGDClassifier(losslog, random_state1, n_iter1)使用对数损失等价于逻辑回归random_state1保证可复现此处单轮迭代即可小数据集、仅作环境验证完整版训练时迭代更多轮protocol4显式指定 pickle 协议版本 4Python 3.4 支持在测试脚本与完整版 movieclassifier/app.py 中保持一致避免因默认协议差异产生兼容性问题数据读取时df.loc[:100, :].to_csv(...)一行被注释掉——它正是当初生成movie_data_small.csv的取前 100 条命令即原文档所述very small movie_review_data subset的来源。四、第二步运行 pickle-load-test.py 验证加载4.1 运行与预期输出python pickle-load-test.py预期输出见 pickle-test-scripts/README.mdPrediction: positive Probability: 85.71%4.2 加载流程拆解from vectorizer import vect # 复用同一向量化器 clf pickle.load(open(classifier.pkl, rb)) label {0: negative, 1: positive} example [I love this movie] X vect.transform(example) print(Prediction: %s\nProbability: %.2f%% % (label[clf.predict(X)[0]], np.max(clf.predict_proba(X)) * 100))流程为加载classifier.pkl→ 用vectorizer.vect将示例文本向量化 →predict得到类别索引0negative, 1positive→predict_proba取最大概率换算为百分比。示例文本 I love this movie 被正确判定为 positive且置信度 85.71%。4.3 为什么vectorizer.py必须独立成模块对比 pickle-load-test.py 与 vectorizer.py 可以发现加载脚本没有重新定义HashingVectorizer而是from vectorizer import vect。原因有二pickle 不保存对象引用的模块级依赖——classifier.pkl只保存分类器自身其内部引用的向量化配置需要运行环境能重新构建测试脚本加载的是停用词表序列化文件stopwords.pklstop pickle.load(open(stopwords.pkl, rb))而非重新调用nltk.corpus.stopwords从而验证了停用词持久化这一环节本身。对照书中完整版 movieclassifier/vectorizer.py 可看到生产级差异完整版使用os.path.dirname(__file__)拼接pkl_objects/绝对路径测试脚本则直接用相对路径classifier.pkl必须在pickle-test-scripts/目录内运行——这是为降低理解门槛刻意简化实际部署时务必采用完整版的路径策略。五、两个脚本与完整版 Web 应用的对应关系功能测试脚本本文主角完整版 movieclassifier停用词加载pickle.load(open(stopwords.pkl))从pkl_objects/stopwords.pkl加载分类器加载pickle.load(open(classifier.pkl))从pkl_objects/classifier.pkl加载预测调用clf.predict/predict_probaapp.py 的 classify() 中同样的两行调用在线更新无partial_fit sqlite见movieclassifier_with_update/update.py从源码结构可以推断movieclassifier/app.py的classify()函数与测试脚本的加载逻辑几乎逐行对应vect.transform([document])→clf.predict→np.max(clf.predict_proba)因此只要测试脚本能跑通Web 应用的模型加载环节就不会出错——这正是作者放置该目录的用意先用最小闭环验证环境再进入 Flask 集成。六、常见问题排查ModuleNotFoundError: No module named nltk/sklearn/pandas先安装依赖pip install nltk scikit-learn pandas numpy并执行nltk.download(stopwords)下载语料nltk.corpus.stopwords在 dump 脚本中直接使用UnpicklingError多为 pickle 协议或 Python 版本不一致所致dump 时已固定protocol4请确保 load 环境与 dump 环境一致路径错误load 脚本使用相对路径必须在pickle-test-scripts/目录下执行否则找不到classifier.pkl/stopwords.pklCSV 编码异常dump 脚本读取时显式指定encodingutf-8若自行替换数据集请保持编码一致输出概率不是 85.71%若随机种子、数据或 sklearn 版本不同数值可能有轻微浮动重点验证的是能成功加载 能正确输出 positive 预测这一闭环。七、小结pickle-test-scripts是本书第 9 章将模型嵌入 Flask Web 应用的环境自检岗pickle-dump-test.py用约 100 条影评训练并序列化stopwords.pkl与classifier.pklpickle-load-test.py加载它们并对 I love this movie 输出Prediction: positive / Probability: 85.71%。通过这组脚本你验证了 HashingVectorizer 哈希向量化、SGDClassifier 逻辑回归训练、pickle 协议 4 序列化与跨模块加载整条链路为后续阅读 movieclassifier 的 Flask 集成、乃至 movieclassifier_with_update 的 sqlite 在线更新奠定基础。【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。