私は私はそれが他の誰にも便利な場合に私の解決策を投稿するだろうと思った
from collections import defaultdict
import random
def strat_map(y):
"""
Returns permuted indices that maintain class
"""
smap = defaultdict(list)
for i,v in enumerate(y):
smap[v].append(i)
for values in smap.values():
random.shuffle(values)
y_map = np.zeros_like(y)
for i,v in enumerate(y):
y_map[i] = smap[v].pop()
return y_map
##########
#Example Use
##########
skf = StratifiedKFold(y, nfolds)
sm = strat_map(y)
for test, train in skf:
test,train = sm[test], sm[train]
#then cv as usual
#######
#tests#
#######
import numpy.random as rnd
for _ in range(100):
y = np.array([0]*10 + [1]*20 + [3] * 10)
rnd.shuffle(y)
sm = strat_map(y)
shuffled = y[sm]
assert (sm != range(len(y))).any() , "did not shuffle"
assert (shuffled == y).all(), "classes not in right position"
assert (set(sm) == set(range(len(y)))), "missing indices"
for _ in range(100):
nfolds = 10
skf = StratifiedKFold(y, nfolds)
sm = strat_map(y)
for test, train in skf:
assert (sm[test] != test).any(), "did not shuffle"
assert (y[sm[test]] == y[test]).all(), "classes not in right position"
私は私の質問、StratifiedShuffleSplit(に書いたように)行っていませんStratifiedKFold()のシャッフル版、つまりStratifiedKFold()より前のシャッフル版です。これはあなたの答えの最後の文でも言及されています。 KFold CVは、折り畳みの間に交差がなく、その結合がデータセット全体であることを要求します。 – Bitwise
ああ、はい、折り畳みが分離を保証されていません。あなたの質問の最後に読まないで申し訳ありません。 – rd108
あなたはあなたの答えを削除する必要があります!お願いします... – Merlin