使用imblearn流水线在交叉验证之前或之后会发生过采样吗?

时间:2019-05-06 20:04:57

标签: python-3.x scikit-learn xgboost imblearn

在对训练数据进行交叉验证以验证我的超参数之前,我已经将数据分为训练/测试。我有一个不平衡的数据集,并且想在每次迭代中执行SMOTE过采样,因此我已经使用imblearn建立了管道。

我的理解是,应在将数据划分为k折后进行超采样,以防止信息泄漏。在以下设置中使用Pipeline时,是否保留了这种操作顺序(数据分为k倍,k-1倍过采样,预测剩余倍数)?

from imblearn.pipeline import Pipeline
model = Pipeline([
        ('sampling', SMOTE()),
        ('classification', xgb.XGBClassifier())
    ])


param_dist = {'classification__n_estimators': stats.randint(50, 500),
              'classification__learning_rate': stats.uniform(0.01, 0.3),
              'classification__subsample': stats.uniform(0.3, 0.6),
              'classification__max_depth': [3, 4, 5, 6, 7, 8, 9],
              'classification__colsample_bytree': stats.uniform(0.5, 0.5),
              'classification__min_child_weight': [1, 2, 3, 4],
              'sampling__ratio': np.linspace(0.25, 0.5, 10)
             }

random_search = RandomizedSearchCV(model,
                                   param_dist,
                                   cv=StratifiedKFold(n_splits=5),
                                   n_iter=10,
                                   scoring=scorer_cv_cost_savings)
random_search.fit(X_train.values, y_train)

1 个答案:

答案 0 :(得分:1)

您的理解是正确的。当您将pipeline用作model时,将使用(k-1)应用训练数据.fit(),并在第k折页进行测试。然后对训练数据进行采样。

imblearn.pipeline .fit()的{​​{3}}说:

  

适合模型

     

一个接一个地安装所有转换/采样器,并对数据进行转换/采样,   然后使用最终估算器拟合转换/采样的数据。