簡體   English   中英

10折交叉驗證python

[英]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()

記住要注意一些關鍵的想法

  • 我不知道您的數據是如何精確構建的,但這會影響將其拆分為testtrain和(在您的情況下) valid
  • 數據的拆分必須是testtrainvalid的每個三元組的精確拆分,可以隨機進行,也可以每次進行不同的部分,只要一致
  • 您可以通過交叉驗證訓練 model n次或創建n模型並選擇最好的以避免過度擬合

這段代碼只是一個草稿,你可以隨意實現它,有一些很棒的庫已經實現了這樣的功能,當然可以優化(不是每次都讀取整個數據文件)

另一個考慮是將 model 的創建與數據分開,特別是 model 構造函數的data arg,從快速看它似乎只使用數據的維度,所以不傳遞整個 ZA8CFDE6331149EB2AC96B8 是一個好習慣

此外,如果 model 將data object 的其他屬性集成到它的 state (創建時)中,就像數據本身一樣,我的代碼可能無法正常工作和更多的手術方法

希望對您有所幫助,並為您指明正確的方向

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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