使用网格搜索调整模型
Posted
技术标签:
【中文标题】使用网格搜索调整模型【英文标题】:tuning models with grid search 【发布时间】:2020-02-10 12:13:37 【问题描述】:我遇到了一个关于在管道中使用 TfidfVectorizer() 使用网格搜索和文本数据调整参数的示例。 据我了解,当我们调用 grid_search.fit(X_train, y_train) 时,它将转换数据,然后按照字典中的描述拟合模型。但是在评估过程中,我对测试数据集有点困惑,因为当我们调用 grid_search.predict(X_test) 时,我不知道 TfidfVectorizer() 是否/(如何)应用于这个测试块。
谢谢
大卫
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.cross_validation import train_test_split
from sklearn.metrics import precision_score, recall_score, accuracy_
score
pipeline = Pipeline([
('vect', TfidfVectorizer(stop_words='english')),
('clf', LogisticRegression())
])
parameters =
'vect__max_df': (0.25, 0.5, 0.75),
'vect__stop_words': ('english', None),
'vect__max_features': (2500, 5000, 10000, None),
'vect__ngram_range': ((1, 1), (1, 2)),
'vect__use_idf': (True, False),
'vect__norm': ('l1', 'l2'),
'clf__penalty': ('l1', 'l2'),
'clf__C': (0.01, 0.1, 1, 10),
if __name__ == "__main__":
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1,
verbose=1, scoring='accuracy', cv=3)
df = pd.read_csv('data/sms.csv')
X, y, = df['message'], df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y)
grid_search.fit(X_train, y_train)
print 'Best score: %0.3f' % grid_search.best_score_
print 'Best parameters set:'
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print '\t%s: %r' % (param_name, best_parameters[param_name])
predictions = grid_search.predict(X_test)
print 'Accuracy:', accuracy_score(y_test, predictions)
print 'Precision:', precision_score(y_test, predictions)
print 'Recall:', recall_score(y_test, predictions)
【问题讨论】:
【参考方案1】:这是 scikit-learn 管道魔法的一个示例。它的工作原理是这样的:
-
首先,您使用
Pipeline
构造函数定义管道元素 - 所有数据,无论是在训练还是测试 (predict
) 阶段,都将通过所有定义的步骤进行处理 - 在这种情况下由 TfidfVectorizer
然后输出将传递给LogisticRegression
模型。
将定义的管道传递给GridSearchCV
构造函数允许您使用fit
方法,该方法不仅执行网格搜索,而且在内部将TfidfVectorizer
和LogisticRegression
设置为最佳找到的参数,以便稍后运行predict
这样做是在最好的模型上。
您可以在scikit-learn documentation 中找到有关创建管道的更多信息。
【讨论】:
感谢您的回答。现在的问题是,当我运行示例时,出现此错误:Invalid parameter clf for estimator TfidfVectorizer。我以为 TfidfVectorizer 只能使用 vect 键访问参数字典!!。任何想法?非常感谢。以上是关于使用网格搜索调整模型的主要内容,如果未能解决你的问题,请参考以下文章
我应该在 SMOTE 之前还是之后执行网格搜索(用于调整超参数)?