У меня есть довольно большой набор данных в виде фрейма данных, и мне было интересно, как я смогу разделить фрейм данных на две случайные выборки (80% и 20%) для обучения и тестирования.
Спасибо!
python
python-2.7
pandas
dataframe
tooty44
источник
источник
msk
имеет DTYPEbool
,df[msk]
,df.iloc[msk]
иdf.loc[msk]
всегда возвращают один и тот же результат.rand
чтобы< 0.8
иметь смысл, потому что он возвращает равномерно распределенные случайные числа между 0 и 1.in[12]
,in[13]
,in[14]
? Я хочу понять сам код Python здесьnp.random.rand(len(df))
- это массив размеровlen(df)
со случайно и равномерно распределенными значениями с плавающей точкой в диапазоне [0, 1].< 0.8
Применяется сравнение поэлементно и сохраняет результат на месте. Таким образом, значения <0,8 становятся,True
а значения> = 0,8 становятсяFalse
Scikit Learn's
train_test_split
это хороший.источник
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
см полный пример здесь: quantstart.com/articles/...from sklearn.model_selection import train_test_split
вместо.from sklearn.cross_validation import train_test_split
Панда случайная выборка также будет работать
источник
random_state
делает арг?test
набор, как указано здесь stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
Я бы использовал собственный обучающий тест scikit-learn и сгенерировал бы его из индекса
источник
cross_validation
Модуль теперь осуждается:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Есть много способов создать поезд / тест и даже проверочные образцы.
Случай 1: классический способ
train_test_split
без каких-либо опций:Случай 2: случай очень маленьких наборов данных (<500 строк): чтобы получить результаты для всех ваших строк с помощью этой перекрестной проверки. В конце у вас будет один прогноз для каждой строки вашего доступного учебного набора.
Случай 3a: Несбалансированные наборы данных для целей классификации. Следуя случаю 1, вот эквивалентное решение:
Случай 3b: Несбалансированные наборы данных для целей классификации. Следуя случаю 2, вот эквивалентное решение:
Случай 4: вам нужно создать наборы поездов / тестов / проверок больших данных для настройки гиперпараметров (60% поезд, 20% тест и 20% вал).
источник
Вы можете использовать приведенный ниже код для создания тестовых и обучающих образцов:
Размер теста может варьироваться в зависимости от процента данных, которые вы хотите поместить в свой набор данных теста и обучения.
источник
Есть много действительных ответов. Добавляем еще один в кучу. из sklearn.cross_validation import train_test_split
источник
Вы также можете рассмотреть разделение на учебно-испытательный комплекс. Подразделение Startered также генерирует наборы для обучения и тестирования случайным образом, но таким образом, что сохраняются исходные пропорции классов. Это позволяет обучающим и тестовым наборам лучше отражать свойства исходного набора данных.
df [train_inds] и df [test_inds] дают вам наборы для обучения и тестирования вашего оригинального df.
источник
Если вам нужно разделить данные по столбцу меток в вашем наборе данных, вы можете использовать это:
и использовать это:
вы также можете передать random_state, если вы хотите контролировать случайную разбивку или использовать глобальное случайное начальное число.
источник
источник
Вы можете использовать ~ (оператор тильды), чтобы исключить строки, выбранные с помощью df.sample (), позволяя только пандам обрабатывать выборку и фильтрацию индексов, чтобы получить два набора.
источник
Это то, что я написал, когда мне нужно было разделить DataFrame. Я рассмотрел использование подхода Энди выше, но мне не понравилось, что я не мог точно контролировать размер наборов данных (т. Е. Иногда это будет 79, иногда 81 и т. Д.).
источник
Просто выберите строку диапазона из DF, как это
источник
df
фрагмент кода (или должен быть) перемешан, это улучшит ответ.Выше приведено много отличных ответов, поэтому я просто хочу добавить еще один пример на тот случай, если вы хотите указать точное количество образцов для набора поездов и тестов, используя только
numpy
библиотеку.источник
Чтобы разделить более чем на два класса, таких как тренировка, тестирование и валидация, можно сделать:
Это даст примерно 70% данных для обучения, 15% для тестирования и 15% для проверки.
источник
вам нужно преобразовать pandas dataframe в массив numpy, а затем преобразовать массив numpy обратно в массив данных
источник
Если вы хотите иметь один и два фрейма данных (а не пустые массивы), это должно сработать:
источник
Вы можете использовать функцию df.as_matrix (), создать Numpy-массив и передать его.
источник
Немного более элегантно на мой вкус - создать случайный столбец, а затем разделить его, таким образом, мы можем получить разделение, которое будет соответствовать нашим потребностям и будет случайным.
источник
источник
Не нужно конвертировать в NumPy. Просто используйте pandas df для разделения, и он вернет pandas df.
И если вы хотите разделить х от у
источник
Я думаю, вам также нужно получить копию, а не фрагмент данных, если вы хотите добавить столбцы позже.
источник
Как насчет этого? DF - мой фрейм данных
источник