scikit中的ShuffleSplit等效项

问题描述 投票:1回答:1

保证所有折数都不同的sklearn.model_selection.ShuffleSplit的等效功能是什么?

python scikit-learn sampling
1个回答
0
投票

虽然KFold保证测试索引不会重叠,但它会强制测试号之间没有关系。重复模型评估的时间和用于测试集的样本百分比(即n_splitstest_size)。因此,如果您想使用10%的数据进行测试,则必须训练和评估模型10次-例如,您不能重复3次,也许可以节省时间。

要结合两全其美,一个可能的解决方案是将sklearn的KFold子类化。

import itertools
class DSS(KFold):
    def __init__(self, n_repeat=5,test_size=.25, *, shuffle=True,
                 random_state=None):
        super().__init__(n_splits=int(1/test_size), shuffle=shuffle, 
                         random_state=random_state)
        self.n_repeat = n_repeat  

    def split(self, X, y=None, groups=None):
        gen_idx = super().split(X,y,groups)
        return itertools.islice(gen_idx,self.n_repeat) #Only keep first few index arrays

使用虹膜数据集的示例用法:

cv = DSS(n_repeat=3,test_size=.1,shuffle=True)
for _,test_idx in cv.split(X,y): 
    print(test_idx )

哪个输出:

[ 18  20  25  27  48  50  67  95 110 113 124 125 137 145 147]
[ 29  36  56  58  60  63  68  77 100 106 117 121 129 134 141]
[  4  28  40  42  76  86  90  94  98 102 115 139 142 143 144]

您当然可以像普通的cv一样在cross_val_scoreGridSearchCV中使用此KFold。>>

© www.soinside.com 2019 - 2024. All rights reserved.