在 Scikit-learn 中使用 Smote 和 Gridsearchcv
Using Smote with Gridsearchcv in Scikit-learn
我正在处理一个不平衡的数据集,并想使用 scikit 的 gridsearchcv 进行网格搜索来调整我的模型参数。为了对数据进行过采样,我想使用 SMOTE,我知道我可以将其作为管道的一个阶段包括在内并将其传递给 gridsearchcv。
我担心的是,我认为 smote 将应用于训练和验证折叠,这不是你应该做的。验证集不应过度采样。
整个管道将应用于两个数据集拆分,我说得对吗?如果是,我该如何解决这个问题?
非常感谢
是的,可以做到,但是 imblearn Pipeline。
你看,imblearn 有自己的管道来正确处理采样器。我在 .
中对此进行了描述
当在 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)
根据需要填写详细信息,其余部分将由管道处理。
我正在处理一个不平衡的数据集,并想使用 scikit 的 gridsearchcv 进行网格搜索来调整我的模型参数。为了对数据进行过采样,我想使用 SMOTE,我知道我可以将其作为管道的一个阶段包括在内并将其传递给 gridsearchcv。 我担心的是,我认为 smote 将应用于训练和验证折叠,这不是你应该做的。验证集不应过度采样。 整个管道将应用于两个数据集拆分,我说得对吗?如果是,我该如何解决这个问题? 非常感谢
是的,可以做到,但是 imblearn Pipeline。
你看,imblearn 有自己的管道来正确处理采样器。我在
当在 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)
根据需要填写详细信息,其余部分将由管道处理。