【问题标题】:Correct way to do cross validation in a pipeline with imbalanced data在数据不平衡的管道中进行交叉验证的正确方法
【发布时间】:2020-09-30 03:14:52
【问题描述】:

对于给定的不平衡数据,我创建了不同的标准化管道和一个热编码

numeric_transformer = Pipeline(steps = [('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=['ohe', OneHotCategoricalEncoder()])

然后一个柱式变压器将上述管道保持在一个整体

from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer,categorical_features)]

最终流水线如下

smt = SMOTE(random_state=42)
rf = pl1([('preprocessor', preprocessor),('smote',smt),
                      ('classifier', RandomForestClassifier())])

我正在对不平衡数据进行管道拟合,因此我将 SMOTE 技术与预处理和分类器一起包括在内。由于不平衡,我想检查召回分数。

如下代码所示的正确方法是什么?我的召回率约为 0.98,这可能导致模型过度拟合。如果我犯了任何错误,有什么建议吗?

scores = cross_val_score(rf, X, y, cv=5,scoring="recall")

【问题讨论】:

  • 您正在为您的 CV 程序正确应用管道。 “我的召回率在 0.98 左右,这可能导致模型过度拟合”这句话完全无法理解。
  • 谢谢,我怀疑选择cross_validation的过程是否在管道中出错。这也是我在管道上的第一个实现。

标签: machine-learning scikit-learn cross-validation imbalanced-data smote


【解决方案1】:

不平衡设置中的重要问题是确保在每个 CV 折叠中存在足够多的少数类成员;因此,使用StratifiedKFold 来强制执行似乎是可取的,即:

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5)  
scores = cross_val_score(rf, X, y, cv=skf, scoring="recall")

尽管如此,事实证明,即使像您一样使用cross_val_score(即简单地使用cv=5),scikit-learn 也会处理它并确实使用分层的简历;来自docs

cv : int,交叉验证生成器或可迭代的,默认=None

  • 无,使用默认的5折交叉验证,

  • int,指定(Stratified)KFold中的折叠次数。

对于 int/None 输入,如果估计器是分类器并且 y 是 二进制或多类,StratifiedKFold 被使用。在所有其他情况下, 使用KFold

所以,按原样使用您的代码:

scores = cross_val_score(rf, X, y, cv=5, scoring="recall")

确实很好。

【讨论】:

  • 不是cross_val_scoreStratifiedKFold 的默认交叉验证策略吗(假设问题是单输出)?
  • @BenReiniger 哎呀,你是对的!我错过了:(你想自己发布这个作为答案吗(我会要求 OP 接受你的)?否则我会更新我的 - 你的电话......
猜你喜欢
  • 2021-10-08
  • 2018-07-26
  • 2016-11-15
  • 1970-01-01
  • 2014-01-09
  • 2019-08-21
  • 2018-11-15
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多