[英]Downsampling for more than 2 classes
我正在創建一個簡單的代碼,當目標變量具有兩個以上的類時,該代碼允許對數據框進行下采樣。
假設df
是我們的任意數據集,而'TARGET_VAR'
是具有兩個以上類的分類變量。
import pandas as pd
label='TARGET_VAR' #define the target variable
num_class=df[label].value_counts() #creates list with the count of each class value
temp=pd.DataFrame() #create empty dataframe to be filled up
for cl in num_class.index: #loop through classes
#iteratively downsample every class according to the smallest
#class 'min(num_class)' and append it to the dataframe.
temp=temp.append(df[df[label]==cl].sample(min(num_class)))
df=temp #redefine initial dataframe as the subsample one
del temp, num_class #delete temporary dataframe
現在我想知道,是否有辦法以更精致的方式做到這一點? 例如,無需創建臨時數據集? 我試圖找出一種方法來“向量化”多個類的操作,但沒有成功。 下面是我的想法,可以輕松地將其實現為2個類,但是我不知道如何將其擴展為多類情況。
如果您有2個班級,這將非常有效
df= pd.concat([df[df[label]==num_class.idxmin()],\
df[df[label]!=num_class.idxmin()].sample(min(num_class))])
這使您可以為其他類別選擇正確數量的觀察值,但是不一定會相等地代表這些類別。
df1= pd.concat([df[df[label]==num_class.idxmin()],\
df[df[label]!=num_class.idxmin()].sample(min(num_class)*(len(num_class)-1))])
您可以嘗試類似以下操作:
label='TARGET_VAR'
g = df.groupby(label, group_keys=False)
balanced_df = pd.DataFrame(g.apply(lambda x: x.sample(g.size().min()))).reset_index(drop=True)
我相信這會產生您想要的結果,請隨時提出任何其他問題。
根據OP的建議修復了代碼。
此代碼用於少數類的oversampling
實例或多數類的undersampling
實例。 它只能用於訓練集。 注意: activity
是標簽
balanced_df=Pdf_train.groupby('activity',as_index = False,group_keys=False).apply(lambda s: s.sample(100,replace=True))
古斯塔沃(Gustavo)的答案是正確的,但存在一個小問題(由於某種原因,我無法編輯他的答案)。
label='TARGET_VAR'
g = df.groupby(label, group_keys=False)
balanced_df = pd.DataFrame(g.apply(lambda x:
x.sample(g.size().min()).
reset_index(drop=True)))
在這里,將為每個組重置索引,並且最終數據幀將具有重復的行索引。 如果我們將少數類中的元素數定義為n
:
idx, data
0, ...
1, ...
., ...
., ...
., ...
n, ...
0, ...
1, ...
., ...
., ...
., ...
n, ...
以下調整將解決問題
g = df.groupby(label, group_keys=False)
balanced_df = pd.DataFrame(g.apply(lambda x:
x.sample(g.size().min()))).reset_index(drop=True)
如果我們現在將balanced_df
的元素總數定義為N=n*k
,其中k
是不同類的數目。 索引將如下所示:
idx, data
0, ...
1, ...
., ...
., ...
., ...
N, ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.