一、一種比較通俗理解的分割方法
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')