簡體   English   中英

具有相對而非絕對比率的隨機欠采樣

[英]Random Undersampling with relative rather than absolute ratios

函數imblearn.under_sampling.RandomUnderSampler僅允許我通過dict輸入所需的欠采樣百分比作為絕對數字,但是絕對數字會干擾(時間序列)交叉驗證,在這種情況下,我沒有少數類樣本的水平每折。 (這會產生恆定的錯誤: Originally, there is 11037 samples and 28546 samples are asked.

有什么方法可以輸入相對值,例如0級為80%,1級為20%,等等?

我認為這是一個最小的工作示例。 那解決了你的問題。 從集合中導入從sklearn.datasets導入計數器從sklearn.model_selection導入make_classification從sklearn.pipeline導入KFold從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的Pipeline Framework實現此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM