Поезд Тест Сплит с тем же индексом - PullRequest
0 голосов
/ 06 июля 2018

Я хочу, чтобы строки с одинаковым индексом существовали в одном наборе - либо Train, либо Test, но не оба одновременно. Как я могу сделать это в Sklearn? Например:

df = pd.DataFrame({'A': [1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 6], 'B': random.sample(range(10, 100), 12)})
df.set_index('A', inplace = True)

Я хочу достичь:

Поезд с индексами 1, 3, 5, 6 Тестовый набор с индексами 2, 4

Как я могу также обеспечить это с помощью GridSearchCV?

1 Ответ

0 голосов
/ 06 июля 2018

Установите их как 'group'. Большинство сплиттеров в sklearn поддерживают параметр с именем groups, который можно настроить так, чтобы вы делали что хотите

Пример:

Вы можете использовать GroupKFold или GroupShuffleSplit :

group_kfold = GroupKFold(n_splits=3)
for train_index, test_index in group_kfold.split(df, groups=df.index):
    print("Train", df.iloc[train_index].index)
    print("Test", df.iloc[test_index].index)

Output: 
('Train', Int64Index([1, 1, 1, 2, 2, 3, 4, 4], dtype='int64', name=u'A'))
('Test', Int64Index([5, 6, 6, 6], dtype='int64', name=u'A'))

('Train', Int64Index([2, 2, 4, 4, 5, 6, 6, 6], dtype='int64', name=u'A'))
('Test', Int64Index([1, 1, 1, 3], dtype='int64', name=u'A'))

('Train', Int64Index([1, 1, 1, 3, 5, 6, 6, 6], dtype='int64', name=u'A'))
('Test', Int64Index([2, 2, 4, 4], dtype='int64', name=u'A'))

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

...