如何在 sklearn 中对不平衡数据集执行交叉验证

Posted

技术标签:

【中文标题】如何在 sklearn 中对不平衡数据集执行交叉验证【英文标题】:How to perform cross validation for imbalanced datasets in sklearn 【发布时间】:2019-08-21 11:14:25 【问题描述】:

我有一个高度不平衡的数据集,我想执行二进制分类。

在阅读一些帖子时,我发现sklearn 为不平衡的数据集提供了class_weight="balanced"。所以,我的分类器代码如下。

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")

然后我使用上面的分类器进行了 10 折交叉验证,如下所示。

k_fold = KFold(n_splits=10, shuffle=True, random_state=42)
new_scores = cross_val_score(clf, X, y, cv=k_fold, n_jobs=1)
print(new_scores.mean())

但是,我不确定class_weight="balanced" 是否通过 10 倍交叉验证得到反映。我做错了吗?如果是这样,在 sklearn 中是否有更好的方法?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

有多种方法可以平衡您的数据集(例如,替换或随机子采样),最好的方法取决于数据的性质以及您想要实现的目标。您可以查看this package,它提供了广泛的选择。 警告:您应该明智地为您的分类器选择性能度量。您可能想了解何时使用 which at learnerworld.tumblr.com/search/performance+measures 特别对于倾斜数据,首选 F1 分数等分数。 【参考方案1】:

您可能希望使用分层交叉验证,而不是一般的交叉验证。更具体地说,您可以使用StratifiedKFold。 而不是代码中的KFold

这可确保所有潜在的训练和测试拆分都能捕捉到类不平衡。

【讨论】:

您好,谢谢您的回答,如果我使用StratifiedKFold,那么我是否也应该使用class_weight="balanced"?期待您的来信:) 是的,因为拆分仍然不平衡,但类标签的分布几乎相同。

以上是关于如何在 sklearn 中对不平衡数据集执行交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

不平衡面板数据:如何使用时间序列拆分交叉验证?

如何在交叉验证和 GridSearchCV 中实现 SMOTE

当给定特定类的 0 个样本时,如何对不平衡的数据集进行分类?

如何对不平衡的多类数据集进行欠采样? (Python)

mllib 如何在内部对不平衡数据集的类进行加权?

python-sklearn数据拆分与决策树的实现