我开发了一个脚本,用于根据之前手动标记的反馈来预测某些文本的可能标签。我使用了几篇在线文章来帮助我(特别是: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)
它对我来说运作得很好:它为每个可能的标签返回一个预测。但我的问题是,每次我尝试进行预测时,它都会重新训练算法。我希望能够在一个脚本中训练算法,保存训练好的算法,然后在另一个进行预测的脚本中加载它。
我想在第一个脚本中这样做:
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 pickledef serialize(obj, file): with open(file, 'wb') as f: pickle.dump(obj, f)
这是一个从文件中反序列化Python对象的函数:
import pickledef deserialize(file): with open(file, 'rb') as f: return pickle.load(f)
在你完成训练后,你所需要做的就是调用(如果NB_pipeline
是你的模型对象):
serialize(NB_pipeline, 'model.pickle')
当你需要加载并使用它时,只需调用:
NB_pipeline = deserialize('model.pickle')