簡體   English   中英

Imblearn SMOTE:如何為多類不平衡數據集設置 sample_strategy 參數?

[英]Imblearn SMOTE: How to set the sample_strategy parameter for a multiclass imbalance dataset?

我正在嘗試處理具有以下形狀的網絡攻擊的數據集:

df.shape
(1074992, 42)

攻擊和正常行為的標簽有以下計數:

df['Label'].value_counts()
normal            812814
neptune           242149
satan               5019
ipsweep             3723
portsweep           3564
smurf               3007
nmap                1554
back                 968
teardrop             918
warezclient          893
pod                  206
guesspasswd           53
bufferoverflow        30
warezmaster           20
land                  19
imap                  12
rootkit               10
loadmodule             9
ftpwrite               8
multihop               7
phf                    4
perl                   3
spy                    2
Name: Label, dtype: int64

接下來,我將數據集拆分為特征和標簽。

labels = df['Label']
features = df.loc[:, df.columns != 'Label'].astype('float64')

然后嘗試平衡我的數據集。

print("Before UpSampling, counts of label Normal: {}".format(sum(labels == "normal")))
print("Before UpSampling, counts of label Attack: {} \n".format(sum(labels != "normal")))
Before UpSampling, counts of label Normal: 812814
Before UpSampling, counts of label Attack: 262178 

所以你可以注意到攻擊的數量與正常行為的數量不成比例。

我嘗試使用 SMOTE 將少數(攻擊)class 帶到與多數 class(正常)相同的值。

sm = SMOTE(k_neighbors = 1,random_state= 42)   #Synthetic Minority Over Sampling Technique
features_res, labels_res = sm.fit_resample(features, labels)
features_res.shape ,labels_res.shape
((18694722, 41), (18694722,))

我不明白這就是為什么我在應用 SMOTE 后得到 18694722 值的原因。

print("After UpSampling, counts of label Normal: {}".format(sum(labels_res == "normal")))
print("After UpSampling, counts of label Attack: {} \n".format(sum(labels_res != "normal")))
After UpSampling, counts of label Normal: 812814
After UpSampling, counts of label Attack: 17881908 

對於我的情況,最好對 Normal class 進行下采樣還是對 Attack class 進行上采樣? 關於如何正確執行此操作的任何想法?

非常感謝。

默認情況下SMOTEsampling_strategy not majority

'不是多數':重新采樣除多數 class 之外的所有類

所以,如果大多數 class 的樣本是 812814,你會有

(812814 * 23) = 18694722

樣品。

嘗試為少數類傳遞具有所需樣本數量的字典。 文檔

當 dict 時,鍵對應於目標類。 這些值對應於每個目標 class 的所需樣本數。

例子

改編自文檔,在本例中,我們對少數類之一進行上采樣,使其具有與多數類 class 相同數量的樣本。

from sklearn.datasets import make_classification
from collections import Counter
from imblearn.over_sampling import SMOTE 
X, y = make_classification(n_classes=5, 
    class_sep=2, 
    weights=[0.15, 0.15, 0.1, 0.1, 0.5], 
    n_informative=4, 
    n_redundant=1, 
    flip_y=0,
    n_features=20, 
    n_clusters_per_class=1,
    n_samples=1000,
    random_state=10)

sample_strategy = {4: 500, 0: 500, 1: 150, 2: 100, 3: 100}

sm = SMOTE(sampling_strategy=sample_strategy, random_state=0)
X_res, y_res = sm.fit_resample(X, y)
from collections import Counter
print('Resampled dataset shape %s' % Counter(y_res))
>>>
Resampled dataset shape Counter({4: 500, 0: 500, 1: 150, 3: 100, 2: 100})

暫無
暫無

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

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