Почему я получаю разные результаты при использовании StandardScaler в GridSearchCV? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу оптимизировать гиперпараметры SVM с помощью GridSearchCV. Но оценка лучшего оценщика сильно отличается от оценки при запуске SVM с лучшими параметрами.

#### Hyperparameter search with GridSearchCV###

pipeline = Pipeline([
        ("scaler", StandardScaler()), 
        ("svm", LinearSVC(loss='hinge'))])                      

param_grid=[{'svm__C': c_range}]      

clf = GridSearchCV(pipeline, param_grid=param_grid, cv=5, scoring='accuracy')
clf.fit(X,y)          
print('\n Best score: ',clf.best_score_)


#### scale train and test data  ###

sc = StandardScaler()
sc.fit(X)
X = scaler.transform(X)
X_test = sc.transform(X_test)


###### test best estimator with test data ###################

print("Best estimator score: ", clf.best_estimator_.score(X_test, y_test))


##### run SVM with the best found parameter ##### 

svc = LinearSVC(C=clf.best_params_['svm_C'])
svc.fit(X,y)
print("score with best parameter: ", svc.score(X_test,y_test))

Результаты следующие:

Лучший результат: 0,784

Оценка лучшего оценщика: 0,6991

оценка с лучшим параметром: 0,7968

Я не понимаю, почему оценки лучшего оценщика и svm отличаются? Какой из этих результатов является правильной точностью теста? Почему оценка лучшего оценщика с 0,6991 так хуже? Я сделал что-то не так?

1 Ответ

0 голосов
/ 15 октября 2019

В строке ниже:

print("Best estimator score: ", clf.best_estimator_.score(X_test, y_test))

вы передаете X_test, который уже масштабирован до clf, который является pipeline, который содержит другой масштабатор, так что, по сути, вы масштабируете свои данные дваждыв соответствии с вашим последним прогнозным утверждением, в котором вы передаете масштабированные данные в svc, который просто выполняет подгонку модели без масштабирования. Таким образом, данные, представленные в обоих случаях, совершенно разные, и поэтому ваши прогнозы также различны.

Надеюсь, это поможет!

...