Machine learning 使用最佳参数构建模型时,GridsearchCV最佳分数下降

Machine learning 使用最佳参数构建模型时,GridsearchCV最佳分数下降,machine-learning,scikit-learn,pipeline,grid-search,Machine Learning,Scikit Learn,Pipeline,Grid Search,我正试图通过网格搜索CV为我的逻辑回归估计器找到一组最佳超参数,并使用管道构建模型: 我的问题是当试图使用我获得的最佳参数时 grid\u search.最佳参数要建立逻辑回归模型,精度与我得到的不同 grid_search.best_score_ 这是我的密码 x=tweet["cleaned"] y=tweet['tag'] X_train, X_test, Y_train, Y_test = model_selection.train_test_split(x, y, test_si

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

我的问题是当试图使用我获得的最佳参数时
grid\u search.最佳参数
要建立逻辑回归模型,精度与我得到的不同

grid_search.best_score_ 
这是我的密码

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)
当我得到最好的分数和婴儿车使用

print(grid_search.best_score_)
print(grid_search.best_params_)
结果是

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}
现在如果我使用这些参数来构建我的模型

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)))
结果降至0.68


而且,这是一项乏味的工作,因此如何将最佳参数传递给模型。因为我的方式和他稍有不同,所以我想不出这样做的方法

第二个选项中得分较低的原因是您在测试集上评估管道模型,而您在使用交叉验证评估gridsearch模型(在您的案例中,是10倍分层交叉验证)。此交叉验证分数是10个模型的平均值,每个模型在9/10的列车数据上安装,并在最后1/10的列车数据上进行评估。因此,您不能期望两次评估的分数相同

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

best_model = grid_search.best_estimator_
best_model.score(X_test, Y_test)

我将Logistic回归和mlpclassizer放在每个分类器之间切换的管道中。我使用GridSearchCV查找分类器之间的最佳参数。我调整了参数,然后为数据选择了最精确的分类器。最初,MLP分类更准确,但在调整逻辑回归的C值后,它变得更准确

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=42)

pipeline= Pipeline([
     ('scaler',StandardScaler()),
     #('pca', PCA()),
     ('clf',LogisticRegression(C=5,max_iter=10000, tol=0.1)),
     #('clf',MLPClassifier(hidden_layer_sizes=(25,150,25),  max_iter=800, solver='lbfgs', activation='relu', alpha=0.7, 
     #                 learning_rate_init=0.001,  verbose=False, momentum=0.9, random_state=42))
     ])

 pipeline.fit(X_train,y_train)

 parameter_grid={'C':np.linspace(5,100,5)}

 grid_rf_class=GridSearchCV(
      estimator=pipeline['clf'],
      param_grid=parameter_grid,
      scoring='roc_auc',
      n_jobs=2,
      cv=5,
      refit=True,
      return_train_score=True)

 grid_rf_class.fit(X_train,y_train)
 predictions=grid_rf_class.predict(X_test)

 print(accuracy_score(y_test,predictions));
 print(grid_rf_class.best_params_)
 print(grid_rf_class.best_score_)

“小下”部分不准确;正如你正确指出的那样,这些都是统计数量,当然不应该是相等的,但“稍低的”部分实际上并不成立。如果你编辑了这一部分,我很乐意向上投票(即,只关注为什么他们不应该被期望是平等的)…@Desternaut感谢你指出这一点,这在实践中经常被观察到,但我的措辞让它看起来像是一种断言,而事实并非如此。我刚刚编辑了它以减少误导Refit=True允许您使用带有cv_网格变量的最佳模型。cv_网格预测