【问题标题】:Understanding data balancing in sklearn cross-validation了解 sklearn 交叉验证中的数据平衡
【发布时间】:2021-12-29 03:01:05
【问题描述】:

我目前正在尝试对我非常不平衡的数据运行 sklearn 的 RepeatedStratifiedKFold 交叉验证。我正在使用带有class_weight='balanced' 参数的LogisticRegression 模型,据我所知,它应该平衡我的数据。有了这个,我运行cross_val_score() 方法。我在这里粘贴了一些我的代码的 sn-p:

model = LogisticRegression(penalty='l1', solver='liblinear',
                max_iter=1000, class_weight='balanced')
cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=2, random_state=1)
accuracy = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
precision = cross_val_score(model, X, y, scoring='precision', cv=cv, n_jobs=-1)
recall = cross_val_score(model, X, y, scoring='recall', cv=cv, n_jobs=-1)

我得到的结果显示平均准确率非常高 (94%),平均准确率 (5%) 和召回率 (1%) 非常低。这让我感到困惑,因为我能看到这种情况发生的唯一方法是,如果我在一个类中的示例比另一个类多,这让我感到困惑,因为我认为我的逻辑回归模型平衡了数据。

我想知道我的交叉验证是否仅将这种平衡应用于它所做的训练拆分而不是测试拆分。这将解释我如何能有如此高的准确率和低准确率/召回率。

或者,如果有人知道使用RepeatedStratifiedKFold 为我的交叉验证打印出混淆矩阵甚至预测的方法,那将非常有帮助!这些方法似乎不适用于我选择的 cross val,但我希望能够通过查看数据和/或分类结果进行调试。

【问题讨论】:

  • 我怕你糊涂了; class_weight='balanced' 不平衡数据本身,它只是赋予类不同的权重(与它们在数据中的实际比例成反比)。而且这个权重方案只适用于训练集——在测试集中它是没有意义的。
  • 哦,我明白了。那么权重到底是做什么的呢?它不会从训练集中选择样本以使两个类的比例更相等吗?感谢您澄清测试集,这对很多有帮助!
  • 在训练误差的计算中,加权对(较少)少数类实例的权重更大。但这不是关于编程的讨论;我建议您查看stackoverflow.com/tags/machine-learning/info 并在一些相关的 SE 网站上发布问题。

标签: python scikit-learn


【解决方案1】:

为了评估模型性能,目标可能高度偏斜。即使使用class_weights='balanced',分类器也无法很好地预测少数类。这就是为什么该模型做出了许多低预测(predict_proba 更接近于 0),因此通常预测多数类并具有较高的准确度分数。

您可以尝试的方法是代替class_weights='balanced',您可以为少数类分配更多权重。例如,class_weights={0:1, 1:3} 将使 0 类的权重为 1,1 类的权重为 3。

【讨论】:

  • 这正是class_weight='balanced' 所做的,并且使用类比例的确切比例而不是临时数字; OP 说他们的数据“非常不平衡”,那么你为什么认为少数类 3 倍的权重会比平衡的类“多得多”?
猜你喜欢
  • 2019-08-21
  • 2018-07-26
  • 2021-10-08
  • 2012-12-31
  • 2017-03-15
  • 2018-11-15
  • 2018-08-16
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多