Python 10倍交叉验证

Python 10倍交叉验证,python,machine-learning,deep-learning,cross-validation,k-fold,Python,Machine Learning,Deep Learning,Cross Validation,K Fold,有一个基于深度学习的模型使用迁移学习和LSTM,作者使用了10倍交叉验证(如表3所述),并取结果的平均值。 我熟悉10倍交叉验证,因为我们需要分割数据并传递给模型,但是在这段代码()中,我不知道如何分割数据并传递它 有两个训练/测试/开发数据集(一个用于情绪分析,一个用于情绪分析,我们都用于迁移学习,但我的重点是情绪分析)。原始数据以txt格式保存在两个文件中,运行模型后,它将提供两个新的txt文件,一个用于预测标签,一个用于真实标签 中有一行代码: 其中“数据”是一类数据(),包括测试/训练/

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

有两个训练/测试/开发数据集(一个用于情绪分析,一个用于情绪分析,我们都用于迁移学习,但我的重点是情绪分析)。原始数据以txt格式保存在两个文件中,运行模型后,它将提供两个新的txt文件,一个用于预测标签,一个用于真实标签

中有一行代码:

其中“数据”是一类数据(),包括测试/训练/开发数据集: 我想我需要在这里传递分割的数据。如果我是对的,我如何进行分区并执行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方法似乎可以获得会话并继续从现有模型中进行训练
def train(self,data,sess=None)

因此,只需对现有代码和库进行非常小的更改,就可以像smth一样进行操作

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)
首先加载所有数据并构建模型

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

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倍交叉验证)

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

  • 我不知道您的数据是如何精确构造的,但这会影响将其拆分为
    测试
    训练
    和(在您的情况下)
    有效
  • 数据的分割必须是
    测试
    列车
    有效
    的每三个部分的精确分割,可以随机进行,也可以每次进行不同的分割,只要保持一致
  • 您可以使用交叉验证对模型进行
    n
    次培训,或创建
    n
    模型,并选择最佳模型以避免过度拟合
这段代码只是一个草稿,您可以按照自己的意愿实现它,有一些很棒的库已经实现了这样的功能,当然可以进行优化(而不是每次都读取整个数据文件)

另外一个需要考虑的问题是将模型创建与数据分离,特别是模型构造函数的
数据
arg,从快速查看来看,它似乎只使用数据的维度,因此不传递整个对象是一个很好的做法

此外,如果模型在其状态(创建时)集成了
数据
对象的其他属性,如数据本身,则我的代码可能无法工作,并且需要更为复杂的方法


希望它有帮助,并为您指出正确的方向

基本上是K倍,这意味着您需要运行n次(通常为10次)列车,每次测试数据与整个人群的p%(通常为10%)不同,因为数据与模型集成(args到
构造函数
),你唯一的选择是重写/复制它的
train()
,如果你能在这里发布它,并分享你迄今为止所做的事情,可能会有很多help@shahaf火车就在这页中间。如果我们只需要更改测试数据,我是否可以更改类数据中的
self.test=data['test']
,而不是更改列车()?感谢作者所依赖的,因为他们没有在这个数据集上做10次(我猜是因为数据结构的复杂性),而是用不同的种子执行了10次模型。这是一个很大的帮助。非常感谢。
sess = null
for data in cross_validation:
  model.train(data, sess)
  sess = model.restore_last_session()