如何打印GridSearchCV得到的最优SVM分类器所用的核函数
问题说明
使用GridSearchCV对SVM分类器做核函数网格搜索时,直接打印clf.best_estimator_的输出为:
best estimator SVC(C=8, gamma=0.125, probability=True)
对应实现代码如下:
kernel=["linear", "rbf"], C=[8], gamma=[0.125], params = dict(kernel=kernel, C=C, gamma=gamma) svc = sklearn.svm.SVC(probability=True) clf = sklearn.model_selection.GridSearchCV(svc, params, n_jobs=nproc, verbose=10) clf.fit(self.W[:], self.y[:]) print('best estimator', clf.best_estimator_)
存在两个待解决的疑问:
- 如何打印最优估计器实际使用的核函数
- 单独测试单个核函数、与同时搜索两个核函数得到的
best_score存在差异的原因
打印最优核函数的方法
有两种直接可靠的方式,不会受默认参数省略规则影响:
- 直接访问最优估计器的
kernel属性,代码如下:
print("最优模型使用的核函数:", clf.best_estimator_.kernel)
- 调用
clf.best_params_属性,直接查看网格搜索选出的全部最优参数字典,代码如下:
print("全部最优参数:", clf.best_params_)
之前打印
best_estimator_看不到核函数的原因:sklearn的估计器打印字符串时,只会显示与类默认值不一致的参数。SVC类的默认核函数就是rbf,当搜索选出的最优核是rbf时,就不会在打印字符串里单独列出kernel字段。
单独测试与网格搜索得分不一致的原因
核心原因是随机过程未固定,具体来源包括:
- 交叉验证拆分的随机性:如果初始化
GridSearchCV时没有指定固定的random_state,每次运行时交叉验证的数据集折拆分是随机生成的。不管是单独测试linear核、单独测试rbf核,还是两个核一起做网格搜索,只要折拆分不一样,相同参数对应的交叉验证得分就会存在波动。 - SVC概率计算的随机性:初始化SVC时设置了
probability=True,该模式下SVM内部会通过额外的交叉验证拟合逻辑回归来输出概率值,这个过程本身也带有随机性,未固定随机种子时也会带来结果差异。
如果需要复现完全一致的结果,只需要在所有涉及随机操作的环节固定同一个random_state值即可,示例:
svc = sklearn.svm.SVC(probability=True, random_state=42) clf = sklearn.model_selection.GridSearchCV(svc, params, n_jobs=nproc, verbose=10, random_state=42)
固定随机种子后,相同参数下不管是单独测试还是网格搜索,得到的交叉验证得分都会完全一致。
内容的提问来源于stack exchange,提问作者superStar
相关产品推荐
相关产品推荐

