我目前正在研究文本分类器,并使用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)
我的问题是:
注意:我使用朴素贝叶斯分类器观察到了相同的演变... 我已经为test_size尝试了几个值,看来它对best_score的影响不大,有些事情我不理解。
提前谢谢!
Antoine
答案 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)