我正在使用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 ?另外,SVC
与线性内核和LinearSVC
之间有什么区别?
答案 0 :(得分: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始终有用。
答案 1 :(得分:0)
一般来说,您可以通过在学习过程中以不同方式惩罚这两种类型的错误来解决此问题。如果你看一下损失函数,特别是在原始/参数设置中,你可以考虑通过α来减少假阴性的惩罚和假阳性的惩罚(1 - alpha),其中alpha在[ 0 1]。 (类似的效果是复制训练集中的正实例数,但这会使你的问题不必要地变大,这应该避免效率)
答案 2 :(得分:0)
您可以通过交叉验证选择SVM参数C,这基本上是您的惩罚项。在这里,您可以使用K-Fold交叉验证。您还可以使用名为gridsearchCV的sklearn类,您可以在其中传递模型,然后使用cv参数对其执行交叉验证。
根据linearSVC文档 - 与参数kernel ='linear'的SVC类似,但是以liblinear而不是libsvm的形式实现,因此它在惩罚和损失函数的选择上具有更大的灵活性,并且应该更好地扩展到大量样本。