K-Fold Cross валидация - сохранить сгибы для разных моделей - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь обучить свои модели и проверить их, используя перекрестную проверку Склеарна. Я хочу использовать одинаковые сгибы во всех моих моделях (которые будут выполняться из разных скриптов Python).

Как я могу это сделать? Должен ли я сохранить их в файл? или я должен сохранить модель kfold? или я должен использовать то же семя?

kfold = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)

1 Ответ

0 голосов
/ 24 января 2019

Что ж, самый простой способ, который я нашел, чтобы спасти складки, это просто получить их из метода многослойного расщепления по складкам, зацикливая его. Затем сохраняем его в файл json:

kfold = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)
folds = {}
count = 1
for train, test in kfold.split(np.zeros(len(y)), y.argmax(1)):
    folds['fold_{}'.format(count)] = {}
    folds['fold_{}'.format(count)]['train'] = train.tolist()
    folds['fold_{}'.format(count)]['test'] = test.tolist()
    count += 1
print(len(folds) == n_splits)#assert we have the same number of splits
#dump folds to json
import json
with open('folds.json', 'w') as fp:
    json.dump(folds, fp)

Примечание 1 : Argmax здесь используется, потому что мои значения y являются одной горячей переменной, поэтому нам нужно получить класс, который является прогнозируемой / истинной.

Теперь, чтобы загрузить его из любого другого скрипта:

#load to dict to be used
with open('folds.json') as f:
    kfolds = json.load(f)

Отсюда мы можем легко перебрать элементы в dict:

for key, val in kfolds.items():
    print(key)
    train = val['train']
    test = val['test']

Наш файл json выглядит так:

{"fold_1": {"train": [193, 2405, 2895, 565, 1215, 274, 2839, 1735, 2536, 1196, 40, 2541, 980,...SNIP...830, 1032], "test": [1, 5, 6, 7, 10, 15, 20, 26, 37, 45, 52, 54, 55, 59, 60, 64, 65, 68, 74, 76, 78, 90, 100, 106, 107, 113, 122, 124, 132, 135, 141, 146,...SNIP...]}
...