Пройдя некоторое чтение и принимая во внимание (много ..) различные способы разделения данных для обучения и тестирования, я решил рассчитать время!
Я использовал 4 разных метода (ни один из них не используетбиблиотека sklearn, которая, я уверен, даст лучшие результаты, при условии, что она хорошо спроектирована и протестирована с кодом):
- перемешивает всю матрицу arr, а затем разделяет данные для обучения и тестирования
- перетасовать индексы и затем присвоить им x и y для разделения данных
- так же, как в методе 2, но более эффективным способом сделать это
- с использованием pandas dataframe для разделения
метод 3, безусловно, выиграл с наименьшим временем после этого метода 1, а метод 2 и 4 оказался действительно неэффективным.
Код для 4 различных методов, которые я рассчитал:
import numpy as np
arr = np.random.rand(100, 3)
X = arr[:,:2]
Y = arr[:,2]
spl = 0.7
N = len(arr)
sample = int(spl*N)
#%% Method 1: shuffle the whole matrix arr and then split
np.random.shuffle(arr)
x_train, x_test, y_train, y_test = X[:sample,:], X[sample:, :], Y[:sample, ], Y[sample:,]
#%% Method 2: shuffle the indecies and then shuffle and apply to X and Y
train_idx = np.random.choice(N, sample)
Xtrain = X[train_idx]
Ytrain = Y[train_idx]
test_idx = [idx for idx in range(N) if idx not in train_idx]
Xtest = X[test_idx]
Ytest = Y[test_idx]
#%% Method 3: shuffle indicies without a for loop
idx = np.random.permutation(arr.shape[0]) # can also use random.shuffle
train_idx, test_idx = idx[:sample], idx[sample:]
x_train, x_test, y_train, y_test = X[train_idx,:], X[test_idx,:], Y[train_idx,], Y[test_idx,]
#%% Method 4: using pandas dataframe to split
import pandas as pd
df = pd.read_csv(file_path, header=None) # Some csv file (I used some file with 3 columns)
train = df.sample(frac=0.7, random_state=200)
test = df.drop(train.index)
И для этого времени минимальное время выполнения из 3 повторений по 1000 циклов:
- Метод 1: 0,35883826200006297 секунд
- Метод 2: 1,7157016959999964 секунд
- Метод 3: 1,786616719995582 секунд
- Метод 4: 0,07562861499991413 секунд
10Я надеюсь, что это полезно!