我现在使用sklearn的svm模块的方法是使用它的默认值。但是,它对我的数据集没有特别好。是否可以提供自定义丢失功能或自定义内核?如果是这样,编写这样一个函数的方式是什么,以便它与sklearn的svm期望的内容以及如何将这样的函数传递给培训师?
这是一个如何做的例子:
SVM custom kernel
此处引用的代码:
def my_kernel(x, y):
"""
We create a custom kernel:
(2 0)
k(x, y) = x ( ) y.T
(0 1)
"""
M = np.array([[2, 0], [0, 1.0]])
return np.dot(np.dot(x, M), y.T)
我想了解这个内核背后的逻辑。如何选择内核矩阵?究竟是什么y.T
?
答案 0 :(得分:1)
要回答您的问题,除非您非常了解为什么要定义自定义内核,否则我会坚持使用内置函数。它们非常快速,灵活且功能强大,非常适合大多数应用程序。
话虽如此,让我们更详细一点:
Kernel Function是一种特殊的两点相似度量。基本上,相似度的较大值意味着点更相似。 scikit-learn SVM旨在能够使用任何内核函数。内置了几个内核(例如线性,径向基函数,多项式,sigmoid),但您也可以定义自己的内核。
您的自定义内核函数应如下所示:
def my_kernel(x, y):
"""Compute My Kernel
Parameters
----------
x : array, shape=(N, D)
y : array, shape=(M, D)
input vectors for kernel similarity
Returns
-------
K : array, shape=(N, M)
matrix of similarities between x and y
"""
# ... compute something here ...
return similarity_matrix
最基本的内核,一个线性内核,看起来像这样:
def linear_kernel(x, y):
return np.dot(x, y.T)
等效地,你可以写
def linear_kernel_2(x, y):
M = np.array([[1, 0],
[0, 1]])
return np.dot(x, np.dot(M, y.T))
矩阵M
在此定义了内核作用的所谓inner product space。可以修改该矩阵以定义新的内积空间;您链接到的示例中的自定义函数仅修改M
,以有效地将第一维的重要性加倍,以确定相似性。
也可以进行更复杂的非线性修改,但是必须要小心:内核函数必须满足certain requirements(它们必须满足内积空间的属性)或者SVM算法不起作用正确。