在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数
Posted
技术标签:
【中文标题】在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数【英文标题】:Parse parameter to custom kernel function of SVM in Sci-kit Learn 【发布时间】:2015-03-28 05:09:13 【问题描述】:我按照教程 SVM with custom kernel 并尝试在 SVM 中使用自定义内核。比如我实现多项式核函数如下:
def poly_kernel(x, y):
degree = 3
return np.dot(x, y.T) ** 3
然后结果似乎与度数为 3 的原始“多边形”非常相似。但是它带来了一个问题,我不知道如何将 度数 解析为内核函数的参数.
例如,我构建Support Vector Regression如下:
# X is some data
# y is some target
svr = SVR(kernel=poly_kernel, C=1e3, degree=4)
y = svr.fit(X, y).predict(X)
它似乎没有正确地将参数解析到内核。我还尝试了内核函数中的命名参数
def poly_kernel(x, y, **kwargs):
degree = 3
try:
degree = kwargs.get('degree')
except:
pass
return np.dot(x, y.T) ** 3
但它不起作用。
那么在这种情况下有什么办法可以正确解析参数吗?
提前致谢。
【问题讨论】:
【参考方案1】:在这种情况下可以动态构造核函数。我们可以使用 lambda 获取匿名函数作为变量。
例如:
def linear_kernel(c = 0):
return lambda x, y: np.dot(x, y.T) + c
当我们想使用它时,我们就这样做:
lkf = linear_kernel(c=20)
svr_linear = SVR(kernel=lkf)
y_linear = svr_linear.fit(X, y).predict(X)
当我调用 SVR() 时,我只是忽略了参数。
但是我不确定这是否是一种肮脏的方式,但至少它有效。
【讨论】:
以上是关于在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数的主要内容,如果未能解决你的问题,请参考以下文章
如何用sci-kit learn识别误分类文本文件的ID/名称/标题
如何在 scikit learn 中将特定课程与我的词袋配对
如何在 Sci-Kit Learn / Tensorflow 中检测对象大小?