2017-09-21 134 views
-1

對於我的疏忽,我感到抱歉。如果您需要採用平衡二次採樣的方法,請訪問下面的鏈接。有各種答案。來自不平衡數據的分層均衡採樣(機器學習)

Scikit-learn balanced subsampling


我怎樣才能做到從不平衡數據分層抽樣的平衡?

我需要解決40個類的分類問題。這些數據是從13個傳感器實時採集的,其中包括13列(傳感器數量)368816行(簡單來說就像一段時間)。我計劃將數據放入循環神經網絡。

所以,我把它標記爲0到40級。數據屬於0類意味着正常的過程狀態,其他意味着異常狀態和產生問題的地方。

數據由13列368816行組成。每一行意味着每個數據集。每個368816數據集都屬於0到40級。但是,這是不平衡的。數據集屬於0類的數量爲103260個,約佔整個數據集的22%。

數據的數量屬於其他類,1-40,是相似的。

我想從不平衡的數據中取得平衡的樣本數據。例如,如果最小的類有7000個數據,我想採樣7000 * 41(nb類)的數據。

我試圖在scikit-learn包中使用StratifiedShuffleSplit方法。該腳本如下所示。

data=StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=99) 
data.get_n_splits(x_data,dummy_y)   #dummy_y means one-hot encoded y 
for train_index, test_index in data.split(x_data,dummy_y): 
    x_train,x_test=x_data[train_index], x_data[test_index] 
    y_train,y_test=dummy_y[train_index], dummy_y[test_index] 
print("nb of train data:", len(y_train), "nb of test data:", len(y_test)) 

如果我對採樣邏輯是正確的,nb_train和nb_test的總和應小於368816.因爲我的確從不平衡數據採樣的平衡。

但nb_train是258171和nb_test是110645.

我怎樣才能做到分層抽樣平衡不平衡從數據?我試過Stratified Train/Test-split in scikit-learn的方法。但是,我失敗了。我使用的腳本如下。

x_train,x_test,y_train,y_test=train_test_split(x_data,dummy_y,stratify=y,random_state=99,test_size=0.3) 
+0

在其數據結構,你有數據嗎? –

+0

我有13列431116行數據。每一行意味着一個數據集。它是二維矩陣數據。每個數據集都與每個類別標籤相關聯。 –

+0

所以你基本上想要分裂不平衡的數據嗎? –

回答

0

你需要做一個StratifiedShuffleSplit建議在評論中,你不需要使用交叉驗證。

如建議在this答案

But if one class isn't much represented in the data set, which may be the case in your dataset since you plan to oversample the minority class, then stratified sampling may yield a different target class distribution in the train and test sets than what random sampling may yield.

他也給Stratified Cross Validationstratified sampling

希望之間存在一些差異,這將有助於