在Scikit中使用Smote和Gridsearchcv学习

时间:2018-05-09 04:46:03

标签: python machine-learning scikit-learn grid-search oversampling

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

1 个答案:

答案 0 :(得分:5)

是的,可以使用imblearn Pipeline完成。

你知道,imblearn有自己的Pipeline来正确处理采样器。我在a similar question here中描述了这一点。

predict()对象上调用imblearn.Pipeline时,它将跳过采样方法并将数据保留原样传递给下一个变换器。 您可以通过查看source code here

来确认
        if hasattr(transform, "fit_sample"):
            pass
        else:
            Xt = transform.transform(Xt)

为了使其正常工作,您需要以下内容:

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

grid = GridSearchCV(model, params, ...)
grid.fit(X, y)

根据需要填写详细信息,管道将负责其余部分。