我应该在 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 之前还是之后执行网格搜索(用于调整超参数)?的主要内容,如果未能解决你的问题,请参考以下文章
步骤用于高度不平衡的分类步骤。我应该对数据进行上采样和下采样,还是对不平衡的类进行上采样