我正在处理一个不平衡的数据集,并希望使用 scikit 的 gridsearchcv 进行网格搜索以调整模型的参数。为了对数据进行过采样,我想使用 SMOTE,我知道我可以将其作为管道的一个阶段并将其传递给 gridsearchcv。我担心的是,我认为 smote 将同时应用于训练和验证折叠,这不是你应该做的。验证集不应过采样。整个管道将应用于两个数据集拆分,我对吗?如果是的话,我该如何扭转这个局面?非常感谢提前
问问题
16474 次
1 回答
49
是的,它可以完成,但使用imblearn Pipeline。
你看,imblearn 有自己的管道来正确处理采样器。我在这里的一个类似问题中对此进行了描述。
当predict()
在imblearn.Pipeline
对象上调用时,它将跳过采样方法并将数据保持原样传递给下一个转换器。您可以通过查看此处的源代码来确认:
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)
根据需要填写详细信息,管道将处理其余部分。
于 2018-05-09T05:15:11.200 回答