Sklearn如何使用Joblib或Pickle保存从管道和GridSearchCV创建的模型?

Jar*_*rad 26 python pipeline scikit-learn grid-search

使用确定最佳参数后pipelineGridSearchCV,我怎么pickle/ joblib后来这个过程中重新使用?当它是单个分类器时,我看到如何做到这一点......

from sklearn.externals import joblib
joblib.dump(clf, 'filename.pkl') 
Run Code Online (Sandbox Code Playgroud)

但是,如何pipeline在执行和完成后用最佳参数保存整体gridsearch

我试过了:

  • joblib.dump(grid, 'output.pkl') - 但是转储了每次网格搜索尝试(许多文件)
  • joblib.dump(pipeline, 'output.pkl') - 但我不认为它包含最好的参数

X_train = df['Keyword']
y_train = df['Ad Group']

pipeline = Pipeline([
  ('tfidf', TfidfVectorizer()),
  ('sgd', SGDClassifier())
  ])

parameters = {'tfidf__ngram_range': [(1, 1), (1, 2)],
              'tfidf__use_idf': (True, False),
              'tfidf__max_df': [0.25, 0.5, 0.75, 1.0],
              'tfidf__max_features': [10, 50, 100, 250, 500, 1000, None],
              'tfidf__stop_words': ('english', None),
              'tfidf__smooth_idf': (True, False),
              'tfidf__norm': ('l1', 'l2', None),
              }

grid = GridSearchCV(pipeline, parameters, cv=2, verbose=1)
grid.fit(X_train, y_train)

#These were the best combination of tuning parameters discovered
##best_params = {'tfidf__max_features': None, 'tfidf__use_idf': False,
##               'tfidf__smooth_idf': False, 'tfidf__ngram_range': (1, 2),
##               'tfidf__max_df': 1.0, 'tfidf__stop_words': 'english',
##               'tfidf__norm': 'l2'}
Run Code Online (Sandbox Code Playgroud)

Ibr*_*iev 31

from sklearn.externals import joblib
joblib.dump(grid.best_estimator_, 'filename.pkl')
Run Code Online (Sandbox Code Playgroud)

如果要将对象转储到一个文件中 - 请使用:

joblib.dump(grid.best_estimator_, 'filename.pkl', compress = 1)
Run Code Online (Sandbox Code Playgroud)

  • @Odisseo我有点晚了但是...... GridSearchCV会自动在整个数据集上重新训练模型,除非你明确要求它不要这样做。因此,当您训练 GridSearchCV 模型时,您用于预测的模型(换句话说,best_estimator_)已经在整个数据集上进行了重新训练。 (13认同)
  • 作为最佳实践,一旦选择了最佳模型,就应该在整个数据集中对其进行重新训练。为此,是否应该在整个数据集上重新训练相同的管道对象(从而应用相同的数据处理),然后部署该对象?还是应该重新创建一种新模型? (6认同)
  • 你怎么解决r.Thread锁定错误? (4认同)
  • @Odisseo - 我的观点是你从头开始重新训练一个新模型。您仍然可以使用管道,但将 grid_classifier 更改为最终分类器(例如随机森林)。将该分类器添加到管道中,使用所有数据重新训练。保存最终模型。- 最终结果是您的整个数据集在您想要的完整管道内进行了训练。例如,这可能会导致预处理略有不同,但它应该更加稳健。实际上,这意味着您调用 pipeline.fit() 并保存管道。 (2认同)