保证所有折数都不同的sklearn.model_selection.ShuffleSplit
的等效功能是什么?
虽然KFold
保证测试索引不会重叠,但它会强制测试号之间没有关系。重复模型评估的时间和用于测试集的样本百分比(即n_splits
和test_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_score
或GridSearchCV
中使用此KFold
。>>