scikit-learn中使用class_weight的SVC

3

我希望在sikit-learn中使用class_weight创建一个加权的SVC分类器。不过,我不确定我是否正确配置了我的模型。请考虑以下示例:

x = np.array([[0,0,1],[0,1,1],[1,0,0]])
y = np.array([1,1,0])

cw = {}
for l in set(y):
    cw[l] = np.sum(y == l)
print(cw)

m = SVC(probability = True, max_iter = 1000, class_weight = cw)
m = m.fit(x,y)

我获取了这个模型:

SVC(C=1.0, cache_size=200, class_weight={0: 1, 1: 2}, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=1000, probability=True, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

使用class_weight={0: 1, 1: 2}对应于每个类别中数据点的数量。 问题:这样做正确吗?

值得注意的是,PEP8风格指南建议不要将小写字母“L”用作变量(例如在您的循环中)。"在某些字体中,这些字符与数字1和0无法区分。当想使用'l'时,请改用'L'" - G. Anderson
在被@G.Anderson提到的建议刺痛后(我将np.sum(y == l)读成np.sum(y == 1)),我编辑了问题以使用索引i。添加此评论以使上面的评论不显得不合适。 - Andrew
我的措辞在第一条评论中很差,直到编辑窗口关闭后我才注意到。我应该说“在遇到@G.Anderson在他们的帖子中强调的问题之后...”。G.Anderson提出了一个非常好的建议,没有刺痛我 :) - Andrew
1个回答

6

由于您的类标签比例为2:1,因此这种加权似乎是正确的。

如果您不想手动计算类权重,可以做另一件事情,即传递class_weight='balanced',并让SVC自动平衡权重。


5
如果我没有误解什么,class_weight='balanced' 的作用与原作者所描述的相反。原作者的方法会增加常见类别记录的权重(y==1 的权重比 y==0 高),而 'balanced' 则相反地减少常见类别记录的权重以平衡整个类别的权重。使用 class_weight='balanced' 拟合原作者提出的模型,结果为 m.class_weight_==[1.5, 0.75],而不是 [1., 2.] - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接