在svm.scv()中同时使用“ class_weight”和“ c”参数时会发生什么?

时间:2019-04-03 19:15:28

标签: scikit-learn

我正在尝试建立一个分类器。在处理超参数时,我碰巧同时使用了参数class_weightsC,并且看到了我不理解的结果。

此代码为我提供了不同的f1得分

clf = svm.SVC(kernel="linear",class_weight={1:10,0:5})
clf.fit(X_train_tfidf, y_train)
predicted=clf.predict(X_test_tfidf)
f1_score(y_test, predicted)

通过此代码

clf = svm.SVC(kernel="linear",class_weight={1:10,0:5},c=5)
clf.fit(X_train_tfidf, y_train)
predicted=clf.predict(X_test_tfidf)
f1_score(y_test, predicted)

我的理解是,在设置类别权重时,您正在根据此公式formula设置C值。

在那种情况下,我希望C参数被忽略。但这似乎并非如此。 sklearn在做什么?我理解错了吗?

谢谢

1 个答案:

答案 0 :(得分:1)

设置类权重和设置C参数是两个独立的过程,您不应期望结果相同。

文档说以下内容:

  

在需要更加重视某些类或某些单个样本的问题中,可以使用class_weight和sample_weight关键字。

     

SVC在fit方法中实现了关键字class_weight。这是一种{class_label:value}形式的字典,其中value是一个浮点数> 0,它将class_label类的参数C设置为C * value。

换句话说:

  • 在第一个示例中,类别0将具有C = 1*5 = 5,类别1将具有C = 1*10 = 10(因为默认值为1.0)

  • 在第二个示例中,对于类0,您将拥有C = 5*5 = 25,对于类1,您将拥有C = 5*10 = 50