使用最佳参数构建模型时 GridsearchCV 最佳得分下降

may*_*ona 2 pipeline machine-learning scikit-learn grid-search

我正在尝试使用网格搜索 CV 为我的逻辑回归估计器找到一组最佳超参数,并使用管道构建模型:

我的问题是当尝试使用我获得的最佳参数 grid_search.best_params_来构建逻辑回归模型时,准确度与我得到的不同

grid_search.best_score_ 
Run Code Online (Sandbox Code Playgroud)

这是我的代码

x=tweet["cleaned"]
y=tweet['tag']

X_train, X_test, Y_train, Y_test = model_selection.train_test_split(x, y, test_size=.20, random_state=42)

pipeline = Pipeline([
('vectorizer',TfidfVectorizer()),
('chi', SelectKBest()),
('classifier', LogisticRegression())])

grid = {
'vectorizer__ngram_range': [(1, 1), (1, 2),(1, 3)],
'vectorizer__stop_words': [None, 'english'],
'vectorizer__norm': ('l1', 'l2'),
'vectorizer__use_idf':(True, False), 
'vectorizer__analyzer':('word', 'char', 'char_wb'),
'classifier__penalty': ['l1', 'l2'],
'classifier__C': [1.0, 0.8],
'classifier__class_weight': [None, 'balanced'],
'classifier__n_jobs': [-1],
'classifier__fit_intercept':(True, False),
}

grid_search = GridSearchCV(pipeline, param_grid=grid, scoring='accuracy', n_jobs=-1, cv=10)
grid_search.fit(X_train,Y_train)
Run Code Online (Sandbox Code Playgroud)

当我获得最高分和婴儿车时使用

print(grid_search.best_score_)
print(grid_search.best_params_)
Run Code Online (Sandbox Code Playgroud)

结果是

0.7165160230073953 
{'classifier__C': 1.0, 'classifier__class_weight': None, 'classifier__fit_intercept': True, 'classifier__n_jobs': -1, 'classifier__penalty': 'l1', 'vectorizer__analyzer': 'word', 'vectorizer__ngram_range': (1, 1), 'vectorizer__norm': 'l2', 'vectorizer__stop_words': None, 'vectorizer__use_idf': False}
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用这些参数来构建我的模型

pipeline = Pipeline([
('vectorizer',TfidfVectorizer(ngram_range=(1, 1),stop_words=None,norm='l2',use_idf= False,analyzer='word')),
('chi', SelectKBest(chi2,k=1000)),
('classifier', LogisticRegression(C=1.0,class_weight=None,fit_intercept=True,n_jobs=-1,penalty='l1'))])

 model=pipeline.fit(X_train,Y_train) 
 print(accuracy_score(Y_test, model.predict(X_test)))
Run Code Online (Sandbox Code Playgroud)

结果下降到 0.68。

此外,这是一项繁琐的工作,所以我如何将最佳参数传递给模型。我无法弄清楚如何在这个(答案)中做到这一点,因为我的方式与他略有不同。

Max*_*Kan 5

在第二个选项中您的分数较低的原因是您正在测试集上评估您的管道模型,而您正在使用交叉验证(在您的情况下,10 倍分层交叉验证)评估您的网格搜索模型。此交叉验证分数是 10 个模型的平均值,每个模型拟合 9/10 的训练数据,并在该训练数据的最后 1/10 上进行评估。因此,您不能期望从两个评估中获得相同的分数。

至于你的第二个问题,你为什么不能做grid_search.best_estimator_?这将从您的网格搜索中获取最佳模型,您可以对其进行评估,而无需从头开始重建它。例如:

best_model = grid_search.best_estimator_
best_model.score(X_test, Y_test)
Run Code Online (Sandbox Code Playgroud)