GridsearchCV - лучший результат при использовании лучших параметров для построения модели - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь найти набор наилучших гиперпараметров для моей оценки логистической регрессии с помощью Grid Search CV и построить модель с использованием конвейера:

Моя проблема заключается в том, что при попытке использовать лучшие параметры, которые я получаю grid_search.best_params_ для построения модели логистической регрессии точность отличается от той, которую я получаю на

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.

также, это утомительная работа, так как я могу передать лучшие параметры модели.Я не мог понять, как это сделать так ( answer ), поскольку мой путь немного отличается от него.

1 Ответ

0 голосов
/ 03 марта 2019

Причина, по которой ваш балл ниже во втором варианте, заключается в том, что вы оцениваете свою модель конвейера на тестовом наборе, в то время как вы оцениваете свою модель gridsearch, используя перекрестную проверку (в вашем случае, 10-кратная стратифицированная перекрестная проверка).Проверка).Этот показатель перекрестной проверки представляет собой среднее из 10 моделей, установленных на 9/10 ваших данных о поездах и оцененных на последней 1/10 этих данных о поездах.Следовательно, вы не можете ожидать одинакового результата от обеих оценок.

Что касается вашего второго вопроса, почему вы не можете просто набрать grid_search.best_estimator_?Это берет лучшую модель из вашей сетки поиска, и вы можете оценить ее, не восстанавливая ее с нуля.Например:

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