我应该在 SMOTE 之前还是之后执行网格搜索(用于调整超参数)?

Posted

技术标签:

【中文标题】我应该在 SMOTE 之前还是之后执行网格搜索(用于调整超参数)?【英文标题】:Should I perform GridSearch (for tunning hyper parameters) before or after SMOTE? 【发布时间】:2020-02-25 01:44:23 【问题描述】:

我正在使用不平衡数据通过 scikit-learn 执行分类并提高模型的准确性,我使用 SMOTE 技术创建了更多合成数据。 我想知道使用 GridSearch 实现超参数优化的最佳时机。 我应该只使用原始数据还是原始+合成数据?

【问题讨论】:

嗨,欢迎来到 SO。为了让其他人理解并能够帮助您,请考虑编辑您的问题。您可以从阅读这篇文章开始:How do I ask a good question 并尝试重新提出问题。它将帮助其他人重现问题并可能找到答案。 当然,使用原始+合成数据,因为那是你这个模型的所有训练数据。 【参考方案1】:

您是在谈论如何将 SMOTE 之类的过采样方法与 sklearn 的 GridSearchCV 一起使用?我做这个假设是因为你在帖子上有一个 scikit-learn 标签。

如果是这样,您可以使用 Pipeline 对象将过采样的 SMOTE 数据传递到 GridSearchCV。如果您希望通过 GridSearchCV 使用交叉验证方案来拟合模型,sklearn 将自动处理正确的拟合/转换每个折叠。在此处查看此答案,其中询问如何不将 SMOTE 应用于验证折叠:

Using Smote with Gridsearchcv in Scikit-learn

imblearn 包有一个类似 sklearn 的 Pipeline 专门用来处理这个问题,正如上面的链接所指出的:https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.pipeline.Pipeline.html

如果没有看到您的代码示例以及您正在尝试做什么,很难知道,但这可能会有所帮助:

from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler

pipe = Pipeline(
    [('scaler', StandardScaler(copy=True),
    ('resample', SMOTE()),
    ('model', RandomForestClassifier()]
)

kf = StratifiedKFold(n_splits=5, shuffle=True)


p_grid = dict(model__n_estimators=[50,100,200])
grid_search = GridSearchCV(
    estimator=pipe, param_grid=p_grid, cv=kf, refit=True
)
grid_search.fit(X_train, y_train)

# Adding below in as could be helpful to know how to get fitted scaler if used
# best = grid_search.best_estimator_
# X_val_scaled = best['scaler'].transform(X_val)
# grid_search.predict(X_val_scaled)

【讨论】:

以上是关于我应该在 SMOTE 之前还是之后执行网格搜索(用于调整超参数)?的主要内容,如果未能解决你的问题,请参考以下文章

步骤用于高度不平衡的分类步骤。我应该对数据进行上采样和下采样,还是对不平衡的类进行上采样

特征选择应该在训练测试拆分之前还是之后完成?

我应该如何拆分我的数据以进行交叉验证和网格搜索?

我是不是需要同时执行网格搜索(使用交叉验证)和交叉验证方法?

如何在词嵌入层之前应用 SMOTE 技术(过采样)

如何在 python 的 sklearn 中使用交叉验证执行 SMOTE