最佳模型的 GridSearch:保存和加载参数

Posted

技术标签:

【中文标题】最佳模型的 GridSearch:保存和加载参数【英文标题】:GridSearch for best model: Save and load parameters 【发布时间】:2019-06-09 09:42:26 【问题描述】:

我喜欢运行以下工作流程:

    为文本矢量化选择模型 定义参数列表 在参数上应用带有 GridSearchCV 的管道,使用 LogisticRegression() 作为基线来找到最佳模型参数 保存最佳模型(参数) 加载最佳模型参数,以便我们可以在此定义的模型上应用一系列其他分类器。

这是您可以重现的代码:

网格搜索:

%%time
import numpy as np
import pandas as pd
from sklearn.externals import joblib
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from gensim.utils import simple_preprocess
np.random.seed(0)

data = pd.read_csv('https://pastebin.com/raw/dqKFZ12m')
X_train, X_test, y_train, y_test = train_test_split([simple_preprocess(doc) for doc in data.text],
                                                    data.label, random_state=0)

# Find best Tfidf model using LR
pipeline = Pipeline([
  ('tfidf', TfidfVectorizer(preprocessor=' '.join, tokenizer=None)),
  ('clf', LogisticRegression())
  ])

parameters = 
              'tfidf__max_df': [0.25, 0.5, 0.75, 1.0],
              'tfidf__smooth_idf': (True, False),
              'tfidf__norm': ('l1', 'l2', None),
              

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

print(grid.best_params_)

# Save model
#joblib.dump(grid.best_estimator_, 'best_tfidf.pkl', compress = 1) # this unfortunately includes the LogReg
joblib.dump(grid.best_params_, 'best_tfidf.pkl', compress = 1) # Only best parameters

对 24 位候选者中的每一个进行拟合 2 折,总共 48 次拟合 'tfidf__smooth_idf':真,'tfidf__norm':'l2','tfidf__max_df':0.25

加载具有最佳参数的模型:

from sklearn.model_selection import GridSearchCV

# Load best parameters
tfidf_params = joblib.load('best_tfidf.pkl')

pipeline = Pipeline([
  ('vec', TfidfVectorizer(preprocessor=' '.join, tokenizer=None).set_params(**tfidf_params)), # here is the issue?
  ('clf', LogisticRegression())
  ])

cval = cross_val_score(pipeline, X_train, y_train, scoring='accuracy', cv=5)
print("Cross-Validation Score: %s" % (np.mean(cval)))

ValueError:估计器的参数 tfidf 无效 TfidfVectorizer(analyzer='word', binary=False, decode_error='strict', dtype=,编码='utf-8',输入='内容', 小写=True, max_df=1.0, max_features=None, min_df=1, ngram_range=(1, 1), norm='l2', 预处理器=, smooth_idf=真,stop_words=无,strip_accents=无, sublinear_tf=False, token_pattern='(?u)\b\w\w+\b', 标记器=无,use_idf=真,词汇=无)。使用estimator.get_params().keys()查看可用参数列表。

问题:

如何加载 Tfidf 模型的最佳参数?

【问题讨论】:

【参考方案1】:

这一行:

joblib.dump(grid.best_params_, 'best_tfidf.pkl', compress = 1) # Only best parameters

保存pipeline 的参数,而不是TfidfVectorizer。这样做:

pipeline = Pipeline([
  # Change the name to be same as before
  ('tfidf', TfidfVectorizer(preprocessor=' '.join, tokenizer=None)),
  ('clf', LogisticRegression())
  ])

pipeline.set_params(**tfidf_params)

【讨论】:

返回同样的错误:ValueError: Invalid parameter tfidf for estimator Pipeline(memory=None,... @Christopher 是的。我已经更新了答案。您需要为管道组件使用与以前相同的名称。将vec 更改为tfidf

以上是关于最佳模型的 GridSearch:保存和加载参数的主要内容,如果未能解决你的问题,请参考以下文章

火炉炼AI机器学习017-使用GridSearch搜索最佳参数组合

PyTorch模型加载与保存的最佳实践

GridSearch:必须始终传递“Layer.call”的第一个参数

best_score_的gridsearch cv的AUC分数与gridsearch cv的最佳模型的auc_roc_score不同

ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效

如何绘制最佳参数对应的随机森林树