[英]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 進行上采樣? 關於如何正確執行此操作的任何想法?
非常感謝。
默認情況下SMOTE的sampling_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.