【发布时间】: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