Случайная выборка без замены при сохранении естественного порядка табличных данных - PullRequest
1 голос
/ 09 апреля 2020

У меня есть данные временных рядов, которые не монотонно увеличиваются, поэтому вопрос сортировки / перемешивания исключен.

Я хочу произвольно вытащить n% данных, сохраняя их относительный порядок, в качестве набора для проверки или проверки, который можно отобразить как:

my_ndarray = [ 1, 20, 10, 3, 90, 5, 80, 50, 4, 1] # (number of samples = 1645, number of timesteps = 10, number of features = 7)
# custom_train_test_split()
train = [1, 20, 90, 5, 50, 4, 1]
valid = [10, 3, 80]

Буду признателен некоторые рекомендации о том, как сделать это эффективно. Насколько я понимаю, итерация в стиле Java неэффективна в Python. Я подозреваю, что трехмерная логическая таблица mask будет питоном c и векторизованным способом.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вот как может выглядеть решение:

  • Добавить временное дополнительное измерение в массив, в которое вы добавляете индексы для каждого элемента в массиве.
  • Перемешать массив.
  • Возьмите нужные части массива, затем отсортируйте каждую из них по размеру.
  • Удалите временное измерение из выбранных частей.

Здесь это решение с использованием простых Python списков:

my_ndarray = [ 1, 20, 10, 3, 90, 5, 80, 50, 4, 1] 
# Add temporary dimension by converting each item 
# to a sublist, where the index is the first element of each sublist
nda=[[i,my_ndarray[i]] for i in len(my_ndarray)]
np.random.shuffle(nda)
# Training data is the first 7 items
traindata=nda[0:7]
traindata.sort()
traindata=[x[1] for x in traindata]
# Test data is the rest
testdata=nda[7:10]
testdata.sort()
testdata=[x[1] for x in testdata]
0 голосов
/ 09 апреля 2020

Это работает. Я установил test_size=0.4 так, чтобы 40% строк были в test_df. Предполагается, что ваш фрейм данных имеет все столбцы объектов слева и столбец ответов справа.

x = df[features_columns_names_list]
y = df[response_column_name]

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.4)

train_df = pd.concat([X_train, y_train], axis=1).sort_index(axis = 0)
test_df = pd.concat([X_test, y_test], axis=1).sort_index(axis = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...