在GridSearchCV中使用StandardScaler时,为什么会得到不同的结果?

时间:2019-10-14 21:44:31

标签: python-3.x scikit-learn svm gridsearchcv standardized

我想通过GridSearchCV优化SVM的超参数。但是,最佳估计器的分数与使用最佳参数运行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 :(得分:1)

在下面的行中:

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

您正在传递X_test,它已经缩放为clf,后者是pipeline,其中包含另一个缩放器,因此从本质上讲,您正在将数据缩放为上一次预测语句的两倍,其中您可以将缩放后的数据传递到svc,后者仅需拟合模型即可进行缩放。因此,两种情况下提供的数据都大不相同,因此您的预测也不同。

希望这会有所帮助!