2

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

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")
4

1 回答 1

2

不平衡设置中的重要问题是确保每个 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。来自文档

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

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

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

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

因此,按原样使用您的代码:

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

确实很好。

于 2020-06-10T17:35:41.273 回答