将分类器投入生产

Posted

技术标签:

【中文标题】将分类器投入生产【英文标题】:Bringing a classifier to production 【发布时间】:2014-11-05 10:39:38 【问题描述】:

我已经使用 joblib 保存了我的分类器管道:

vec = TfidfVectorizer(sublinear_tf=True, max_df=0.5, ngram_range=(1, 3))
pac_clf = PassiveAggressiveClassifier(C=1)
vec_clf = Pipeline([('vectorizer', vec), ('pac', pac_clf)])
vec_clf.fit(X_train,y_train)
joblib.dump(vec_clf, 'class.pkl', compress=9)

现在我正在尝试在生产环境中使用它:

def classify(title):

  #load classifier and predict
  classifier = joblib.load('class.pkl')

  #vectorize/transform the new title then predict
  vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, ngram_range=(1, 3))
  X_test = vectorizer.transform(title)
  predict = classifier.predict(X_test)
  return predict

我得到的错误是:ValueError: Vocabulary was not compatible or is empty! 我想我应该从 te joblid 加载词汇,但我无法让它工作

【问题讨论】:

在存储/加载矢量化器时遇到什么错误? 我在加载时没有收到错误,现在问题已解决。谢谢你的帮助 【参考方案1】:

只需替换:

  #load classifier and predict
  classifier = joblib.load('class.pkl')

  #vectorize/transform the new title then predict
  vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, ngram_range=(1, 3))
  X_test = vectorizer.transform(title)
  predict = classifier.predict(X_test)
  return predict

作者:

  # load the saved pipeline that includes both the vectorizer
  # and the classifier and predict
  classifier = joblib.load('class.pkl')
  predict = classifier.predict(X_test)
  return predict

class.pkl 包含完整的管道,无需创建新的矢量化器实例。正如错误消息所说,您需要重用最初训练的矢量化器,因为从标记(字符串 ngram)到列索引的特征映射保存在矢量化器本身中。这种映射被命名为“词汇表”。

【讨论】:

谢谢@ogrisel 工作得很好......此外刚刚发现这个关于优化我的分类器的有用博客link

以上是关于将分类器投入生产的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个特征/分类器组合成一个统一且更好的分类器?

结合两个基于深度学习的分类器的方法

分类器的选择

我如何从两个已经训练好的分类器中构建一个分类器?

如何用OpenCV训练自己的分类器

如何用OpenCV训练自己的分类器