Scikit-learn, GroupKFold с перетасовкой групп?

Я использовал StratifiedKFold из scikit-learn, но теперь мне нужно следить и за «группами». Есть хорошая функция GroupKFold, но мои данные очень зависят от времени. Так же, как и в справке, т.е. номер недели является индексом группировки. Но каждую неделю следует только в один раз.

Допустим, мне нужно 10 раз. Что мне нужно, так это сначала перетасовать данные, прежде чем я смогу использовать GroupKFold.

Перетасовка в групповом смысле, поэтому целые группы должны перетасовываться друг с другом.

Есть ли способ сделать это с помощью scikit-learn? Мне кажется, что GroupKFold надежен в первую очередь для перетасовки данных.

Если нет возможности сделать это с помощью scikit, может ли кто-нибудь написать какой-нибудь эффективный код? У меня есть большие наборы данных.

матрица, метка, группы в качестве входных данных


person gugatr0n1c    schedule 26.11.2016    source источник


Ответы (2)


РЕДАКТИРОВАТЬ: это решение не работает.

Я думаю, используя sklearn. utils.shuffle — элегантное решение!

Для данных в X, y и группах:

from sklearn.utils import shuffle
X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=0)

Затем используйте X_shuffled, y_shuffled и groups_shuffled с GroupKFold:

from sklearn.model_selection import GroupKFold
group_k_fold = GroupKFold(n_splits=10)
splits = group_k_fold.split(X_shuffled, y_shuffled, groups_shuffled)

Конечно, вы, вероятно, захотите перетасовать несколько раз и выполнять перекрестную проверку при каждом перемешивании. Вы можете поместить все это в цикл - вот полный пример с 5 тасованиями (и только 3 разделения вместо необходимых 10):

X = np.arange(20).reshape((10, 2))
y = np.arange(10)
groups = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7]

n_shuffles = 5
group_k_fold = GroupKFold(n_splits=3)

for i in range(n_shuffles):
    X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=i)
    splits = group_k_fold.split(X_shuffled, y_shuffled, groups_shuffled)
    # do something with splits here, I'm just printing them out
    print 'Shuffle', i
    print 'groups_shuffled:', groups_shuffled
    for train_idx, val_idx in splits:
        print 'Train:', train_idx
        print 'Val:', val_idx
person Melissa    schedule 03.01.2017
comment
К сожалению, эта стратегия, похоже, не работает. См. stackoverflow.com/q/41859613/1551810, где показано, что он просто переставляет элементы каждой складки, но он не дает новых расколов! - person kadee; 15.10.2018

Одна и та же группа не будет отображаться в двух разных сгибах (количество отдельных групп должно быть как минимум равно количеству сгибов)

В GroupKfold форма группы такая же, как форма данных.

Для данных в X, y и группах:

import numpy as np
import pandas as pd
from sklearn.model_selection import GroupKFold
from sklearn.model_selection import GridSearchCV
from xgboost import XGBClassifier
import datetime

X = np.array([[1,2,1,1], [3,4,7,8], [5,6,1,3], [7,8,4,7]])
y=np.array([0,2,1,2])
groups=np.array([2,1,0,1])  
group_kfold = GroupKFold(n_splits=len(groups.unique))
group_kfold.get_n_splits(X, y, groups)

 param_grid ={
        'min_child_weight': [50,100],
        'subsample': [0.1,0.2],
        'colsample_bytree': [0.1,0.2],
        'max_depth': [2,3],
        'learning_rate': [0.01],
        'n_estimators': [100,500],
        'reg_lambda': [0.1,0.2]        
        }

xgb = XGBClassifier()

grid_search = GridSearchCV(xgb, param_grid, cv=group_kfold.split(X, Y, groups), n_jobs=-1)

result = grid_search.fit(X,Y)
person Mukul Gupta    schedule 03.02.2020