仅将sklearn的RandomizedSearchCV与SMOTE过采样一起使用在训练折叠上

问题描述 投票:2回答:1

我有一个高度不平衡的数据集(99.5:0.5)。我想使用sklearnRandomizedSearchCV在随机森林模型上执行超参数调整。我希望使用SMOTE对每个训练折叠进行过采样,然后在最终折叠中对每个测试进行评估,以保持原始分布而没有任何过度采样。由于这些测试折叠高度不平衡,因此我希望使用F1得分对测试进行评估。

我尝试了以下操作:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV, StratifiedKFold
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import make_pipeline
import pandas as pd

dataset = pd.read_csv("data/dataset.csv")

data_x = dataset.drop(["label"], axis=1)
data_y = dataset["label"]

smote = SMOTE()
model = RandomForestClassifier()

pipeline = make_pipeline(smote, model)

grid = {
    "randomforestclassifier__n_estimators": [10, 25, 50, 100, 250, 500, 750, 1000, 1250, 1500, 1750, 2000],
    "randomforestclassifier__criterion": ["gini", "entropy"],
    "randomforestclassifier__max_depth": [10, 20, 30, 40, 50, 75, 100, 150, 200, None],
    "randomforestclassifier__min_samples_split": [1, 2, 3, 4, 5, 8, 10, 15, 20],
    "randomforestclassifier__min_samples_leaf": [1, 2, 3, 4, 5, 8, 10, 15, 20],
    "randomforestclassifier__max_features": ["auto", None, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
    "randomforestclassifier__bootstrap": [True, False],
    "randomforestclassifier__max_samples": [None, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
}

kf = StratifiedKFold(n_splits=5)

search = RandomizedSearchCV(pipeline, grid, scoring='f1', n_iter=10, n_jobs=-1, cv=kf)

search = search.fit(data_x, data_y)

print(search.best_params_)

但是,我不确定是否在每次迭代中将SMOTE应用于测试集。

我如何确保仅将SMOTE应用于训练折叠,而不应用于测试折叠?

编辑:

[This article似乎回答了我的问题(特别是在3B部分中),提供了我正在尝试执行的操作的示例代码,并演示了它如何按照我指定的方式工作]]

我有一个高度不平衡的数据集(99.5:0.5)。我想使用sklearn的RandomizedSearchCV在随机森林模型上执行超参数调整。我希望每个训练折叠都是...

python machine-learning scikit-learn pipeline cross-validation
1个回答
0
投票

如我编辑中链接的文章所示,当将imblearn Pipeline传递到sklearnRandomizedSearchCV时,转换似乎仅适用于训练折痕上的数据,而不适用于验证褶皱。 (不过,我不明白这是如何工作的,因为如果将缩放器传递到管道中,则您希望将其应用于所有数据,而不仅仅是训练折叠。)

© www.soinside.com 2019 - 2024. All rights reserved.