不同特征的不同内核 - 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
。
假设您的核矩阵是其他两个核矩阵的总和。你可以计算K1
和K2
,但是你喜欢并使用SVC.fit(X=K1 + K2, y=y)
。
【讨论】:
据我了解,这个实现的问题是你无法了解每个内核的权重,而 @alift 建议的包允许你这样做 调整内核权重是什么意思?您是否在考虑K1
和 K2
的凸组合?或者K1
和K2
的超参数,比如RBF的长度尺度参数或者多项式次数?
是的,我希望使用某种弱内核的组合,而不是为我的每个功能集找到最佳视图。他们在本文的介绍中解释了这个想法:sciencedirect.com/science/article/pii/S0925231215003653
这一切都很好,但是您的问题中没有这些细节。这使得很难写出有用的答案。
这些是我提出问题后的想法和信息,也感谢上面alift的回答,这就是为什么它不在原始问题中。如果您认为它对其他用户更有用,我现在可以更新问题以上是关于不同特征的不同内核 - scikit-learn SVM的主要内容,如果未能解决你的问题,请参考以下文章
了解python scikit-learn中的文本特征提取TfidfVectorizer
在 scikit-learn 中使用具有多项式内核的支持向量分类器