逻辑回归 - class_weight平衡与字典参数



当使用 sklearn LogisticRegression 函数对不平衡训练数据集进行二元分类时(例如,85% pos 类与 15% 负类(,将class_weight参数设置为"平衡"与将其设置为 {0:0.15, 1:0.85} 之间是否有区别? 根据文档,在我看来,使用"平衡"参数将与提供字典相同。

class_weight

"平衡"模式使用 y 的值自动调整 权重与输入数据中的类频率成反比 如n_samples/(n_classes * np.bincount(y((。

是的,意思是一样的。使用class_weight='balanced参数,您无需传递确切的数字,即可自动平衡它。

您可以在此链接中看到更广泛的解释:

https://scikit-learn.org/dev/glossary.html#term-class-weight

要确认下一个属性的相似性,请执行以下操作:

  • class_weight = "平衡">
  • class_weight = {0:0.5
  • , 1:0.5}
  • class_weight = 无

我生成了这个实验:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
clf_balanced = LogisticRegression(class_weight='balanced', random_state=0).fit(X, y)
clf_custom = LogisticRegression(class_weight={0:0.5,1:0.5}, random_state=0).fit(X, y)
clf_none = LogisticRegression(class_weight=None, random_state=0).fit(X, y)
print('Balanced:',clf_balanced.score(X, y))
print('Custom:',clf_custom.score(X, y))
print('None:',clf_none.score(X, y))

输出是:

Balanced: 0.9733333333333334
Custom:   0.9733333333333334
None:     0.9733333333333334

因此,我们可以凭经验得出结论,它们是相同的。

此线程中接受的答案不正确。当平衡作为参数给出时,sklearn 根据以下条件计算权重: 类权重 = 总数据点/(类数 * 类样本数(

所示示例采用平衡数据集。如果通过平衡,则基于上述公式的每个类的权重 = 1,而手动传递时,每个类的权重 = 0.5

模型的结果不会更改,因为正则化参数 C 会根据 1/C = 权重总和更改值

最新更新