是否有一个选项可以阻止交叉验证(和gridsearchCV)随机化数据集的行?

时间:2014-03-03 15:56:43

标签: python scikit-learn cross-validation

任何人都知道是否有办法阻止scikitlearn中的网格搜索功能gridsearchCV随机化我的数据集记录?

我有一组对应同一现象的行,我想随机化现象ID而不是整行。我设法用SQL随机化了这个现象,现在我希望gridsearchCV在分离训练和测试集中的数据集之前不要重新随机化。

我的数据集示例:

id time feature1 feature2 feature3 feature4 
A 1 b c s a
A 2 b a s t
A 3 q w o j
B 1 l o j f
B 2 9 k l h
C 1 o k h u
C 2 o k h i
C 3 p j g d
D 1 l l d s
D 2 ...
D 3 ...
D 4 ...
D 5 ...

我不希望在训练和测试数据集之间分配ID。

有没有可以帮助我的选择?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

配置一次执行更多步骤的内容很难(我不确定这是否可行) - 如果您想要以不同的方式执行某些操作,也许专门的方法gridSearchCV不适合您。所以我建议你分开这些步骤,这些步骤并不太复杂。

  1. 根据自己的喜好拆分数据以进行交叉验证,可以使用其中一种sklearn.cross_validation方法。
  2. 进行网格搜索,可能使用sklearn.gridsearch.ParamaterGrid。

答案 1 :(得分:0)

GridSearchCV有一个cv参数,它带有一个交叉验证对象;这必须是一个可迭代的,它产生一对索引数组train_index, test_index。标准KFold的行为如下:

>>> from sklearn.cross_validation import KFold
>>> threefold = KFold(n=10, n_folds=3)
>>> for train, test in threefold:
...    print("train: %r" % train)
...    print("test:  %r" % test)
...     
train: array([4, 5, 6, 7, 8, 9])
test:  array([0, 1, 2, 3])
train: array([0, 1, 2, 3, 7, 8, 9])
test:  array([4, 5, 6])
train: array([0, 1, 2, 3, 4, 5, 6])
test:  array([7, 8, 9])

所以你必须通过实现一个类

以某种方式模仿这个
class CustomCV(object):
    def __init__(self, ids, n_folds):
        """Pass an array of phenomenon ids"""
        self.ids = ids
        self.n_folds = n_folds

    def __iter__(self):
        for i in range(self.n_folds):
            train = make_a_boolean_mask_for_the_training_set()
            test = np.logical_not(train)
            yield np.where(train)[0], np.where(test)[0]

你必须自己填写make_a_boolean_mask_for_the_training_set的逻辑。如果有帮助,我在线variant for sequence data

请务必将GridSearchCV参数iid设置为False,否则会导致结果偏差。