разница между StratifiedKFold и StratifiedShuffleSplit в sklearn

Как из названия мне интересно, в чем разница между

StratifiedKFold с параметром shuffle = True

StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

и

StratifiedShuffleSplit

StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=0)

и в чем преимущество использования StratifiedShuffleSplit

2 ответов


в KFolds каждый набор тестов не должен перекрываться, даже при перетасовке. С помощью KFolds и shuffle данные перетасовываются один раз в начале, а затем делятся на количество желаемых расщеплений. Тестовые данные всегда являются одним из расколов, данные поезда-остальные.

в ShuffleSplit данные перемешиваются каждый раз, а затем разделяются. Это означает, что тестовые наборы могут перекрываться между разделениями.

посмотреть этот блок для примера разницы. Обратите внимание на дублирование элементы в тестовых наборах для ShuffleSplit.

splits = 5

tx = range(10)
ty = [0] * 5 + [1] * 5

from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold
from sklearn import datasets

kfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)
shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)

print("KFold")
for train_index, test_index in kfold.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

print("Shuffle Split")
for train_index, test_index in shufflesplit.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

выход:

KFold
TRAIN: [0 2 3 4 5 6 7 9] TEST: [1 8]
TRAIN: [0 1 2 3 5 7 8 9] TEST: [4 6]
TRAIN: [0 1 3 4 5 6 8 9] TEST: [2 7]
TRAIN: [1 2 3 4 6 7 8 9] TEST: [0 5]
TRAIN: [0 1 2 4 5 6 7 8] TEST: [3 9]
Shuffle Split
TRAIN: [8 4 1 0 6 5 7 2] TEST: [3 9]
TRAIN: [7 0 3 9 4 5 1 6] TEST: [8 2]
TRAIN: [1 2 5 6 4 8 9 0] TEST: [3 7]
TRAIN: [4 6 7 8 3 5 1 2] TEST: [9 0]
TRAIN: [7 2 6 5 4 3 0 9] TEST: [1 8]

Что касается того, когда их использовать, я, как правило, использую KFolds для любой перекрестной проверки, и я использую ShuffleSplit с разделением 2 для моего поезда/тестового набора. Но я уверен, что есть и другие варианты использования для обоих.


@Ken Syme уже имеет очень хороший ответ. Я просто хочу кое-что добавить.

  • StratifiedKFold вариант KFold. Во-первых, StratifiedKFold тасует свои данные, после чего разбивает данные на n_splits запасные части и сделал. Теперь он будет использовать каждую часть в качестве тестового набора. Обратите внимание, что он только и всегда перетасовывает данные один раз до дробления.

С shuffle = True, данные перетасовываются вашим random_state. Иначе, данные тасуется np.random (по умолчанию). Например, с n_splits = 4, и ваши данные имеют 3 класса (метки) для y (зависимая переменная). 4 тестовые наборы охватывают все данные без каких-либо накладок.

enter image description here

  • С другой стороны, StratifiedShuffleSplit вариант ShuffleSplit. Во-первых, StratifiedShuffleSplit перетасовывает ваши данные, а затем также разбивает данные на n_splits запасные части. Однако это еще не сделано. После этого шага, StratifiedShuffleSplit выбирает одну часть использовать в качестве тестового набора. Затем он повторяет тот же процесс n_splits - 1 другое время, чтобы получить n_splits - 1 другие наборы тестов. Посмотрите на рисунок ниже, с теми же данными, но на этот раз 4 набора тестов не охватывают все данные, i.e между тестовыми наборами есть перекрытия.

enter image description here

Итак, разница здесь в том, что StratifiedKFold просто перемешивает и разбивает один раз, поэтому тест наборы не пересекаются, а StratifiedShuffleSplit тасует каждый время до расщепления, и оно расщепляется n_splits раз, тестовые наборы могут перекрываться.

  • Примечание: два метода используют "стратифицированную складку" (поэтому "стратифицированная" появляется в обоих именах). Это означает, что каждая часть сохраняет тот же процент образцов каждого класса (метки), что и исходные данные. Вы можете прочитать больше на документы cross_validation