Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在scikit learn中,是否可以通过网格搜索对自定义内核的参数进行调优?_Python_Scikit Learn - Fatal编程技术网

Python 在scikit learn中,是否可以通过网格搜索对自定义内核的参数进行调优?

Python 在scikit learn中,是否可以通过网格搜索对自定义内核的参数进行调优?,python,scikit-learn,Python,Scikit Learn,我有一个自定义的内核函数,我正在使用带有SVC的GridSearchCV函数(kernel=my_kernel) 我的_内核函数需要调整一个参数k,所以我想知道是否可以配置param _grid选项来调整自定义内核函数的参数 例如,可以按如下方式调整RBF内核的gamma参数。我可以为我的定制内核提供一个param_grid=dict(k=k_range)类型的选项吗 gamma_range = 10. ** np.arange(-5, 4) param_grid = dict(gamma=ga

我有一个自定义的内核函数,我正在使用带有SVC的GridSearchCV函数(kernel=my_kernel)

我的_内核函数需要调整一个参数k,所以我想知道是否可以配置param _grid选项来调整自定义内核函数的参数

例如,可以按如下方式调整RBF内核的gamma参数。我可以为我的定制内核提供一个param_grid=dict(k=k_range)类型的选项吗

gamma_range = 10. ** np.arange(-5, 4)
param_grid = dict(gamma=gamma_range)
grid = GridSearchCV(SVC(), param_grid=param_grid, cv=StratifiedKFold(y=Y, k=5))

一种方法是使用
Pipeline
SVC(kernel='precomputed')
并将自定义内核函数包装为
sklearn
估计器(一个
BaseEstimator
TransformerMixin
的子类)

例如,
sklearn
包含一个
chi2_内核(X,Y=None,gamma=1.0)
,它计算特征向量
X
Y
的内核矩阵。 此函数采用参数
gamma
,最好使用交叉验证进行设置。 我们可以对该函数的参数进行网格搜索,如下所示:

from\uuuuu future\uuuuu导入打印功能
来自未来进口部
导入系统
将numpy作为np导入
导入sklearn
来自sklearn.base导入BaseEstimator,TransformerMixin
从sklearn.cross\u验证导入序列测试\u分割
从sklearn.dataset导入load_数字
从sklearn.grid\u搜索导入GridSearchCV
从sklearn.metrics导入准确性\u分数
从sklearn.metrics.pairwise导入chi2_内核
从sklearn.pipeline导入管道
从sklearn.svm导入SVC
#自定义内核chi2_内核的包装器类
Chi2Kernel类(基本估计量,TransformerMixin):
def ___;初始(自,伽马=1.0):
超级(Chi2Kernel,self)。\uuuu init\uuuuuu()
self.gamma=gamma
def变换(自,X):
返回chi2_内核(X,self.X_列,gamma=self.gamma)
def配合(自身、X、y=无,**配合参数):
self.X\u列车=X
回归自我
def main():
打印('python:{}'。格式(sys.version))
打印('numpy:{}'。格式(np.\uuu版本)
打印('sklearn:{}'。格式(sklearn.\uuuuuuu版本)
np.random.seed(0)
#获取一些数据进行评估
数据集=加载数字()
X=dataset.data
y=dataset.target
X_系列,X_测试,y_系列,y_测试=系列测试分割(X,y,测试尺寸=0.33)
#创建一个管道,其中包含自定义预定义内核Chi2Kernel
#在SVC之前运行。
管道([
('chi2',Chi2Kernel()),
('svm',SVC()),
])
#设置自定义内核的参数“gamma”
#使用“估计器参数”语法。
cv_参数=dict([
('chi2__γ',10.0**np.arange(-9,4)),
('svm__内核',['precomputed']),
('svm_u_C',10.0**np.arange(-2,9)),
])
#进行网格搜索以获得“gamma”的最佳参数值。
model=GridSearchCV(管道,cv参数,cv=5,verbose=1,n_作业=-1)
模型拟合(X\U系列、y\U系列)
y_pred=模型预测(X_检验)
acc_测试=准确性_分数(y_测试,y_预测)
打印(“测试精度:{}”。格式(acc_测试))
打印(“最佳参数:”)
打印(型号最佳参数)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
输出:


在您的情况下,只需使用计算内核矩阵的函数替换
chi2_内核

如中所述。。。如何使用自动参数调整与?它是sklearn的替代品,通常比手动调整参数做得更好。

使用scikit learn 0.19,您可以

from sklearn.kernel_ridge import KernelRidge
from sklearn.metrics.pairwise import chi2_kernel

reg_kridge=KernelRidge(kernel='chi2')
params_grid={"gamma":np.logspace(0,-4,5)}
reg=GridSearchCV(reg_kridge,params_grid, n_jobs=-1,cv=10,scoring='neg_mean_squared_error')
reg.fit(train, target)

我正试图使用Tommi的示例来实现。我一直收到这个错误:
PicklingError:Can't pickle:它与epanechnikov_kernel不是同一个对象。epanechnikov_kernel
另一个建议关闭
%load\u ext autoreload
autoreload 2
,但我仍然收到这个错误。想法?您可能会发现,
dill
包比其他酸洗方法更好地处理序列化非标准/自定义转换
from sklearn.kernel_ridge import KernelRidge
from sklearn.metrics.pairwise import chi2_kernel

reg_kridge=KernelRidge(kernel='chi2')
params_grid={"gamma":np.logspace(0,-4,5)}
reg=GridSearchCV(reg_kridge,params_grid, n_jobs=-1,cv=10,scoring='neg_mean_squared_error')
reg.fit(train, target)