gpt4 book ai didi

python - 如何在 CV-ing 数据集时实现基于比率的 SMOTE 过采样

转载 作者:行者123 更新时间:2023-12-01 09:13:10 25 4
gpt4 key购买 nike

我正在处理一个关于二元分类问题的非常不平衡的数据集(~5%)。我正在管道 SMOTE 和随机森林分类器,以使我的过采样发生在 GridSearch CV 循环内(如建议的 here )。您可以在下面看到我的实现:

from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from imblearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV, StratifiedKFold

sm = SMOTE()
rf = RandomForestClassifier()

pipeline = Pipeline([('sm', sm), ('rf', rf)])

kf = StratifiedKFold(n_splits = 5)

params = {'rf__max_depth' : list(range(2,5)),
'rf__max_features' : ['auto','sqrt'],
'rf__bootstrap' : [True, False]
}

grid = RandomizedSearchCV(pipeline, param_distributions = params, scoring = 'f1', cv = kf)

grid.fit(X, y)

但是,this paper (参见第 7 页的表 4)建议测试不同的重采样比率,以确定哪一种可以提供更好的性能。现在,使用我的 sm = SMOTE() 我正在生成 50-50% 的数据集,但我想循环遍历潜在比率列表(例如 5-95、10-90、 ETC。)。但是,SMOTE 中的ratio 参数不接受所需的百分比,而是接受样本数量的特定整数,由于我的 kfold CV,我认为我无法做到这一点(每次折叠的样本大小可能略有不同)。如何实现?

最佳答案

虽然文档中没有提到,但我认为你可以使用float来指定ratio。但您应该知道它已被弃用并将在未来版本中删除(因为我认为这仅适用于二进制情况而不是多类)。

params = {'sm__ratio' : [0.05, 0.10, 0.15],
'rf__max_depth' : list(range(2,5)),
'rf__max_features' : ['auto','sqrt'],
'rf__bootstrap' : [True, False]
}

grid = RandomizedSearchCV(pipeline, param_distributions = params, scoring = 'f1', cv = kf)

另请注意,您在这里提到的比率将是对少数类进行上采样后的类的比率。

假设您的原始类如下:

  1:  75
0: 25

并且您将比率指定为 0.5。这里大多数类不会被触及,但是会生成 12 个 0 类的合成样本,所以最终的数字是:

  1:  75
0: 37 (25 + 12)

最终比例为 37/75 = 0.5(正如您提到的)。

关于python - 如何在 CV-ing 数据集时实现基于比率的 SMOTE 过采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com