You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印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存在差异的原因

打印最优核函数的方法

有两种直接可靠的方式,不会受默认参数省略规则影响:

  1. 直接访问最优估计器的kernel属性,代码如下:
print("最优模型使用的核函数:", clf.best_estimator_.kernel)
  1. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:54:30