使用 gridsearchCV() 后没有得到更好的结果,而是手动变得更好

Posted

技术标签:

【中文标题】使用 gridsearchCV() 后没有得到更好的结果,而是手动变得更好【英文标题】:Not getting better results after using gridsearchCV(), rather getting better manually 【发布时间】:2020-05-22 23:13:18 【问题描述】:

我试图通过在 Knearistneighbors 上测试来学习 gridsearchCV 的工作原理。 当我分配 n_neighbors = 9 时,我的分类器得分为 0.9122807017543859

但是当我使用 gridsearchCV 同时给它 n_neighbors = 9 时,在列表中,我得到的分数是 0.8947368421052632。

可能是什么原因? 任何努力都值得赞赏。 这是我的代码

from sklearn import datasets
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split as splitter
import pickle       
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

# Data pre-processing  <-----------------------

data = datasets.load_breast_cancer()
p=data
add=data.target.reshape(569,1)  
columns = np.append(data.feature_names, 
                    data.target_names[0],
                    axis=None)
data = np.append(data.data,
                 add,
                 axis=1)                        
df = pd.DataFrame(data=data,columns=columns)

X_train,X_test,y_train,y_test = splitter(p.data,
                                         p.target,
                                         test_size=0.3,
                                         random_state=12)




gauss = KNeighborsClassifier(n_neighbors=9)

param_grid='n_neighbors':[1,2,3,4,5,6,7,8,9,11,12,13,10]

gausCV = GridSearchCV(KNeighborsClassifier(),param_grid,verbose=False)


gauss.fit(X_train,y_train)
gausCV.fit(X_train,y_train)

print(gauss.score(X_test,y_test))
print(gausCV.score(X_test,y_test))

这就是我得到的

0.9122807017543859
0.8947368421052632

【问题讨论】:

【参考方案1】:

问题不在于邻居的数量,而在于“交叉验证”。 GridSearchCV 进程不仅会尝试您在param_grid 中拥有的所有值,还会执行一些数据操作:数据的“折叠”。这是对数据进行多次重新采样,以帮助使最终分类器对新数据尽可能鲁棒。考虑到您在gaussgausCV 模型之间获得的分数有多接近,几乎可以肯定所绘制的数据会影响结果,但影响不大。

这是一个很好的例子,说明为什么只接受具有最高“分数”的模型可能并不总是最好的路径:与没有经过交叉验证的模型相比,我对得分良好的模型更有信心(其他都一样)。

Here is a good description 运行交叉验证时发生了什么。

【讨论】:

哇,所以 GridSearchCV 正在执行交叉验证并使用我给它的一组值,对吧?那么,有没有一种方法我只想改变超参数并找到最佳模型,即我不希望现在发生交叉验证。感谢回复 如果你真的想为超参数的每次运行保持数据不变,我认为你最好的办法是遍历每个单独的参数来运行模型,并存储分数以供审查或在您创建的函数中进行比较。由于有多个参数,可能意味着多个循环,这会变慢。 当然,那是 n_neighbors,但是当它是 C 或 alpha 时,我在那里做什么。我们是否有任何其他功能。我试过了,但没有找到

以上是关于使用 gridsearchCV() 后没有得到更好的结果,而是手动变得更好的主要内容,如果未能解决你的问题,请参考以下文章

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

Gridsearchcv 与贝叶斯优化

与 xgboost.cv 相比,GridSearchCV 没有给出与预期相同的结果

GridsearchCV 不检查所有拆分 [关闭]

如何使用 GridSearchCV 确定的最优参数

如何保存 GridSearchCV 对象?