python - 在 Python 中保存经过训练的多输入分类算法
问题描述
我开发了一个脚本,根据之前手动标记的反馈预测某些文本的可能标记。我使用了几篇在线文章来帮助我(即:https ://towardsdatascience.com/multi-label-text-classification-with-scikit-learn-30714b7819c5 )。
因为我想要每个标签的概率,所以这是我使用的代码:
NB_pipeline = Pipeline([
('clf', OneVsRestClassifier(MultinomialNB(alpha=0.3, fit_prior=True, class_prior=None))),
])
predictions_en = {}
for category in categories_en:
NB_pipeline.fit(all_x_en, en_topics[category])
proba_en = NB_pipeline.predict_proba(pred_x_en)
predictions_en[category] = proba_en[-1][-1]
preds_en = pd.DataFrame(predictions_en.items())
preds_en = preds_en.sort_values(by=[1], ascending=False)
preds_en = preds_en.reset_index(drop=True)
它非常适合我的目的:它为每个可能的标签返回一个预测。但我的问题是,每次我尝试进行预测时,它都会重新训练算法。我想做的是在脚本中训练算法,保存训练后的算法,将其加载到另一个进行预测的脚本中。
我希望能够在脚本 1 中执行此操作:
for category in categories_en:
NB_pipeline.fit(all_x_en, en_topics[category])
这在另一个脚本中:
for category in categories_en:
proba_en = NB_pipeline.predict_proba(pred_x_en)
predictions_en[category] = proba_en[-1][-1]
但我似乎无法让它工作。当我尝试将它分开时,它只是给了我相同的预测。
解决方案
你总是可以pickle
用来序列化任何 python 对象,包括你的。因此,保存模型最简单、最快的方法就是将其序列化为一个文件,例如model.pickle
. 这是在训练模型后的第一部分完成的。之后,您所要做的就是检查文件是否存在并pickle
再次使用反序列化它。
这是一个将 python 对象序列化为文件的函数:
import pickle
def serialize(obj, file):
with open(file, 'wb') as f:
pickle.dump(obj, f)
这是一个从文件中反序列化 python 对象的函数:
import pickle
def deserialize(file):
with open(file, 'rb') as f:
return pickle.load(f)
完成训练后,您所要做的就是调用(如果NB_pipeline
是模型的对象):
serialize(NB_pipeline, 'model.pickle')
当你必须加载它并使用它时,只需调用:
NB_pipeline = deserialize('model.pickle')
推荐阅读
- c# - 如何从 EF Core 中的实体属性生成自定义 ID?
- c# - 任务和返回类型
- javascript - Ajax 作为结果从 php 获取整个页面
- javascript - 克尼克斯,从
- javascript - '\n' 在 textContent 中给出错误的 offsetHeight 时应用二进制搜索来查找需要截断文本的最大字符数
- node.js - Square-connect 缺少必需参数:idempotency_key,NodeJS
- python - sphinx 可以链接到位于 .rst 文档上方一个路径中的文档吗?
- solr - 在将完整数据集更新为 solr 之前,如何使用户无法使用 solr?
- c++ - 在库 dll 中存储和访问数据
- c - 具有不同数量参数的函数指针数组