Python:sklearn svm,提供自定义丢失功能

san*_* mk 5 python svm scikit-learn

我现在使用sklearn的svm模块的方法是使用它的默认值.但是,它对我的​​数据集没有特别好.是否可以提供自定义丢失功能或自定义内核?如果是这样,编写这样一个函数的方式是什么,以便它与sklearn的svm期望的内容以及如何将这样的函数传递给培训师?

这是一个如何做到这一点的例子:
SVM自定义内核

这里引用的代码:

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)
Run Code Online (Sandbox Code Playgroud)

我想了解这个内核背后的逻辑.如何选择内核矩阵?到底是y.T什么?

jak*_*vdp 1

为了回答您的问题,除非您非常清楚为什么要定义自定义内核,否则我会坚持使用内置内核。它们非常快速、灵活且功能强大,非常适合大多数应用。

话虽这么说,让我们更详细地讨论一下:

核函数是两点之间相似性的一种特殊度量。基本上相似度值越大意味着点越相似。scikit-learn SVM 被设计为能够与任何核函数一起工作。几个内置内核(例如线性、径向基函数、多项式、S形),但您也可以定义自己的内核。

您的自定义内核函数应如下所示:

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
Run Code Online (Sandbox Code Playgroud)

最基本的内核(线性内核)如下所示:

def linear_kernel(x, y):
    return np.dot(x, y.T)
Run Code Online (Sandbox Code Playgroud)

同样,你可以写

def linear_kernel_2(x, y):
    M = np.array([[1, 0],
                  [0, 1]])
    return np.dot(x, np.dot(M, y.T))
Run Code Online (Sandbox Code Playgroud)

这里的矩阵定义了内核作用的M所谓内积空间。可以修改该矩阵来定义新的内积空间;您链接到的示例中的自定义函数只是进行了修改,M以有效地将第一个维度在确定相似性方面的重要性加倍。

更复杂的非线性修改也是可能的,但你必须小心:核函数必须满足某些要求(它们必须满足内积空间的属性),否则 SVM 算法将无法正常工作。