Python Scikit - Learn: перекрестная проверка с многоиндексностью - PullRequest
0 голосов
/ 03 декабря 2018

Привет, я хочу использовать одну из функций scikit learn для перекрестной проверки.Я хочу, чтобы расщепление складок определялось одним из индексов.Например, допустим, у меня есть эти данные с индексами «месяц» и «день»:

Month    Day   Feature_1 
January   1      10
          2      20
February  1      30 
          2      40 
March     1      50 
          2      60 
          3      70 
April     1      80 
          2      90 

Допустим, я хочу иметь 1/4 данных в качестве набора тестов для каждой проверки.Я хочу, чтобы разделение фолдов было выполнено по первому индексу - месяцу.В этом случае тестовый набор будет одним из месяцев, а оставшиеся 3 месяца будут тренировочным набором.В качестве примера один из разделений поезда и теста будет выглядеть так:

TEST SET:
Month    Day   Feature_1 
January   1      10
          2      20

TRAINING SET:
Month    Day   Feature_1 
February  1      30 
          2      40 
March     1      50 
          2      60 
          3      70 
April     1      80 
          2      90 

Как я могу это сделать.Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Это называется разделением по группам.Ознакомьтесь с руководством пользователя в scikit-Learn здесь, чтобы узнать больше об этом :

...

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

...

Вы можете использовать GroupKFold или другие стратегии, в названии которых есть группа.Примером может быть

# I am not sure about this exact command, 
# but after this, you should have individual columns for each index
df = df.reset_index()  

print(df)
Month     Day    Feature_1
January    1           10
January    2           20
February   1           30
February   2           40
March      1           50
March      2           60
March      3           70

groups = df['Month']

from sklearn.model_selection import GroupKFold

gkf = GroupKFold(n_splits=3)
for train, test in gkf.split(X, y, groups=groups):
    # Here "train", "test" are indices of location, 
    # you need to use "iloc" to get actual values
    print("%s %s" % (train, test))  

    print(df.iloc[train, :])
    print(df.iloc[test, :])  

Обновление : чтобы передать это в методы перекрестной проверки, просто передайте данные месяцев в параметр groups в них.Как ниже:

gkf = GroupKFold(n_splits=3)
y_pred = cross_val_predict(estimator, X_train, y_train, cv=gkf, groups=df['Month'])
0 голосов
/ 03 декабря 2018

Использование -

indices = df.index.levels[0]

train_indices = np.random.choice(indices,size=int(len(indices)*0.75), replace=False)
test_indices = np.setdiff1d(indices, train_indices)

train = df[np.in1d(df.index.get_level_values(0), train_indices)]
test = df[np.in1d(df.index.get_level_values(0), test_indices)]

Выход

Поезд

              Feature_1
Month    Day           
January  1           10
         2           20
February 1           30
         2           40
March    1           50
         2           60
         3           70

Тест

           Feature_1
Month Day           
April 1           80
      2           90

Пояснение

indices = df.index.levels[0] берет все уникальные из level=0 индекса - Index(['April', 'February', 'January', 'March'], dtype='object', name='Month')

train_indices = np.random.choice(indices,size=int(len(indices)*0.75), replace=False) выборки 75%из индексов, выбранных на предыдущем шаге

Далее мы получаем оставшиеся индексы равными test_indices

Наконец мы разбиваем поезд и тестируем соответственно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...