簡體   English   中英

下采樣超過2個類別

[英]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.

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