具有相对而非绝对比率的随机欠采样

Random Undersampling with relative rather than absolute ratios

函数 imblearn.under_sampling.RandomUnderSampler 只允许我通过 dict 输入所需的欠采样百分比作为绝对数字,但是绝对数字会干扰(时间序列)交叉验证,而我不会每个折叠都有相同水平的少数 class 个样本。 (这会产生常量错误:Originally, there is 11037 samples and 28546 samples are asked.

有没有办法输入相对值,即 class 0 为 80%,class 1 为 20%,等等?

我认为这是一个最小的工作示例。那解决了你的问题。 从集合导入计数器 从 sklearn.datasets 导入 make_classification 来自 sklearn.model_selection 导入 KFold 来自 sklearn.pipeline 导入管道 来自 imblearn.under_sampling 导入 RandomUnderSampler

def classify(datasets, labels, *args):
    kf=KFold(n_splits=3)
    for train_idx, test_idx in kf.split(X):
        print('Original dataset shape {}'.format(Counter(labels[train_idx])))
        train_x, train_y = datasets[train_idx], labels[train_idx]
        test_x, test_y = datasets[test_idx], labels[test_idx]
        ratio_dict = {}
        for k,v in enumerate(args):
            ratio_dict.update({k:int ((v/ 100) * Counter(train_y)[k])})
        print(ratio_dict)
        rus = RandomUnderSampler(random_state=42, ratio=ratio_dict)
        X_res, y_res = rus.fit_sample(X, y)
        print('Resampled dataset shape {}'.format(Counter(y_res)))


X, y = make_classification(n_classes=2, class_sep=2,
    weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
    n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)

rus = classify(X, y, 10, 20)

我很想看看是否有人可以使用 sklearn 的管道框架来实现它。