【问题标题】:Optimal SVM parameters for high recall高召回率的最佳 SVM 参数
【发布时间】:2016-09-30 19:19:47
【问题描述】:

我正在使用 scikit-learn 使用 SVM 执行分类。我正在执行二进制分类任务。

0:不属于A类
1:属于A类

现在,我想优化参数以获得高召回率。我不太在意一些误报,但是属于A类的对象不应该经常被标记为不属于A

我使用带有线性内核的 SVM。

from sklearn import svm
clf = svm.SVC(kernel='linear')
clf.fit(X,Y)
clf.predict(...)  

我应该如何选择其他 SVM 参数,如 C?另外,带有线性内核的SVCLinearSVC 有什么区别?

【问题讨论】:

  • @ahieulle 谢谢!关于主要问题的任何观点?
  • 在选择最佳 SVC 参数时,您应该进行交叉验证,例如使用 GridSearchCVobject。 scikit-learn 文档中有一些示例

标签: python machine-learning scikit-learn svm


【解决方案1】:

内核的选择实际上取决于数据,因此根据数据图选择内核可能是要走的路。这可以通过运行所有内核类型并选择一个给你高/低召回或偏见的内核类型来自动化,无论你在寻找什么。你可以自己看the visual difference of the kernels

根据内核,SVC 构造函数的不同参数很重要,但通常 C 可能是最有影响力的,因为它是错误的惩罚。 Decreasing C 会增加召回率。

除此之外,还有更多方法可以获得更好的拟合,例如通过向传递给 svm.fit(X,y) 的 X 矩阵的 n_features 添加更多特征。

当然,plot the precision/recall to get a better feel of what the parameters are doing 总是有用的。

【讨论】:

    【解决方案2】:

    一般来说,您可以通过在学习过程中对这两种类型的错误进行不同的惩罚来解决这个问题。如果您查看损失函数,特别是在原始/参数设置中,您可以考虑将假阴性的惩罚按 alpha 缩放,将假阳性的惩罚按 (1 - alpha) 缩放,其中 alpha 在 [ 0 1]。 (类似的效果是在你的训练集中复制正实例的数量,但这会使你的问题不必要地变大,为了提高效率应该避免)

    【讨论】:

      【解决方案3】:

      您可以通过交叉验证选择 SVM 参数 C,这基本上是您的惩罚项。在这里您可以使用 K-Fold 交叉验证。您还可以使用一个名为 gridsearchCV 的 sklearn 类,您可以在其中传递您的模型,然后使用 cv 参数对其执行交叉验证。

      根据 linearSVC 文档 - 与参数 kernel='linear' 的 SVC 类似,但根据 liblinear 而不是 libsvm 实现,因此它在选择惩罚和损失函数方面具有更大的灵活性,并且应该更好地扩展到大量样本。

      【讨论】:

        猜你喜欢
        • 2021-09-01
        • 2020-03-08
        • 2012-09-14
        • 2015-12-05
        • 1970-01-01
        • 2021-06-16
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多