在 SVM 中使用带有卡方距离度量的 RBF 内核

Posted

技术标签:

【中文标题】在 SVM 中使用带有卡方距离度量的 RBF 内核【英文标题】:Use RBF Kernel with Chi-squared distance metric in SVM 【发布时间】:2017-07-17 02:14:45 【问题描述】:

如何实现标题中提到的任务。我们在 RBF 内核中是否有任何参数可以将距离度量设置为卡方距离度量。我可以在 sk-learn 库中看到一个 chi2_kernel。

下面是我写的代码。

import numpy as np
from sklearn import datasets
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix

from sklearn.preprocessing import Imputer
from numpy import genfromtxt
from sklearn.metrics.pairwise import chi2_kernel


file_csv = 'dermatology.data.csv'
dataset = genfromtxt(file_csv, delimiter=',')

imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=1)
dataset = imp.fit_transform(dataset)

target = dataset[:, [34]].flatten()
data = dataset[:, range(0,34)]

X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3)

# TODO : willing to set chi-squared distance metric instead. How to do that ?
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

print(f1_score(y_test, y_pred, average="macro"))
print(precision_score(y_test, y_pred, average="macro"))
print(recall_score(y_test, y_pred, average="macro"))

【问题讨论】:

【参考方案1】:

您确定要撰写 rbf 和chi2 吗? Chi2 自己定义了一个有效的内核,你所要做的就是

clf = svm.SVC(kernel=chi2_kernel, C=1)

因为 sklearn 接受 函数 作为内核(但这需要 O(N^2) 内存和时间)。如果您想组合这两个,它会更复杂一些,您必须实现自己的内核才能做到这一点。要获得更多控制(和其他内核),您也可以尝试pykernels,但尚不支持组合。

【讨论】:

以上是关于在 SVM 中使用带有卡方距离度量的 RBF 内核的主要内容,如果未能解决你的问题,请参考以下文章

在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性差得多

为啥使用 SVM 线性内核的代码不能使用 RBF

将带有 rbf 内核的 sklearn SVC 移植到 java

带有 rbf 内核的 SVC 的 10 大功能

sklearn SVM 默认距离测量

Lasvm 文档和信息 [关闭]