任何人都知道是否有办法阻止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。
有没有可以帮助我的选择?
感谢您的帮助。
答案 0 :(得分:0)
配置一次执行更多步骤的内容很难(我不确定这是否可行) - 如果您想要以不同的方式执行某些操作,也许专门的方法gridSearchCV不适合您。所以我建议你分开这些步骤,这些步骤并不太复杂。
答案 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
,否则会导致结果偏差。