【问题标题】:Using Smote with Gridsearchcv in Scikit-learn在 Scikit-learn 中使用 Smote 和 Gridsearchcv
【发布时间】:2018-10-19 02:49:56
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,可以做到,但使用imblearn Pipeline

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

    当在imblearn.Pipeline 对象上调用predict() 时,它将跳过采样方法并将数据保持原样传递给下一个转换器。 您可以通过查看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)
    

    根据需要填写详细信息,其余的将由管道处理。

    【讨论】:

    • 非常感谢! sklearn.pipeline.Pipeline 是否也适用于此目的?
    • @EhsanM 不。正如我上面所说,sklearn.pipeline.Pipeline 不会处理 SMOTE 的sample() 方法,但 imblearn.pipeline.Pipeline 会。
    • @VivekKumar - 将imblearn.pipeline.PipelineGridSearchCV 一起使用会导致错误。 GridSearchCV 无法识别估计器的 (LogisticRegression) 参数并尝试将参数设置为 Pipeline 本身。有什么建议吗?
    • @KrishnangKDalal 请在您的代码中发布一个新问题并通知我
    • 嗨@VivekKumar,我在我的实现中提出了一个新问题。这是链接:stackoverflow.com/questions/58815016/…
    猜你喜欢
    • 2016-12-07
    • 2018-05-14
    • 2018-01-27
    • 2018-09-04
    • 2017-09-23
    • 2014-02-21
    • 2013-10-01
    相关资源
    最近更新 更多