在sklearn(python 2.7)中创建具有分组约束的训练,测试和交叉验证数据集?

问题描述 投票:3回答:2

虽然在Python中创建训练,测试和交叉验证示例,但我看到默认方法为-:

1。跳过标题后读取数据集2.创建训练,测试和交叉验证样本

 import csv
 with open('C:/Users/Train/Trainl.csv', 'r') as f1:
     next(f1)
     reader = csv.reader(f1, delimiter=',')
     input_set = []   
     for row in reader:
         input_set.append(row)

import numpy as np 
from numpy import genfromtxt
from sklearn import cross_validation
train, intermediate_set = cross_validation.train_test_split(input_set, train_size=0.6, test_size=0.4)
cv, test = cross_validation.train_test_split(intermediate_set, train_size=0.5, test_size=0.5)

不过,我的问题是,我读入numpy数组的csv文件中有一个字段说“ A”,并且所有采样都应遵循该字段。也就是说,所有具有“ A”的相似值的条目都应放在一个样本中。

Line #|A | B | C | D 
1     |1 | 
2     |1 |
3     |1 |
4     |1 |
5     |2 |
6     |2 |
7     |2 |

Required:行1,2,3,4应该放在“一个”样本中,而5,6,7应该放在“一个”样本中。A列的值是唯一的ID,对应于一个单一实体(可以看作是一个SINGLE用户的横截面数据点,因此必须输入一个唯一的train,test或cv样本), 并且有很多这样的实体,因此需要按实体ID进行分组。

B,C,D列可以具有任何值,,但不需要对其进行分组保留。 (奖金:我可以将多个字段的采样分组吗?)

我尝试过的事情:

A。 查找A的所有唯一值-将其表示为我的样本,我现在将样本分配到st火车,中间&cv&test->然后将其余的行用于此“ A”值这些文件。也就是说,如果火车的条目为“ 3”,测试的结果为“ 2”,cv的值为“ 1”,则所有A值为3的行都将进入火车,所有2的行都将进入测试,而所有1的行都将进入cv。] >

  1. 当然,这种方法不可扩展。
  2. 而且我怀疑,它可能在数据集中引入了偏差,因为A列中的1的数目,2的数目等不相等,这意味着这种方法行不通!
  3. B。我还根据这里的线程Numpy: How to split/partition a dataset (array) into training and test datasets for, e.g., cross validation?尝试了numpy.random.shuffle或numpy.random.permutation

,但它不符合我的要求。

C。课程的第三个选项是编写自定义函数

,该操作将进行分组,然后根据每个组中数据点的数量来平衡训练,测试和简历数据集。但是,只是想知道,是否已经有一种有效的方法来实现这一目标?

请注意,我的数据集非常庞大,因此理想情况下,我希望采用确定性的方式对数据集进行分区,而无需进行多次眼球扫描以确保分区正确。

编辑第2部分:

因为我没有找到符合我的采样标准的任何东西-我实际上写了一个模块来进行分组约束采样。

这是它的github代码。该代码并不是为大数据编写的,因此效率不是很高。您应该分叉此代码吗?请指出如何改善运行时间。https://github.com/ekta1007/Sampling-techniques/blob/master/sample_expedia.py

[在Python中创建训练,测试和交叉验证示例时,我看到默认方法为-:1.跳过标题后,读取数据集2.创建训练,测试和交叉验证...

python-2.7 numpy machine-learning data-mining scikit-learn
2个回答
2
投票
通过强制此类约束,您

将引入偏见


0
投票
我也面临类似的问题,尽管我的编码不太好,但我提出了以下解决方案:
© www.soinside.com 2019 - 2024. All rights reserved.