Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何将数据采样到测试和训练数据集中?_Python_Csv_Random Sample - Fatal编程技术网

Python:如何将数据采样到测试和训练数据集中?

Python:如何将数据采样到测试和训练数据集中?,python,csv,random-sample,Python,Csv,Random Sample,我一直在使用CSV数据来实现我的脚本,并希望将数据采样到两个数据集中: 测试数据 列车数据 我想在85%和15%分区中对数据集进行采样,并想输出两个CSV文件Test.CSV和Train.CSV 我希望它在基本Python中运行,不希望使用任何其他外部模块,如Numpy、SciPy、Pandas或Scikitlearn。有谁能帮我按百分比随机抽取数据吗。此外,我将提供的数据集,可能有随机数的观察。到目前为止,我刚刚阅读了熊猫和其他各种模块,以百分比为基础对数据进行采样,但还没有针对我的问题找到任

我一直在使用CSV数据来实现我的脚本,并希望将数据采样到两个数据集中:

  • 测试数据
  • 列车数据
  • 我想在85%和15%分区中对数据集进行采样,并想输出两个CSV文件Test.CSV和Train.CSV

    我希望它在基本Python中运行,不希望使用任何其他外部模块,如Numpy、SciPy、Pandas或Scikitlearn。有谁能帮我按百分比随机抽取数据吗。此外,我将提供的数据集,可能有随机数的观察。到目前为止,我刚刚阅读了熊猫和其他各种模块,以百分比为基础对数据进行采样,但还没有针对我的问题找到任何具体的解决方案


    此外,我想在两个文件中保留CSV的标题。因为标题将使每一行都可访问,并可用于进一步分析。

    使用
    随机。shuffle
    创建数据集的随机排列,并根据需要对其进行切片:

    import random
    random.shuffle(data)
    train = data[:int(len(data)*0.85)]
    test = data[len(train):]
    

    由于您请求了一个特定的解决方案来将一个可能较大的CSV文件划分为两个文件,以用于培训和测试数据,因此我还将展示如何使用类似的方法(如上文所述的一般方法)来完成此工作:

    import random
    
    # Count lines
    with open('data.csv','r') as csvf:
        linecount = sum(1 for lines in csvf if line.strip() != '')
    
    # Create index sets for training and test data
    indices = list(range(linecount))
    random.shuffle(indices)
    ind_test = set(indices[:int(linecount*0.15)])
    del indices
    
    # Partition CSV file
    with open('data.csv','r') as csvf, open('train.csv','w') as trainf, open('test.csv','w') as testf:
        i = 0
        for line in csvf:
            if line.strip() != '':
                if i in ind_test:
                    testf.write(line.strip() + '\n')
                else:
                    trainf.write(line.strip() + '\n')
    
    因此,我假设CSV文件每行包含一个观察值

    这将创建一个精确的85:15分割。如果不太精确的分区对您来说是可以的,那么Peter Wood的解决方案将更加有效。

    使用中的函数获得
    0
    1
    之间的均匀分布随机数

    如果是
    .85
    写入训练数据,否则写入测试数据。看


    你的职位很广泛。详细说明您已经尝试过的内容。用问号明确你在问什么问题。@MartinCowie我刚学过网络搜索。到目前为止还没有尝试过任何东西。正在搜索逻辑,我想从现有文件创建两个文件
    Test.csv
    Train.csv
    来自主文件
    data.csv
    我希望85%的数据应该在
    Test.csv
    中,其余15%的数据应该在
    Train.csv
    中,为什么您希望85%的数据作为测试数据,15%作为培训数据?很可能您需要85%的数据用于培训,剩下的数据作为测试数据。您所说的“CSV数据”是什么意思?你没有在问题中提到如何存储数据,所以我只是假设
    数据
    是一系列观察结果。如果我没有提到,我很抱歉。但到目前为止,我的数据是CSV格式的,我希望对数据进行相应的采样。但无论如何,谢谢@你的CSV文件有多大?这要求它们同时都在内存中。@PeterWood CSV文件可能以GB为单位,也就是说,它可能包含一百万个或更多条目。CSV.writer没有名为“write”的对象,我想应该是writerows?hatsoff!但数据也包含标题。标题在一个文件中,不在第二个文件中。有没有办法在这两个文件中保留标题files@desmond.carros:
    csv.DictReader
    csv.DictWriter
    在这种情况下可能很有用。我也这么想@desmond.carros将其放入问题中,或询问/搜索另一个问题。
    import random
    
    with open(input_file) as data:
        with open(test_output, 'w') as test:
            with open(train_output, 'w') as train:
                header = next(data)
                test.write(header)
                train.write(header)
                for line in data:
                    if random.random() > 0.85:
                        train.write(line)
                    else:
                        test.write(line)