svm scikit学习中class weight=none和auto的区别是什么



在scikit中学习svm分类器class_weight=None和class_weight=Auto之间的区别是什么。

从文件来看,它是

将SVC的类i的参数C设置为class_weight[i]*C。如果没有给出,所有类都应该有权重一。"自动"模式使用y值自动调整与类频率成反比的权重。

class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)

但是使用自动模式的优点是什么呢。我无法理解它的执行。

这发生在class_weight.py文件中:

elif class_weight == 'auto':
    # Find the weight of each class as present in y.
    le = LabelEncoder()
    y_ind = le.fit_transform(y)
    if not all(np.in1d(classes, le.classes_)):
        raise ValueError("classes should have valid labels that are in y")
    # inversely proportional to the number of samples in the class
    recip_freq = 1. / bincount(y_ind)
    weight = recip_freq[le.transform(classes)] / np.mean(recip_freq)

这意味着,您拥有的每个类(在classes中)的权重等于1除以该类在数据中出现的次数(y),因此经常出现的类将获得较低的权重。然后将其进一步除以所有反向类别频率的平均值。

优点是您不再需要担心自己设置类权重:这对大多数应用程序来说应该已经很好了。

如果您在上面的源代码中查看,对于Noneweight中填充了1,因此每个类的权重相等。

这是一篇相当古老的文章,但对于所有刚刚遇到这个问题的人来说,请注意class_weight=="auto"在0.17版本中已经被弃用。请改用class_weight=="balanced"。

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

实现方式如下:

n_samples/(n_classes*np.bincount(y))

干杯!

相关内容

  • 没有找到相关文章

最新更新