我正在尝试在scikit-learn中使用自定义的RBF核实现SVM,但出现了错误,该怎么办?

这段代码显示了错误:

Traceback (most recent call last):
  File "F:\MachineLearningPyCodes\SvmOnDelhiAqiDataPrbf.py", line 68, in 
    clf_SVM_radial_basis.fit(X_train,y_train)
  File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 189, in fit
    fit(X, y, sample_weight, solver_type, kernel, random_seed=seed)
  File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 230, in _dense_fit
    if X.shape[0] != X.shape[1]:
IndexError: tuple index out of range

我尝试了不同的方法,但我似乎无法按要求格式化我的数据集,请告诉我一种方法来做到这一点。


回答:

我对SVCkernel参数的工作方式感到困惑。它不仅仅是您所设定的radial_basis核函数;实际上,它必须返回格拉姆矩阵。您可以在sklearn的文档中看到这一点:

http://scikit-learn.org/stable/modules/svm.html#custom-kernels

总结一下那部分内容:您有两种选择。

(1)直接将格拉姆矩阵插入fit()方法中(不仅仅是X_train),并使用kernel='precomputed';或者

(2)编写一个返回格拉姆矩阵的函数,然后您可以将该新函数传递给kernel

这个SO上有很好的示例。改编他们写的内容,您可以这样做。我将使用第二种方法,并保留您原来的radial_basis作为示例说明。

def radial_basis(x, y, gamma=10):
    return np.exp(-gamma * la.norm(np.subtract(x, y)))

def proxy_kernel(X, Y, K=radial_basis):
    """另一个函数,用于返回格拉姆矩阵,
    这在SVC的kernel或fit中是需要的
    """
    gram_matrix = np.zeros((X.shape[0], Y.shape[0]))
    for i, x in enumerate(X):
        for j, y in enumerate(Y):
            gram_matrix[i, j] = K(x, y)
    return gram_matrix

clf_SVM_radial_basis = SVC(kernel=proxy_kernel) # 注意现在这里是proxy_kernel
clf_SVM_radial_basis.fit(X_train, y_train)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注