在Scikit学习中将Smote与Gridsearchcv一起使用

Ehs*_*n M 9 python machine-learning scikit-learn grid-search oversampling

我正在处理不平衡的数据集,并希望使用scikit的gridsearchcv进行网格搜索以调整模型的参数。为了对数据进行过采样,我想使用SMOTE,我知道我可以将其作为管道的一个阶段,并将其传递给gridsearchcv。我担心的是,我认为训练和验证折纸都将使用击打,这不是您应该做的。验证集不应过采样。我是否正确,整个管道将应用于两个数据集拆分?如果是的话,我该如何扭转呢?提前谢谢

Viv*_*mar 16

是的,可以做到这一点,但是可以使用Pipeline

您会看到,imblearn有自己的管道来正确处理采样器。我在类似的问题中对此进行描述。

在对象predict()imblearn.Pipeline调用时,它将跳过采样方法,并保留要传递给下一个转换器的数据。您可以通过在此处查看源代码来确认这一点

        if hasattr(transform, "fit_sample"):
            pass
        else:
            Xt = transform.transform(Xt)
Run Code Online (Sandbox Code Playgroud)

因此,要使其正常工作,您需要以下内容:

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

grid = GridSearchCV(model, params, ...)
grid.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

根据需要填写详细信息,管道将负责其余的工作。

  • @EhsanM不。如上所述,sklearn.pipeline.Pipeline不会处理SMOTE的`sample()`方法,但是imblearn.pipeline.Pipeline会处理。 (5认同)