不同特征的不同内核 - scikit-learn SVM

Posted

技术标签:

【中文标题】不同特征的不同内核 - scikit-learn SVM【英文标题】:Different kernels for different features - scikit-learn SVM 【发布时间】:2020-09-17 06:29:02 【问题描述】:

我正在尝试使用 sklearn.svm.SVC 构建分类器,但我想在不同的特征子集上分别训练内核以更好地表示特征空间(如 here 所述)。

我已阅读用户指南 page 并且我知道我可以创建单个内核的总和的内核或将预先计算的内核 (kernel = 'precomputed') 输入 SVC,但我不明白我如何应用不同的内核不同的功能?有没有办法在sklearn 中实现这一点?

我找到了一种在 sklearn (https://scikit-learn.org/stable/modules/gaussian_process.html#gp-kernels) 中计算内核的方法,因此我可以分别计算每个集合的内核。但是,一旦我输出了距离矩阵,我不确定如何使用它来训练 SVM。

我是否必须创建一个自定义内核,例如:

if feature == condition1:
   use kernel X
else:
   use kernel Y

并将其添加到 SVM?

或者还有其他我可以使用的python库吗?

【问题讨论】:

【参考方案1】:

你指的是Multiple Kernel Learning (MKL)的问题。您可以在其中为不同的功能组训练不同的内核。我在一个多模式案例中使用了它,我想要不同的图像和文本内核。

我不确定你是否真的可以通过 scikit-learn 做到这一点。

GitHub上提供了一些库,比如这个:https://github.com/IvanoLauriola/MKLpy1

希望它可以帮助您实现目标。

【讨论】:

【参考方案2】:

sklearn 中可以进行多核学习。只需指定kernel='precomputed',然后将要使用的内核矩阵传递给fit

假设您的核矩阵是其他两个核矩阵的总和。你可以计算K1K2,但是你喜欢并使用SVC.fit(X=K1 + K2, y=y)

【讨论】:

据我了解,这个实现的问题是你无法了解每个内核的权重,而 @alift 建议的包允许你这样做 调整内核权重是什么意思?您是否在考虑 K1K2 的凸组合?或者K1K2的超参数,比如RBF的长度尺度参数或者多项式次数? 是的,我希望使用某种弱内核的组合,而不是为我的每个功能集找到最佳视图。他们在本文的介绍中解释了这个想法:sciencedirect.com/science/article/pii/S0925231215003653 这一切都很好,但是您的问题中没有这些细节。这使得很难写出有用的答案。 这些是我提出问题后的想法和信息,也感谢上面alift的回答,这就是为什么它不在原始问题中。如果您认为它对其他用户更有用,我现在可以更新问题

以上是关于不同特征的不同内核 - scikit-learn SVM的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 管道与手动操作时的不同分数

了解python scikit-learn中的文本特征提取TfidfVectorizer

在 scikit-learn 中使用具有多项式内核的支持向量分类器

机器学习:SVM(scikit-learn 中的 SVM:LinearSVC)

Scikit-Learn 中的分类数据转换

scikit-learn交叉验证及其用于參数选择模型选择特征选择的样例