sklearn的GridSearchCV问题

时间:2018-07-12 15:12:38

标签: python scikit-learn svm grid-search

我目前正在研究文本分类器,并使用sklearn的GridsearchCV为分类器获取最佳的超参数。但是,gridsearch返回的“ best_score”有一些我不理解的地方:

f=open('cleaned_data.pkl','rb')
X=pickle.load(f)
f.close()

f=open('cleaned_targets.pkl','rb')
Y=pickle.load(f)
f.close()

X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.01,random_state=1,stratify=Y)

test_param_gamma=[i for i in np.arange(0.1,0.6,0.1)]
test_param_C=[i for i in np.arange(4,4.5,0.1)]

count_vect = CountVectorizer(stop_words='english')
tfidf_transformer = TfidfTransformer()

parameters = {'clf2__gamma': test_param_gamma,'clf2__C':test_param_C}
nb=Pipeline([['cv',count_vect],['tfidf',tfidf_transformer],['clf2',SVC()]]) 
gs_clf2 = GridSearchCV(nb, parameters,verbose=10)
gs_clf2 = gs_clf2.fit(X_train, Y_train)
print(gs_clf2.best_score_)
print(gs_clf2.best_params_)

如果我使用比X和Y小的数据集的X_train和Y_train拟合我的网格搜索(但由于我使用的test_size为0.01,这只是一点点),那么与通过整体训练它相比,我得到的best_score高10点数据集,即:

gs_clf2 = gs_clf2.fit(X, Y)

我的问题是:

  1. 为什么我的分类器使用较小的数据集会更好?
  2. 为什么对于仅多获得20个样本的数据集,效率会有如此大的差异?

注意:我使用朴素贝叶斯分类器观察到了相同的演变... 我已经为test_size尝试了几个值,看来它对best_score的影响不大,有些事情我不理解。

提前谢谢!

Antoine

1 个答案:

答案 0 :(得分:0)

好吧,我只是通过查看变量来找到了答案,这可能很有用:

sklearn的

train_test_split允许您将数据集分为两个数据集,一个用于训练,另一个用于测试。

尽管如此,它还会执行随机播放,这样您就不会像[1 1 1 1 1 3 3 3 3 3 3 3 3 2 2 2 ...]那样设置训练/测试目标(我的数据以这种方式排序),但类似[1 1 3 2 2 3 1 3 2 1 ...]。

因此,当Gridsearch执行交叉验证时,它使用的折痕会存在多样性。如果您不重新整理数据,折叠肯定会看起来像[1 1 1 1 1 3 3],[3 3 3 3 2 2],...等等

欺骗一次以相同顺序随机播放两个列表:

from random import shuffle
c=list(zip(X,Y))
shuffle(c)
X,Y=zip(*c)