使用gridsearchCV()后没有获得更好的结果,反而手动调整参数效果更好。

3

我想学习gridsearchCV的工作原理,通过在Knearistneighbors上进行测试。当我将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个回答

2
问题并不在于邻居数量,而在于“交叉验证”。GridSearchCV过程不仅尝试了param_grid中的所有值,还进行了一些数据操作:数据的“折叠”。这是对数据进行多次重采样,以帮助使最终分类器对新数据更加健壮。考虑到您获得的gaussgausCV模型之间得分非常接近,几乎可以确定被抽取的数据正在影响结果,但影响并不大。
这是一个很好的例子,说明仅接受得分最高的模型可能并不总是最佳选择:相对于没有经过交叉验证的模型(其他条件相等),我更相信经过交叉验证的模型能够得高分。 点击此处可获取关于运行交叉验证时发生了什么的详细描述。

2
哇,所以GridSearchCV正在执行交叉验证并使用我提供的值集合,对吗? 那么,有没有一种方法只让超参数变化并找到最优模型,即我现在不想进行交叉验证。 感谢您的回复。 - Sadaf Shafi
2
如果您真的想要在每次运行超参数时保持数据不变,我认为最好的方法是循环遍历每个单独的参数来运行模型,并将得分存储到您创建的函数中以供查看或比较。由于有多个参数,这可能意味着多个循环,这会变得很慢。 - Savage Henry
2
肯定的是,对于n_neighbors参数,我知道该怎么做,但是对于C或alpha参数,我应该怎么办呢?我们有其他的函数可以使用吗?我尝试了一下,但没有找到。 - Sadaf Shafi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接