Разделить данные на поезда, тестировать, проверять с помощью стратификации с использованием Numpy - PullRequest
0 голосов
/ 27 января 2019

Я только что видел этот ответ на SO , который показывает, как разделить данные, используя numpy.

Предположим, что мы собираемся разделить их на 0.8, 0.1, 0.1 для обучения, тестирования и проверки, соответственно, вы сделаете это следующим образом:

train, test, val = np.split(df, [int(.8 * len(df)), int(.9 * len(df))])

Мне интересно знать, как я мог бы рассмотреть расслоение при разделении данных с использованием этой методологии.

Расслоение - это разделение данных с сохранением в данных априорных значений каждого класса.То есть, если вы собираетесь взять 0.8 за тренировочный набор, вы берете 0,8 из каждого класса, который у вас есть .То же самое для теста и обучения.

Я попытался сначала сгруппировать данные по классам, используя:

grouped_df = df.groupby(class_col_name, group_keys=False)

Но это не показало правильных результатов.


Примечание: я знаком с train_test_split

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Просто используйте ваш объект groupby, grouped_df , который состоит из каждого поднастроенного фрейма данных, где вы можете запустить необходимый np.split.Затем объедините все выбранные кадры данных с pd.concat.В целом, это будет расслаивать в соответствии с вашим цитируемым сообщением:

train_list = []; test_list = [], val_list = []
grouped_df = df.groupby(class_col_name)

# ITERATE THROUGH EACH SUBSET DF
for i, g in grouped_df:
    # STRATIFY THE g (CLASS) DATA FRAME
    train, test, val = np.split(g, [int(.8 * len(g)), int(.9 * len(g))])

    train_list.append(train); test_list.append(test); val_list.append(val)

final_train = pd.concat(train_list)
final_test = pd.concat(test_list)
final_val = pd.concat(val_list)

В качестве альтернативы, сокращенная версия с использованием списочных представлений:

# LIST OF ARRAYS
arr_list = [np.split(g, [int(.8 * len(g)), int(.9 * len(g))]) for i, g in grouped_df]

final_train = pd.concat([t[0] for t in arr_list])
final_test = pd.concat([t[1] for t in arr_list])
final_val = pd.concat([v[2] for v in arr_list])
0 голосов
/ 28 января 2019

Предполагается, что вы уже выполнили стратификацию, так что в столбце «категория» указывается, к какой стратификации относится каждая запись.

from collections import namedtuple

Dataset = namedtuple('Dataset', 'train test val')

grouped = df.groupby('headline')
splitted = {x: grouped.get_group(x).sample(frac=1) for x in grouped.groups}
datasets = {k:Dataset(*np.split(df, [int(.8 * len(df)), int(.9 * len(df))])) for k, df in splitted.items()}

Здесь хранится каждое стратифицированное разделение по имени категории, назначенному в df.

Каждый элемент в наборах данных имеет именованный кортеж Dataset, так что подмножества обучения, тестирования и проверки доступны для .train, .test и .val соответственно.

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