Как нарезать массив, чтобы исключить одну строку? - PullRequest
1 голос
/ 25 марта 2019

В рамках перекрестной проверки необходимо разбить массив поездов на N сгибов. А затем для каждого раза запустить эксперимент. Последнее означает, что мне нужно объединить N-1 сгибы в один массив и использовать оставшиеся сгибы для проверки.

Предполагая, что у меня есть двоичный_трейн_X в качестве исходного массива и я хочу разбить его на 5 сгибов. Я получил код, который работает:

num_folds = 5
train_folds_X = []

# Split the training data in folds
step = int(binary_train_X.shape[0] / num_folds)
for i in range(num_folds):
    train_folds_X.append(binary_train_X[i*step:(i+1)*step])

# Prepare train and test arrays
for i in range(num_folds):
    if i == 0:
        train_temp_X = np.concatenate((train_folds_X[1:]))
    elif i == num_folds - 1:
        train_temp_X = np.concatenate((train_folds_X[0:(num_folds - 1)]))
    else:
        train_temp_X1 = np.concatenate((train_folds_X[0:i]))
        train_temp_X2 = np.concatenate((train_folds_X[(i+1):(num_folds)]))
        train_temp_X = np.concatenate((train_temp_X1, train_temp_X2))
    test_temp_X = train_folds_X[i]

    # Run classifier based on train_temp_X and test_temp_X
    ...
    pass

Вопрос - как это сделать более элегантно?

1 Ответ

2 голосов
/ 25 марта 2019

Почему бы не сделать это вместо этого:

splits = np.array_split(binary_train_X, num_folds)

for i in range(num_folds):
    fold_train_X = np.concatenate([*splits[:i], *splits[i + 1:]])
    fold_test_X = splits[i]
    # use your folds here

Если вы хотите использовать готовое решение, вы можете использовать sklearn.model_selection.KFold:

kf = KFold(num_folds)

for train_index, test_index in kf.split(binary_train_X):
    fold_train_X = binary_train_X[train_index]
    fold_test_X = binary_test_X[train_index]
    # use your folds here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...