在大量数据的情况下打乱数据 - 机器学习 训练技巧

我们在机器学习训练模型的时候常常需要将数据打乱,否则,假如一个数据集前半部分target是1,后半部分target是0,这样训练出来的效果很不好,很有可能模型会过拟合后半部分的样本,尤其是数据量很大的时候,尤其是你的模型要训练几天几夜的时候。别问我为什么,血一样的教训……
如果数据量小,那么我们只需要使用random.shuffle函数就可以,具体用法在:https://blog.csdn.net/weixin_42744102/article/details/86624974 这里面详细讲解了。
数据量大的时候,全部数据无法一次性读入内存,这时候我们就需要用到下面的方法

声明:首先,假如你在硬盘上的数据有40G,但此时硬盘的剩余容量不足40G,那么这个方法就用不了了。

我们假定现在不同标签的数据在不同的文件中,并且一行就是一个数据。如果你的全部数据在同一个文件中,那会更加简单,只需简单地改进下面这个方法即可。

  1. 用open函数将所有的文件打开,构造一个字典:{‘target’:这个文件里面的数据的标签,‘file_index’:文件指针对象(open的实例),‘index’:一个int,初始值为0,用于记录输出到第几条数据了},将这个字典存进一个列表,姑且叫他文件指针对象的列表
  2. while True:使用random.choice函数在文件指针对象的列表中随机选出一个字典,调用file_index.readlines方法,将文件的第index行输出到汇总的文件中,同时把target也输出,输出完之后,index要+1。
  3. 重复2,直到index >= len(file_index.readlines()),哪个file先输出完了就把哪个字典整个删掉,直到文件指针对象的列表为空退出循环。
  4. 好了,你现在就成功的随机打乱了40G的数据了。

附样例源代码如下:


__author__ = 'lanyixiao'

if __name__ == '__main__':

    t1 = time()

    sentence_list = []

    tf = open('rand_whole_lang_target.txt', 'a')

    file_list = ['de-1M.txt', 'en-1M.txt', 'vi-1M.txt', 'fr-1M.txt', 'es-1M.txt']

    f_reader = []

    for file in file_list:

        f_reader.append([file[:2], open(DIR_ + file).readlines(), 0])

    with open('rand_whole_lang.txt', 'a') as of:

        while True:

            next_sentence = choice(f_reader)

            if next_sentence[2] >= LIMIT or next_sentence[2] >= len(next_sentence[1]):

                f_reader.pop(f_reader.index(next_sentence))

                if not f_reader:

                    break

                continue


            of.write(next_sentence[1][next_sentence[2]])

            next_sentence[2] += 1

            tf.write(next_sentence[0] + '\n')

            flag = False

            for i in f_reader:

                if i[2] <= LIMIT:

                    flag = True

            if not flag:

                break

        tf.close()

        of.close()

        print(time() - t1)





  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值