【问题标题】:10 fold cross validation python10折交叉验证python
【发布时间】:2020-02-10 09:46:49
【问题描述】:

this article 中有一个使用迁移学习和 LSTM 的基于深度学习的模型,作者使用了 10 倍交叉验证(如表 3 中所述)并取结果的平均值。 我熟悉 10 折交叉验证,因为我们需要划分数据并传递给模型,但是在这段代码中(here)我不知道如何划分数据并传递它。

有两个训练/测试/开发数据集(一个用于情感分析,一个用于情感分析,我们都将其用于迁移学习,但我的重点是情感分析)。原始数据是几个txt格式的文件,运行模型后,它给出了两个新的txt文件,一个用于预测标签,一个用于真实标签。

main file中有一行代码:

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)

其中“数据”是一类数据(code),包括测试/训练/开发数据集: 我想我需要在这里传递分割的数据。如果我是对的,我该如何进行分区并执行 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

【问题讨论】:

  • 基本上是K-fold,这意味着每次测试数据是整个人口的不同p%(通常是10%)时,您需要运行n次(通常是10)次,因为数据是与模型集成(constructor 的参数),您唯一的选择是覆盖/复制它的 train(),如果您可以在此处发布并分享您到目前为止所做的事情,可能会有很大帮助
  • @shahaf 火车在这里link 在页面中间。如果我们只需要更改测试数据,我可以更改类Data中的self.test=data['test'],而不是更改train()吗?谢谢

标签: python machine-learning deep-learning cross-validation k-fold


【解决方案1】:

从外观上看,train 方法似乎可以获取会话并从现有模型继续训练 def train(self, data, sess=None)

因此,只需对现有代码和库进行极少的更改,您就可以做类似的事情

首先加载所有数据并构建模型

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)

比运行模型 n 次(10 次用于 10 倍交叉验证)

sess = null
for data in cross_validation:
  model.train(data, sess)
  sess = model.restore_last_session()

记住要注意一些关键的想法

  • 我不知道您的数据是如何精确构造的,但这会影响将其拆分为 testtrain 和(在您的情况下)valid 的方式
  • 数据的拆分必须是testtrainvalid的每个三元组的精确拆分,可以随机进行,也可以每次分不同部分,只要一致强>
  • 您可以使用交叉验证训练模型 n 次,或创建 n 模型并选择最佳模型以避免过度拟合

此代码只是一个草稿,您可以按照自己的意愿实现它,有一些很棒的库已经实现了这样的功能,当然可以优化(不是每次都读取整个数据文件)

另外一个考虑是将模型创建与数据分开,尤其是模型构造函数的data arg,快速看起来它似乎只使用数据的维度,所以最好不要通过整个对象

此外,如果模型在其状态(创建时)集成了 data 对象的其他属性,例如数据本身,我的代码可能无法正常工作,并且是一种更外科手术 p>

希望对您有所帮助,并为您指明正确的方向

【讨论】:

  • 作者依赖,因为他们没有在这个数据集上做 10 倍(我猜是因为数据结构的复杂性),而是他们用不同的种子执行了 10 次模型。这是一个很大的帮助。谢谢
猜你喜欢
  • 2011-11-29
  • 2012-05-11
  • 2021-06-03
  • 2016-05-30
  • 2013-08-16
  • 2012-01-07
  • 2023-04-03
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多