在 Python 中保存经过训练的多输入分类算法

Saving a trained multi-input classification algorithm in 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)

它非常适合我的目的:它 returns 是对每个可能标签的预测。但我的问题是每次我尝试进行预测时它都会重新训练算法。我想做的是在脚本中训练算法,保存训练后的算法,将其加载到另一个进行预测的脚本中。

我希望能够在脚本 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')