【问题标题】:Save model for later prediction (OneVsRest)保存模型以供以后预测 (OneVsRest)
【发布时间】:2019-06-24 02:19:37
【问题描述】:

我想知道如何保存 OnevsRest 分类器 模型以供以后预测。

我在保存它时遇到了问题,因为它也意味着要保存矢量化器。我在这个post学到了。

这是我创建的模型:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(strip_accents='unicode', analyzer='word', ngram_range=(1,3), norm='l2')
vectorizer.fit(train_text)
vectorizer.fit(test_text)

x_train = vectorizer.transform(train_text)
y_train = train.drop(labels = ['id','comment_text'], axis=1)

x_test = vectorizer.transform(test_text)
y_test = test.drop(labels = ['id','comment_text'], axis=1)


from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier

%%time

# Using pipeline for applying logistic regression and one vs rest classifier
LogReg_pipeline = Pipeline([
                ('clf', OneVsRestClassifier(LogisticRegression(solver='sag'), n_jobs=-1)),
            ])

for category in categories:
    printmd('**Processing {} comments...**'.format(category))

    # Training logistic regression model on train data
    LogReg_pipeline.fit(x_train, train[category])

    # calculating test accuracy
    prediction = LogReg_pipeline.predict(x_test)
    print('Test accuracy is {}'.format(accuracy_score(test[category], prediction)))
    print("\n") 

任何帮助将不胜感激。

此致,

【问题讨论】:

  • @YS-L 如果您能提供帮助,我将不胜感激。我读过你的post,我想我也有类似的问题,但我无法解决。谢谢。

标签: python scikit-learn save multilabel-classification tfidfvectorizer


【解决方案1】:

使用joblib,您可以保存任何 Scikit-learn Pipeline 的所有元素,因此还包括适合的 TfidfVectorizer

在这里,我使用 Newsgroups20 数据集的前 200 个示例重写了您的示例:

from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups()

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier

vectorizer = TfidfVectorizer(strip_accents='unicode', analyzer='word', ngram_range=(1,3), norm='l2')

x_train = data.data[:100]
y_train = data.target[:100]

x_test =  data.data[100:200]
y_test = data.target[100:200]

# Using pipeline for applying logistic regression and one vs rest classifier
LogReg_pipeline = Pipeline([
    ('vectorizer', vectorizer),
    ('clf', OneVsRestClassifier(LogisticRegression(solver='sag', 
                                                   class_weight='balanced'), 
                                n_jobs=-1))
                           ])

# Training logistic regression model on train data
LogReg_pipeline.fit(x_train, y_train)

在上面的代码中,您只需开始定义您的训练和测试数据并实例化您的TfidfVectorizer。然后,您定义包含矢量化器和 OVR 分类器的管道,并将其拟合到训练数据中。它将学习一次预测所有类。

现在您只需使用 joblib 保存整个拟合管道,因为它是单个预测器:

from joblib import dump, load
dump(LogReg_pipeline, 'LogReg_pipeline.joblib') 

您的整个模型不会以“LogReg_pipeline.joblib”的名称保存到磁盘。您可以通过此代码 sn-p 调用它并直接在原始数据上使用它:

clf = load('LogReg_pipeline.joblib') 
clf.predict(x_test)

您将获得对原始文本的预测,因为管道会自动对其进行矢量化。

【讨论】:

  • 感谢您的帮助。尝试使用我自己的数据运行您的模型时,我遇到了困难。我收到一条错误消息告诉我np.nan is an invalid document, expected byte or unicode string
  • 也许这个答案可以帮助你:stackoverflow.com/questions/39303912/…
  • 我很感激,但问题仍然存在。事实上,提供的链接建议在模型之外进行矢量化变换,就像我在原始模型上所做的那样。根据您之前的要求,无需进行单独的矢量化,因为它现在已封装在管道中。
  • 根据stackoverflow.com/questions/39303912/…,您需要做的就是在训练时将 x_train.astype('U') 传递给管道,在预测时将 x_test.astype('U') 传递给管道(这将转换你的文本数据转换成 Unicode)
  • 感谢您的帮助。我输入了LogReg_pipeline.fit(x_train.astype('U'), y_train.astype('U')),但在出现ValueError: Multioutput target data is not supported with label binarization 错误之后
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多