在数据不平衡的管道中进行交叉验证的正确方法。

问题描述 投票:1回答:1

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

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")
machine-learning scikit-learn cross-validation imbalanced-data smote
1个回答
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照顾到了这一点,并从事了分层简历确实;从 文件:

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

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

  • int,用于指定一个项目的折数。(Stratified)KFold.

对于intNone输入,如果估计器是一个分类器,且 y 是二进制或多级。StratifiedKFold 使用的是。在所有其他情况下: KFold 被使用。

所以,按原样使用你的代码。

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

是绝对没有问题的。

© www.soinside.com 2019 - 2024. All rights reserved.