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

Posted

技术标签:

【中文标题】为啥在 GridSearchCV 中使用 StandardScaler 时会得到不同的结果?【英文标题】:Why do I get different results when using the StandardScaler in GridSearchCV?为什么在 GridSearchCV 中使用 StandardScaler 时会得到不同的结果? 【发布时间】:2020-02-11 12:43:36 【问题描述】:

我想通过 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

我不明白为什么best estimator 和svm 的分数不一样?以下哪个结果是正确的测试精度?为什么 0.6991 的 Best estimator 的得分这么差?我是不是做错了什么?

【问题讨论】:

答案很有帮助。非常感谢 抱歉。刚做完。由于疏忽,我只按了“这个答案很有用。” 【参考方案1】:

在下面一行:

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

您正在传递X_test,它已经缩放到clf,它是一个包含另一个缩放器的pipeline,因此基本上您将数据缩放两倍于您将缩放后的数据传递到的最后一个预测语句svc 只是在不缩放的情况下进行模型拟合。因此,两种情况下提供的数据完全不同,因此您的预测也不同。

希望这会有所帮助!

【讨论】:

以上是关于为啥在 GridSearchCV 中使用 StandardScaler 时会得到不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sklearn.grid_search.GridSearchCV 在每次执行时都会返回随机结果?

为啥在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C

为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?

为啥 GridSearchCV 模型结果与我手动调整的模型不同?

为啥 scikit-learn 中的 GridSearchCV 会产生这么多线程

Scikit-learn GridSearchCV - 为啥我在执行 grid.fit() 时会收到数据类型错误?