在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
),因此经常出现的类将获得较低的权重。然后将其进一步除以所有反向类别频率的平均值。
优点是您不再需要担心自己设置类权重:这对大多数应用程序来说应该已经很好了。
如果您在上面的源代码中查看,对于None
,weight
中填充了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))
干杯!