csv數據集按比例分割訓練集、驗證集和測試集,即分層抽樣的方法


一、一種比較通俗理解的分割方法

1.先讀取總的csv文件數據:

import pandas as pd
data = pd.read_csv('D:\BaiduNetdiskDownload\weibo_senti_100k\weibo_senti_100k\weibo_senti_100k.csv')
data.head(10)#輸出前十行

data.label.value_counts()#查看標簽類別及數目

2.按照標簽將總的dataframe分割為兩份,一份為標簽為1,一份為標簽為0

groups = data.groupby(data.label)
data_true = groups.get_group(1)
data_false = groups.get_group(0)
data_true.head(10),data_false.head(10)

3.

data_true = data_true.sample(frac=1.0)  # 全部打亂
data_false = data_false.sample(frac=1.0)  # 全部打亂
#給測試集兩種標簽各600個,按照大概8:1:1的比例取
test_true = data_true.iloc[:600, :]
test_false = data_false.iloc[:600, :]
test_data = pd.concat([test_true, test_false], axis = 0, ignore_index=True).sample(frac=1)
#驗證集
valid_true = data_true.iloc[600:1200, :]
valid_false = data_false.iloc[600:1200, :]
valid_data = pd.concat([valid_true, valid_false], axis = 0, ignore_index=True).sample(frac=1)
#訓練集
train_true = data_true.iloc[1200:, :]
train_false = data_false.iloc[1200:, :]
train_data = pd.concat([train_true, train_false], axis = 0, ignore_index=True).sample(frac=1)

4.生成csv文件

test_data.to_csv('test.csv')
valid_data.to_csv('val.csv')
train_data.to_csv('train.csv')

二、不通俗方法

可以看出上面的方法不斷地生成新的dataframe太麻煩了些,雖然直觀醒目,但在代碼編寫上很是繁冗,於是可以使用apply方法避免這種問題

1.為便於講解,先生成一個簡單的dataframe:

df = pd.DataFrame({'label':[0,0,0,0,1,1,1,1], 'review':['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh']})

2.首先定義一個簡單的分層取樣函數,frac為取樣概率,group為一個單獨的dataframe

def simpleSampling(group, frac):
    return group.sample(frac=frac)

3.接下來使用apply函數對分組后的每一個組(即一個dataframe)進行函數操作

train_df = df.groupby(df.label).apply(simpleSampling, 0.5)

可以看到多了一列label標簽,可以使用sample(frac=1, ignore_index = True)消除它

4.在生成了train數據集后,我們需要把train從原df中刪除掉,但是dataframe沒有直接刪除的方法,我們迂回的使用刪除重復行的方法:

df = df.append(train_df.sample(frac=1, ignore_index=True)).drop_duplicates(keep = False)

可以看到df只剩上圖的幾行了,接下來生成測試集和驗證集

5.我們如果要生成原數據集0.25比例的驗證集,那么需要注意的是,在將train刪除后,在新的數據集中我們的比例就變成了p(val) = p(test) = 0.25 / 0.5 = 0.5

val_df = df.groupby(df.label).apply(simpleSampling, 0.5).sample(frac=1, ignore_index = True)
test_df = df.append(val_df).drop_duplicates(keep=False)
train_df.to_csv('train_csv')
val_df.to_csv('val_csv')
test_df.to_csv('test_csv')

至此我們的數據集就已經成功分割了,以上兩種方法原理相同,只是第二種方法巧妙地應用了apply函數,避免了一個接一個的新的dataframe的生成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM