Каков хороший способ случайным образом разбить массив NumPy на набор данных для обучения и тестирования / проверки? Что-то похожее на функции cvpartition
or crossvalind
в Matlab.
99
Каков хороший способ случайным образом разбить массив NumPy на набор данных для обучения и тестирования / проверки? Что-то похожее на функции cvpartition
or crossvalind
в Matlab.
Если вы хотите разделить набор данных один раз на две половины, вы можете использовать numpy.random.shuffle
, или numpy.random.permutation
если вам нужно отслеживать индексы:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
или
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Есть много способов многократно разбивать один и тот же набор данных для перекрестной проверки . Одна из стратегий - повторная выборка из набора данных с повторением:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Наконец, sklearn содержит несколько методов перекрестной проверки (k-fold, leave-n-out, ...). Он также включает более продвинутые методы «стратифицированной выборки», которые создают раздел данных, сбалансированный по некоторым характеристикам, например, чтобы убедиться, что в обучающем и тестовом наборе есть одинаковая пропорция положительных и отрицательных примеров.
Есть еще один вариант, который подразумевает использование scikit-learn. Как описано в wiki scikit , вы можете просто использовать следующие инструкции:
Таким образом, вы можете синхронизировать метки для данных, которые вы пытаетесь разделить на обучение и тестирование.
источник
Просто примечание. Если вам нужны наборы для обучения, тестирования и проверки И, вы можете сделать это:
Эти параметры дают 70% на обучение и по 15% на наборы для тестирования и проверки. Надеюсь это поможет.
источник
from sklearn.cross_validation import train_test_split
чтобы было понятно, какой модуль вы используетеa=0.7
,b=0.15
,c=0.15
, иd = dataset
,N=len(dataset)
, а затемx_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
иx_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Поскольку
sklearn.cross_validation
модуль устарел, вы можете использовать:источник
Вы также можете рассмотреть возможность стратифицированного разделения на набор для обучения и тестирования. Startified Division также генерирует набор для обучения и тестирования случайным образом, но таким образом, чтобы сохранялись исходные пропорции класса. Благодаря этому наборы для обучения и тестирования лучше отражают свойства исходного набора данных.
Этот код выводит:
источник
value_inds
это действительно индексы, но на выходе получаются не индексы, а только маски.Для этого я написал функцию для своего собственного проекта (хотя он не использует numpy):
Если вы хотите, чтобы фрагменты были рандомизированы, просто перемешайте список перед его передачей.
источник
Вот код для разделения данных на n = 5 слоев стратифицированным способом.
источник
Спасибо pberkes за ваш ответ. Я просто изменил его, чтобы избежать (1) замены, в то время как выборка (2) повторяющихся экземпляров происходила как при обучении, так и при тестировании:
источник
Прочитав и приняв во внимание (многие ..) различные способы разделения данных для обучения и тестирования, я решил рассчитать время!
Я использовал 4 разных метода (ни один из них не использует библиотеку sklearn, что, я уверен, даст наилучшие результаты, учитывая, что это хорошо спроектированный и протестированный код):
метод 3 победил за кратчайшее время, после этого метод 1, а методы 2 и 4 оказались действительно неэффективными.
Код для 4 различных методов, которые я рассчитал:
А в некоторых случаях минимальное время для выполнения из 3 повторений 1000 циклов составляет:
Надеюсь, это поможет!
источник
Вероятно, вам потребуется не только разделить на обучение и тестирование, но и перекрестную проверку, чтобы убедиться, что ваша модель обобщает. Здесь я предполагаю 70% данных обучения, 20% данных проверки и 10% данных удержания / тестирования.
Проверьте np.split :
источник
Разделить на тестовый поезд и действительный
источник