Python中针对SVR超参数组的并行交叉验证方案问询
实现GridSearchCV的超参数固定配对搜索
嘿,我完全懂你的需求——你想要让GridSearchCV只测试你指定的超参数配对组合,而不是默认遍历所有参数的笛卡尔积。这个需求很实用,尤其是当你已经有几组预设的超参数组合需要验证的时候,下面给你两种简单的实现方式:
方法1:手动定义每组参数组合
直接把tuned_parameters写成一个字典列表,每个字典对应一组完整的超参数配对:
from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV # 定义你需要的固定配对组合 tuned_parameters = [ {'kernel': ['rbf'], 'gamma': [1e-3], 'C': [100]}, # 第一组配对:(1e-3, 100) {'kernel': ['rbf'], 'gamma': [1e-4], 'C': [1000]} # 第二组配对:(1e-4, 1000) ] clf = GridSearchCV(SVR(), tuned_parameters, cv=5, n_jobs=-1) clf.fit(X_train, y_train)
GridSearchCV会逐个遍历列表里的每个字典,每个字典内部的参数列表如果只有一个元素,就会直接使用这个值,这样就只会运行你指定的两组组合,而不是默认的4种全排列。
方法2:用列表推导式批量生成配对(适合多组参数)
如果你有很多组配对参数,手动写字典太麻烦,可以用zip()把对应的参数列表打包,再通过列表推导式生成tuned_parameters:
C_list = [100, 1000, 500] # 对应每组的C值 gamma_list = [1e-3, 1e-4, 1e-2] # 对应每组的gamma值 tuned_parameters = [ {'kernel': ['rbf'], 'gamma': [g], 'C': [c]} for c, g in zip(C_list, gamma_list) ] # 后续调用GridSearchCV的代码和之前一样 clf = GridSearchCV(SVR(), tuned_parameters, cv=5, n_jobs=-1) clf.fit(X_train, y_train)
这样就能自动生成(100,1e-3)、(1000,1e-4)、(500,1e-2)这三组配对,非常高效。
为什么原来的写法会生成全组合?
你原来的代码里,tuned_parameters是一个包含多元素列表的单一字典,GridSearchCV的默认行为是对所有参数列表做笛卡尔积运算,也就是每个gamma值都会和每个C值配对,所以会生成4种组合。而改成字典列表后,每个字典都是独立的参数集合,不会再交叉组合。
内容的提问来源于stack exchange,提问作者DexzMen
相关产品推荐
相关产品推荐

