[英]10 fold cross validation python
本文中有一個基於深度學習的 model,作者使用了遷移學習和 LSTM,作者使用了 10 倍交叉驗證(如表 3 所示)並取結果的平均值。 我熟悉 10 折交叉驗證,因為我們需要划分數據並傳遞給 model,但是在這段代碼中( 這里)我不知道如何划分數據並傳遞它。
有兩個訓練/測試/開發數據集(一個用於情感分析,一個用於情感分析,我們都將其用於遷移學習,但我的重點是情感分析)。 原始數據在幾個 txt 格式的文件中,運行 model 后,它提供了兩個新的 txt 文件,一個用於預測標簽,一個用於真實標簽。
主文件中有一行代碼:
model = BiLstm(args, data, ckpt_path='./' + args.data_name + '_output/')
if args.mode=='train':
model.train(data)
sess = model.restore_last_session()
model.predict(data, sess)
if args.mode=='test':
sess = model.restore_last_session()
model.predict(data, sess)
其中“數據”是包含測試/訓練/開發數據集的數據( 代碼)的 class:我認為我需要在此處傳遞划分的數據。 如果我是對的,我該如何進行分區並執行 10 折交叉驗證?
data = Data('./data/'+args.data_name+'data_sample.bin','./data/'+args.data_name+'vocab_sample.bin',
'./data/'+args.data_name+'word_embed_weight_sample.bin',args.batch_size)
class Data(object):
def __init__(self,data_path,vocab_path,pretrained,batch_size):
self.batch_size = batch_size
data, vocab ,pretrained= self.load_vocab_data(data_path,vocab_path,pretrained)
self.train=data['train']
self.valid=data['valid']
self.test=data['test']
self.train2=data['train2']
self.valid2=data['valid2']
self.test2=data['test2']
self.word_size = len(vocab['word2id'])+1
self.max_sent_len = vocab['max_sent_len']
self.max_topic_len = vocab['max_topic_len']
self.word2id = vocab['word2id']
word2id = vocab['word2id']
#self.id2word = dict((v, k) for k, v in word2id.iteritems())
self.id2word = {}
for k, v in six.iteritems(word2id):
self.id2word[v]=k
self.pretrained=pretrained
從外觀上看,train 方法似乎可以得到 session 並繼續從現有的 model def train(self, data, sess=None)
因此,只需對現有代碼和庫進行非常小的更改,您就可以像
首先加載所有數據並構建 model
data = Data('./data/'+args.data_name+'data_sample.bin','./data/'+args.data_name+'vocab_sample.bin',
'./data/'+args.data_name+'word_embed_weight_sample.bin',args.batch_size)
model = BiLstm(args, data, ckpt_path='./' + args.data_name + '_output/')
然后創建交叉驗證數據集,smth like
def get_new_data_object():
return data = Data('./data/'+args.data_name+'data_sample.bin','./data/'+args.data_name+'vocab_sample.bin',
'./data/'+args.data_name+'word_embed_weight_sample.bin',args.batch_size)
cross_validation = []
for i in range(10):
tmp_data = get_new_data_object()
tmp_data.train= #get 90% of tmp_data['train']
tmp_data.valid= #get 90% of tmp_data['valid']
tmp_data.test= #get 90% of tmp_data['test']
tmp_data.train2= #get 90% of tmp_data['train2']
tmp_data.valid2= #get 90% of tmp_data['valid2']
tmp_data.test2= #get 90% of tmp_data['test2']
cross_validation.append(tmp_data)
比運行 model n 次(10 次用於 10 倍交叉驗證)
sess = null
for data in cross_validation:
model.train(data, sess)
sess = model.restore_last_session()
記住要注意一些關鍵的想法
test
、 train
和(在您的情況下) valid
test
、 train
和valid
的每個三元組的精確拆分,可以隨機進行,也可以每次進行不同的部分,只要一致n
次或創建n
模型並選擇最好的以避免過度擬合這段代碼只是一個草稿,你可以隨意實現它,有一些很棒的庫已經實現了這樣的功能,當然可以優化(不是每次都讀取整個數據文件)
另一個考慮是將 model 的創建與數據分開,特別是 model 構造函數的data
arg,從快速看它似乎只使用數據的維度,所以不傳遞整個 ZA8CFDE6331149EB2AC96B8 是一個好習慣
此外,如果 model 將data
object 的其他屬性集成到它的 state (創建時)中,就像數據本身一樣,我的代碼可能無法正常工作和更多的手術方法
希望對您有所幫助,並為您指明正確的方向
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.