有没有办法从 scikit-learn 模型中手动删除支持向量?

数据挖掘 scikit-学习 支持向量机
2022-02-14 14:36:14

我处于需要限制支持向量机二进制分类器中支持向量 (SV) 的数量的情况。一种简单的方法是手动删除最不重要的 SV。有谁知道这样做的方法?

我尝试手动修改 SVM 的以下字段以删除 SV,但没有成功:

clf.dual_coef_
clf.intercept_
clf.n_support_
clf.support_
clf.support_vectors_
clf.shape_fit_

clf我的 RBF SVM在哪里。

请注意,增加正则化(通过降低 C)并不一定会减少 SV 的数量(https://dgroppe.com/2018/01/21/increased-regularization-does-not-necessarily-decrease-the-number-of-支持向量/ )

2个回答

我遇到了同样的问题。我设法用 Scikit 的OneClassSVM; 也许它对您的情况也有帮助。我调整了您提到的一些参数以及更多参数(以防万一),包括:

  • _dual_coef_
  • dual_coef_
  • _截距_
  • 截距_
  • 支持_
  • 支持向量_

例如:对于 OneClassSVM,如果您获得了 10 个支持向量(在拟合数据集 X 之后)并想要修剪最后一个(索引 -1),则代码如下:

model = OneClassSVM()
model.fit(X)

model._intercept_ = model._intercept_ + temp_model.dual_coef_[0][-1]
model.intercept_ = model.intercept_ + temp_model.dual_coef_[0][-1]
model._dual_coef_ = np.delete(model._dual_coef_, -1, axis=1)
model.dual_coef_ = np.delete(model.dual_coef_, -1, axis=1)
model.support_ = np.delete(model.support_, -1, axis=0)
model.support_vectors_ = np.delete(model.support_vectors_, -1, axis=0)

一种选择是使用 Nu-Support Vector Classification,在 SciKit Learn 中实现为NuSVC,并在用户指南中进行了介绍

这里引入了一个参数 Nu

训练误差分数的上限和支持向量分数的下限。应该在区间 (0, 1].

通过减少 Nu 可以减少支持向量的数量