首页 > 解决方案 > 在 svm.scv() 中同时使用“class_weight”和“c”参数会发生什么?

问题描述

我正在尝试构建一个分类器。在玩超参数时,我碰巧同时使用了参数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)

我的理解是,在设置班级权重时,您是C根据这个方程式设置值公式

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

谢谢

标签: scikit-learn

解决方案


设置类权重和设置C参数是两个独立的事情,你不应该期望结果是一样的。

该文档说以下内容:

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

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

换句话说:

  • 在您的第一个示例中,您将拥有C = 1*5 = 50 类和C = 1*10 = 101 类(因为默认值为 1.0)

  • 在您的第二个示例中,您将拥有C = 5*5 = 250C = 5*10 = 50类和 1 类


推荐阅读