разница между 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 тестовые наборы охватывают все данные без каких-либо накладок.
- С другой стороны,
StratifiedShuffleSplit
вариантShuffleSplit
. Во-первых,StratifiedShuffleSplit
перетасовывает ваши данные, а затем также разбивает данные наn_splits
запасные части. Однако это еще не сделано. После этого шага,StratifiedShuffleSplit
выбирает одну часть использовать в качестве тестового набора. Затем он повторяет тот же процессn_splits - 1
другое время, чтобы получитьn_splits - 1
другие наборы тестов. Посмотрите на рисунок ниже, с теми же данными, но на этот раз 4 набора тестов не охватывают все данные, i.e между тестовыми наборами есть перекрытия.
Итак, разница здесь в том, что StratifiedKFold
просто перемешивает и разбивает один раз, поэтому тест наборы не пересекаются, а StratifiedShuffleSplit
тасует каждый время до расщепления, и оно расщепляется n_splits
раз, тестовые наборы могут перекрываться.
- Примечание: два метода используют "стратифицированную складку" (поэтому "стратифицированная" появляется в обоих именах). Это означает, что каждая часть сохраняет тот же процент образцов каждого класса (метки), что и исходные данные. Вы можете прочитать больше на документы cross_validation