在 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 中的线性差得多